Nacos集群搭建-K8s环境

一、预备环境

  1. 阿里云ASK集群 k8s版本:1.20.4-aliyun.1
  2. nacos镜像:nacos/nacos-server:v2.0.3

二、流程图

graph LR
A[集群外部SLB] --> B[阿里云 Ingress] --> C[headless-Svc] --> D[statefulSet-Pod] --> E[MySQL]
F[集群内部FQDN] --> C
D --> G[PVC数据持久化]

说明:

  • 集群入口:外部入口是SLB,主要是后台管理;内部入口是headless-svc的FQDN域名,内部服务间通信。
  • 集群数据持久化:可以采用NAS,CEPH。如果不太关注落地数据,可以不需要,此篇文档就没有配置PVC。
  • 如果不太想用Ingress,可以用LoadBlance类型的Service替代Ingress,只管理界面用途可以这么做。

三、搭建步骤

1、全部所需yaml文件概览

nacos-k8s-cm.yaml
nacos-k8s-headless-svc.yaml
nacos-k8s-stateful.yaml
nacos-k8s-svc.yaml                #可不用
nginx_ingress_svc.yaml
nginx_ingress.yaml

2、创建Config-Map数据库信息

新建nacos-k8s-cm.yaml文件,并写入以下内容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-cm
  namespace: zhw
data:
  mysql.host: "xxxxxxx.mysql.rds.aliyuncs.com"
  mysql.db.name: "nacos_cluster"
  mysql.port: "3306"
  mysql.user: "nacos"
  mysql.password: "XN5lqwtnl8jUbWsu"

3、创建Headless Service

新建nacos-k8s-headless-svc.yaml文件,并写入以下内容

apiVersion: v1
kind: Service
metadata:
  name: nacos-headless
  namespace: zhw
  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

4、创建StatefulSet有状态Pod

新建nacos-k8s-stateful.yaml文件,并写入以下内容:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
  namespace: zhw
  labels:
    app: nacos
spec:
  # 上一步中headless-svc的名字
  serviceName: nacos-headless
  # nacos集群必须是三个节点
  replicas: 3
  selector:
    matchLabels:
      app: nacos
  template:
    metadata:
      labels:
        app: nacos
      annotations:
        # 阿里云ASK申请ECI的配置,可以忽略
        k8s.aliyun.com/eci-use-specs : "2-4Gi"
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - nacos
              topologyKey: "kubernetes.io/hostname"
      containers:
        - name: nacos
          imagePullPolicy: Always
          image: nacos/nacos-server:v2.0.3 
          resources:
            requests:
              memory: "4Gi"
              cpu: "2"
          ports:
            - containerPort: 8848
              name: client
            - containerPort: 9848
              name: client-rpc
            - containerPort: 9849
              name: raft-rpc
            - containerPort: 7848
              name: old-raft-rpc
          livenessProbe:
            tcpSocket:
              port: 8848
            periodSeconds: 10
            initialDelaySeconds: 30
          readinessProbe:
            tcpSocket:
              port: 8848
            initialDelaySeconds: 30
            timeoutSeconds: 5
            periodSeconds: 5
          env:
            - name: MYSQL_SERVICE_DB_PARAM
              value: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false"
            - 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必须写对,格式为FQDN形式,pod-编号.headless-svc的名字.命名空间.svc.cluster.local:8848
              value: "nacos-0.nacos-headless.zhw.svc.cluster.local:8848 nacos-1.nacos-headless.zhw.svc.cluster.local:8848 nacos-2.nacos-headless.zhw.svc.cluster.local:8848"

以上三步完成后,整个nacos集群基本已经就绪,应用可以使用headless-svc的域名nacos-headless.zhw.svc.cluster.local和nacos集群通信。如果想访问管理界面,就需要创建Ingress SLB或者LB类型的Service。

5、创建Ingress

安装完ingress组件后,即可创建ingress规则文件nginx-ingress.yaml

apiVersion: extensions/v1beta1 
kind: Ingress
metadata:
  name: nacos-ingress
  namespace: zhw
spec:
  rules:
  # 配置七层域名。
  - host: test.nacos.com
    http:
      paths:
      # 配置Context Path。
      - path: /
        backend:
          serviceName: nacos-headless
          servicePort: 8848 

根据具体情况,可继续添加9848、9849等端口。

6、创建 ingress-lb-svc

先手动创建好阿里云内网SLB,然后创建nginx-ingress-svc.yaml文件

#nginx ingress slb service
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-lb
  namespace: kube-system 
  labels:
    app: nginx-ingress-lb
  annotations:
    # 指明SLB实例地址类型为私网类型。
    service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
    # 修改为您的私网SLB实例ID,事先创建好的slb。
    service.beta.kubernetes.io/alicloud-loadbalancer-id: lb-2zev3l6hna765zkfi94ru 
    # 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
    service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
spec:
  type: LoadBalancer
  # route traffic to other nodes
  externalTrafficPolicy: "Cluster"
  ports:
  - port: 80
    name: http
    targetPort: 80
  - port: 443
    name: https
    targetPort: 443
  selector:
    # select app=ingress-nginx pods
    app: ingress-nginx

注意:这里的SLB既作为管理界面的入口,也可以作为Nacos集群的一个入口配置到各个服务的配置文件中,需要加上9848、9849等端口。

7、创建LB类型的Service

创建nacos-k8s-svc.yaml 文件,并写入以下内容:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-port: '8848'
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-flag: 'on'
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: '3'
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-type: tcp
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: '4'
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: wlc
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: '4'
    service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
  name: nacos-svc
  namespace: zhw
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8848
  selector:
    app: nacos
  type: LoadBalancer

在不想使用Ingress的情况下,可以用LB的类型SVC来创建一个管理入口。但是这个只建议做管理入口,不建议做集群入口。

四、参考信息


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com

×

喜欢就点赞,疼爱就打赏