阿里云 ACK 中部署 Nacos 高可用集群

部署过程

数据库

  1. 在RDS上创建名为nacos的库以及用户,记录密码。
  2. 为nacos用户授权nacos库的读写权限。
  3. 记录RDS的内网连接地址及端口。
  4. 通过Navicat连接RDS,对nacos库导入数据结构。

.sql 文件可以从官方 clone 出来的目录中找到。
git clone https://github.com/nacos-group/nacos-k8s.git

NAS

在NAS上创建一个挂载点,选择和ACK集群同VPC即可。

PVC

  1. 进入ACK集群。
  2. 菜单栏选择存储>存储声明
  3. 切换到目标命名空间。如果还未创建命名空间,先创建。
  4. 点击创建存储声明,参考下面的截图进行配置。
    image.png
  5. 创建完成后,记录存储声明的名称nacos-data-pvc,后续使用。

ConfigMap

  1. 在ACK控制台菜单栏中选择配置管理>配置项
  2. 单击使用YAML创建资源
  3. 输入以下内容,单击创建,创建名为nacos-cm的ConfigMap,用于传递RDS的信息。
apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-cm
data:
  mysql.host: "*****.mysql.rds.aliyuncs.com"
  mysql.db.name: "nacos"
  mysql.port: "3306"
  mysql.user: "nacos"
  mysql.password: "*******"

Secret

为了开启 Nacos 的 https 访问,所以需要参考下面的步骤,创建 Secret。

  1. 在ACK控制台菜单栏中选择配置管理>保密字典
  2. 单击创建,将SSL证书的公私钥配置进去,保存并记录字典名称。
    image

SSL 证书请自行申请获取,不开启 https 访问的话,这里可以省略,ingress 里也省略 tls 的部分即可。

Service

  1. 在ACK控制台菜单栏中选择网络>服务
  2. 单击使用YAML创建资源
  3. 输入以下内容,单击创建,创建名为nacos-svc的服务。
apiVersion: v1
kind: Service
metadata:
  name: nacos-svc
  labels:
    app: nacos
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  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
  clusterIP: None
  selector:
    app: nacos

端口均和官网文档保持一致。

StatefulSet

  1. 在ACK控制台菜单栏中选择工作负载>有状态
  2. 单击使用YAML创建资源
  3. 输入以下内容,单击创建,创建名为nacos-sfs的有状态负载。
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos-sfs
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nacos
  serviceName: nacos-svc
  template:
    metadata:
      annotations:
        pod.alpha.kubernetes.io/initialized: 'true'
      labels:
        app: nacos
    spec:
      containers:
        - env:
            - name: NACOS_REPLICAS
              value: '2'
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: SERVICE_NAME
              value: nacos-svc
            - name: DOMAIN_NAME
              value: cluster.local
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: MYSQL_SERVICE_HOST
              valueFrom:
                configMapKeyRef:
                  key: mysql.host
                  name: nacos-cm
            - name: MYSQL_SERVICE_DB_NAME
              valueFrom:
                configMapKeyRef:
                  key: mysql.db.name
                  name: nacos-cm
            - name: MYSQL_SERVICE_PORT
              valueFrom:
                configMapKeyRef:
                  key: mysql.port
                  name: nacos-cm
            - name: MYSQL_SERVICE_USER
              valueFrom:
                configMapKeyRef:
                  key: mysql.user
                  name: nacos-cm
            - name: MYSQL_SERVICE_PASSWORD
              valueFrom:
                configMapKeyRef:
                  key: mysql.password
                  name: nacos-cm
            - name: NACOS_SERVER_PORT
              value: '8848'
            - name: NACOS_APPLICATION_PORT
              value: '8848'
            - name: PREFER_HOST_MODE
              value: hostname
            - name: NACOS_AUTH_ENABLE
              value: 'true'
          image: 'nacos/nacos-server:latest'
          imagePullPolicy: Always
          name: nacos
          ports:
            - containerPort: 8848
              name: client-port
              protocol: TCP
            - containerPort: 9848
              name: client-rpc
              protocol: TCP
            - containerPort: 9849
              name: raft-rpc
              protocol: TCP
            - containerPort: 7848
              name: old-raft-rpc
              protocol: TCP
          resources:
            requests:
              memory: 2Gi
            limits:
              memory: 2Gi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /home/nacos/plugins/peer-finder
              name: volume-nacos-data
              subPath: peer-finder
            - mountPath: /home/nacos/data
              name: volume-nacos-data
              subPathExpr: $(POD_NAME)
            - mountPath: /home/nacos/logs
              name: volume-nacos-data
              subPath: logs
      dnsPolicy: ClusterFirst
      initContainers:
        - image: 'nacos/nacos-peer-finder-plugin:1.1'
          imagePullPolicy: Always
          name: peer-finder-plugin-install
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /home/nacos/plugins/peer-finder
              name: volume-nacos-data
              subPath: peer-finder
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
        - name: volume-nacos-data
          persistentVolumeClaim:
            claimName: nacos-data
  updateStrategy:
    type: RollingUpdate
  • 此处的副本数为2,后续结果验证时将扩容到 3 个。
  • mysql相关的配置从上面创建的ConfigMap中获取。
  • 限制资源使用量为内存2G。
  • 挂载了3个存储卷。
  • 服务名称与上面创建的服务一致。
  1. 检查负载的状态,等待几分钟后,确认状态均为running。


    image
  2. 查看日志,确认最新日志显示nacos启动成功,并且以集群+外置存储方式运行。


    image

Ingress

  1. 在ACK控制台菜单栏中选择网络>路由
  2. 单击使用YAML创建资源
  3. 输入以下内容,单击创建,创建名为nacos-ingress的路由。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/service-weight: ''
  name: nacos-ingress
  namespace: ops-share
spec:
  rules:
    - host: nacos.xxx.com
      http:
        paths:
          - backend:
              serviceName: nacos-svc
              servicePort: 8848
            path: /
            pathType: ImplementationSpecific
  tls:
    - hosts:
        - nacos.xxx.com
      secretName: nacos-secret1629271865685
status:
  loadBalancer:
    ingress:
      - ip: x.x.x.x
  • 其中8848为Nacos的控制台端口。
  • nacos-svc为上面创建的服务名称。
  • nacos.xxx.com为访问域名,根据实际情况填写。
  • secretName为创建的保密字典名称。
  • ip为负载均衡的外网IP地址,以便下面进行DNS解析。

DNS

创建一条A记录,名称nacosx指向上面负载均衡的外网地址 。

结果验证

  1. 通过域名访问,确认可以正常访问到Nacos的后台。
  2. 集群管理>节点列表里,确认可以看到和k8s副本数一致的节点数,并且状态为UP
    image.png
  3. 在ACK控制台,调整nacos-sfs的副本数,增加到3个副本,确认Nacos后台的节点数变为3个,并且状态为UP。即节点数与副本数保持完全一致。
  4. 差个每个 Nacos 节点的元数据,确认其中不存在报错。

参考文档

更多信息

  • 开启鉴权:创建nacos-sfs时,添加的环境变量中NACOS_AUTH_ENABLE=true就是用来开启鉴权的。如果没有添加此环境变量,默认不启用鉴权。
  • 鉴权开启后,给用户授权时,务必授予 读写 权限,以免服务无法正常注册及读取配置。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容