阿里云 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就是用来开启鉴权的。如果没有添加此环境变量,默认不启用鉴权。
  • 鉴权开启后,给用户授权时,务必授予 读写 权限,以免服务无法正常注册及读取配置。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容