当前位置:首页 > 技术文章 > 正文内容

Spring Cloud笔记02: 在k8s集群中部署Nacos集群

arlanguage3个月前 (01-31)技术文章26

上一节学习了Nacos的基本概念,Nacos是一个用于构建云原生应用的动态服务发现、配置管理和服务管理平台。

在学习如何使用Nacos之前,需要先完成Nacos的部署,Nacos支持多种不同的部署模式,虽然我们这里是以学习为目的的。 但既然Nacos是用于帮助我们构建云原生应用的,那么我们今天就一步到位,在K8S集群上部署一套生产可用的Nacos集群。

Nacos的部署模式

Nacos支持三种部署模式:

  • 单机模式: 用于测试和单机使用
  • 集群模式: 用于生产环境,确保高可用
  • 多集群模式: 用于多数据中心场景

我们本节的目标是在K8S集群上部署一套生产可用的Nacos集群,属于第二种集群部署模式。

nacos-k8s项目

https://github.com/nacos-group/nacos-k8s项目是Nacos官方项目。 该项目包含了一个可构建的Nacos Docker Image,提供并支持以k8s manifest yaml file, Helm Chart, Operator三种方式在K8S上部署Nacos。 部署的Nacos集群在K8S中以StatefulSet存在。

nacos-k8s当前对于以k8s manifest yaml file方式部署提供了以下4个yaml文件(https://github.com/nacos-group/nacos-k8s/tree/master/deploy/nacos):

  • nacos-no-pvc-ingress.yaml
  • nacos-pvc-ceph.yaml
  • nacos-pvc-nfs.yaml
  • nacos-quick-start.yaml

这里选择MySQL作为Nacos的数据库,上面4个yaml文件选择使用的是nacos-no-pvc-ingress.yaml

在k8s集群中部署Nacos

首先进行准备工作,在MySQL数据库提前创建好nacos的数据库和用户,使用https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql这个SQL文件创建好nacos数据库的表结构和初始化数据。

接下来编辑nacos-no-pvc-ingress.yaml,针对我们的部署环境做定制化配置,主要有以下几个方面:

  • 定制各个k8s资源部署的k8s namespace (nacos-no-pvc-ingress.yaml中默认的是default namespace)
  • 修改nacos-cm这个ConfigMap中关于MySQL的地址、端口、数据库名、用户名、密码等信息
  • 修改nacos这个StatefulSet中的Nacos镜像的版本,例如部署最新的2.0.4版本。建议将nacos/nacos-server:v2.0.4镜像缓存到本地的私有镜像库例如harbor.youcomany.com/library/nacos/nacos-server:v2.0.4
  • 以StatefulSet部署的nacos集群的各个节点之间是使用headless service进行通信的,如果前面定制了个k8s namespace,注意调整SatefulSet Pod模板中的NACOS_SERVERS环境变量的值。
  • nacos-no-pvc-ingress.yaml中使用了Ingress将nacos的Web控制后台暴露到K8S集群外部,但当前它的Ingress使用的apiVersion: extensions/v1beta1,如果你的K8S版本比较新的话,需要修改Ingress的配置,使其满足apiVersion: networking.k8s.io/v1

以下是本文对nacos-no-pvc-ingress.yaml定制配置的例子,这个例子将nacos集群部署到了k8s的nacos namespace中:

###使用自建数据库;使用Ingress发布配置后台###
---
apiVersion: v1
kind: Service
metadata:
  name: nacos-headless
  namespace: nacos
  labels:
    app: nacos-headless
spec:
  type: ClusterIP
  clusterIP: None
  ports:
    - port: 8848
      name: server
      targetPort: 8848
    - port: 9848
      name: client-rpc
      targetPort: 9848
    - port: 9849
      name: raft-rpc
      targetPort: 9849
      ## 兼容1.4.x版本的选举端口
    - port: 7848
      name: old-raft-rpc
      targetPort: 7848
  selector:
    app: nacos
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-cm
  namespace: nacos
data:
  mysql.host: "192.168.100.21"
  mysql.db.name: "nacos"
  mysql.port: "3306"
  mysql.user: "nacos"
  mysql.password: "nacospass"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
  namespace: nacos
spec:
  serviceName: nacos-headless
  replicas: 3
  template:
    metadata:
      labels:
        app: nacos
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - nacos
              topologyKey: "kubernetes.io/hostname"
      imagePullSecrets: 
        - name: regsecret
      containers:
        - name: k8snacos
          imagePullPolicy: IfNotPresent
          image: harbor.youcomany.com/library/nacos/nacos-server:v2.0.4
          resources:
            requests:
              memory: "2Gi"
              cpu: "500m"
          ports:
            - containerPort: 8848
              name: client
            - containerPort: 9848
              name: client-rpc
            - containerPort: 9849
              name: raft-rpc
            - containerPort: 7848
              name: old-raft-rpc
          env:
            - name: NACOS_REPLICAS
              value: "3"
            - name: MYSQL_SERVICE_HOST
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.host
            - name: MYSQL_SERVICE_DB_NAME
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.db.name
            - name: MYSQL_SERVICE_PORT
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.port
            - name: MYSQL_SERVICE_USER
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.user
            - name: MYSQL_SERVICE_PASSWORD
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.password
            - name: MODE
              value: "cluster"
            - name: NACOS_SERVER_PORT
              value: "8848"
            - name: PREFER_HOST_MODE
              value: "hostname"
            - name: NACOS_SERVERS
              value: "nacos-0.nacos-headless.nacos.svc.cluster.local:8848 nacos-1.nacos-headless.nacos.svc.cluster.local:8848 nacos-2.nacos-headless.nacos.svc.cluster.local:8848"
  selector:
    matchLabels:
      app: nacos




---
# ------------------- App Ingress ------------------- #
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nacos-headless
  namespace: nacos
spec:
  rules:
  - host: nacos.youcomany.com
    http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: nacos-headless
            port:
              number: 8848

部署成功后,查看nacos在k8s中各个资源的状态:

kubectl get service,configmap,ingress,statefulset,pod -n nacos | grep nacos
service/nacos-headless             ClusterIP      None                     8848/TCP,9848/TCP,9849/TCP,7848/TCP   2h
configmap/nacos-cm                              5      2h
ingress.networking.k8s.io/nacos-headless          nginx   nacos.youcomany.com                    80, 443      2h
statefulset.apps/nacos                 3/3     2h
pod/nacos-0                                  1/1     Running   0              2h
pod/nacos-1                                  1/1     Running   0              2h
pod/nacos-2                                  1/1     Running   0              2h

部署成功后,使用https://nacos.youcomany.com/nacos打开nacos的Web控制台,并以默认的用户名密码(nacos/nacos)登录,



到这里,我们完成了在K8S集群中部署Nacos集群。


参考

  • https://nacos.io/zh-cn/docs/deployment.html
  • https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html
  • https://github.com/nacos-group/nacos-k8s

最后,需要注意Nacos被设计为一个在IDC内部使用的应用组件,而非面向公网环境的产品,因此需要在内部隔离网络中使用。 本文的示例中将Nacos的Web控制台和API以Ingress (nacos.youcomany.com)的形式暴露到了k8s集群外部,便于从外部测试和访问,实际部署时一定要针对这点做好网络策略控制。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1418.html

分享给朋友:

“Spring Cloud笔记02: 在k8s集群中部署Nacos集群” 的相关文章

只想简单操作 Kubernetes 资源?用 Go 一招搞定,快试试 kom!

当你在使用代码操作k8s时,有没有觉得总要写很多代码,才能获取到一个资源,并且要处理底层的集群连接、client等一系列的东西。那么有没有一种简单的办法,毕竟我只是想读取一下集群内的Pod或者什么其他资源而已啊。为了解决这个问题,我们使用 kom https://github.com/weibaoh...

Linux系统非root用户下安装Nginx

通常使用Nginx或者Apache作为Web服务器时,默认监听80端口,因此默认会使用root用户去安装,而且,使用yum命令安装时,通常会安装到默认的路径下,默认路径通常是root用户才有执行权限的。如果不需要使用Nginx监听1024以下的端口,且对权限和网络管理比较严格时,能用非root权限解...

logstash+ES+kibana搭建日志收集分析系统

日志监控和分析在保障业务稳定运行时,起到了很重要的作用,不过一般情况下日志都分散在各个生产服务器,且开发人员无法登陆生产服务器,这时候就需要一个集中式的日志收集装置,对日志中的关键字进行监控,触发异常时进行报警,并且开发人员能够查看相关日志。logstash+elasticsearch+kibana...

ThinkPhp6从安装到配置全解

Thinkphp6已经不支持之前安装方式了,只能使用Composer安装,对于V6的新用户来说,真希望有个全过程手册,我就分享一下我自己安装使用的过程,供参考。一、安装Composer在 Linux 和 Mac OS中可以运行如下命令:curl -sS https://getcomposer.org...

服务器排障nginx 499 错误地解决

问题描述:近期平台对外开放了数据查询接口,在数据量特别大时,返回结果时间可能会超过3秒,接口开放后,系统本身调用没有问题,其他第三方平台接入时,总会报链接超时问题;问题原因:查看tomcat日志无任何错误,一开始以为是tomcat接收参数最大限制问题,对tomcat做了一次整体优化,修改连接数、修改...

http——使用Nginx部署HTTPS服务

https 服务部署使用 HTTPS 需要生成私钥与公钥;某个文件夹中打开 git bash 输入命令:openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cer...