一,nacos 概览

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

二,nacos 2.0版本须知

nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。

端口与主端口的偏移量描述
98481000客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
98491001服务端gRPC请求服务端端口,用于服务间同步等

使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。

客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。

因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。

 三,nacos部署

1. 准备外部ceph存储,部署好ceph-csi,以及storageclass的存储名部署nacos需要用到。

  ceph-csi部署:K8S使用ceph-csi持久化存储之cephfs部署验证快照
  ceph存储:ceph v15.2.13版本[octopus]分布式集群部署

2. 准备好数据库,我们集群里面是有数据库,这里我就不做配置直接使用,然后导入数据库。

   数据库在GitHub里面有,可以复制一份。   https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql 

  官方nacos集群yaml文档参考:https://github.com/nacos-group/nacos-k8s.git

3. 创建配置文件

# cat configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-cm
  namespace: nacos
data:
  mysql.db.name: "nacos_devtest"
  mysql.db.host: "10.102.155.63" # mysql数据库内部地址
  mysql.port: "3306"
  mysql.user: "root"
  mysql.password: "uUN38#%pq"


# 部署以及查看状态 
[root@master ~]# kubectl apply -f configmap.yaml
[root@master ~]# kubectl get configmap -n nacos
NAME       DATA   AGE
nacos-cm   5      28d

4. 部署nacos service服务以及设置NodePort暴露外部端口

# cat nacos-service.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: nacos-headless
  namespace: nacos
  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
---
apiVersion: v1
kind: Service
metadata:
  name: nacos
  namespace: nacos
  labels:
    app: nacos
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  ports:
  - protocol: TCP
    port: 8848
    targetPort: 8848
    nodePort: 38848
    name: nacos-http
  - protocol: TCP
    port: 9849
    targetPort: 9849
    name: raft-rpc
    nodePort: 39849
  selector:
    app: nacos
  type: NodePort

# 执行命令
[root@master ~]# kubectl apply -f nacos-service.yaml

# 查看nacos服务状态
[root@master ~]# kubectl get svc -n nacos
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                               AGE
mysql-nacos      NodePort    10.98.111.83     <none>        3306:33306/TCP                        29d
nacos            NodePort    10.108.121.237   <none>        8848:38848/TCP,9849:39849/TCP         28d
nacos-headless   ClusterIP   None             <none>        8848/TCP,9848/TCP,9849/TCP,7848/TCP   28d


5. 创建部署文件StatefulSet

StatefulSet部署方式为每个POD生成固定的名称,如nacos-0、nacos-1、nacos-2等。

StatefulSet和Headless Service为每个nacos实例生成一个唯一的dns地址,其中NACOS_SERVERS 的value值一定要根据实际情况来更改: 

模板:statefulset名.nacos服务名.空间命名.svc.cluster.local:端口
我的空间命名是nacos所以是:nacos-0.nacos-headless.nacos.svc.cluster.local:8848

# cat nacos-statefulset.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
  namespace: nacos
spec:
  serviceName: nacos-headless ## nacos服务名,名字要统一
  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"
      #serviceAccountName: cephfs-provisioner
      initContainers:
        - name: peer-finder-plugin-install
          image: jinyuyun.top/nacos-peer-finder-plugin:1.1
          imagePullPolicy: Always
          volumeMounts:
            - mountPath: /home/nacos/plugins/peer-finder
              name: data
              subPath: peer-finder
      containers:
        - name: nacos
          imagePullPolicy: Always
          image: jinyuyun.top/nacos-server:2.0.0
          resources:
            requests:
              memory: "2Gi"
              cpu: "500m"
            limits:
              memory: "2048Mi"
              cpu: "512m"
          ports:
            - containerPort: 8848
              name: client-port
            - containerPort: 9848
              name: client-rpc
            - containerPort: 9849
              name: raft-rpc
            #- containerPort: 7848
              #name: old-raft-rpc
          env:
            - name: NACOS_REPLICAS
              value: "3"
            - name: SERVICE_NAME
              value: "nacos-headless"
            - name: DOMAIN_NAME
              value: "cluster.local"
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: MYSQL_SERVICE_DB_NAME
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.db.name
            - name: MYSQL_SERVICE_HOST
              valueFrom:
                configMapKeyRef:
                  name: nacos-cm
                  key: mysql.db.host
            - 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: NACOS_SERVER_PORT
              value: "8848"
            - name: NACOS_APPLICATION_PORT
              value: "8848"
            - name: NACOS_APPLICATION_PORT
              value: "8848"
            - name: PREFER_HOST_MODE
              value: "hostname"
            - name: NACOS_SERVERS  ##节点IP
              value: "nacos-0.nacos-headless.nacos.svc.cluster.local:8848 nacos-1.nacos-headless.naocs.svc.cluster.local:8848 nacos-2.nacos-headless.nacos.svc.cluster.local:8848"
          volumeMounts:
            - name: data
              mountPath: /home/nacos/plugins/peer-finder
              subPath: peer-finder
            - name: data
              mountPath: /home/nacos/data
              subPath: data
            - name: data
              mountPath: /home/nacos/logs
              subPath: logs
  volumeClaimTemplates:  ## 给nacos创建存储类卷名pvc并分配存储
    - metadata:
        name: data
      spec:
        accessModes: [ "ReadWriteMany" ]
        storageClassName: "jyy-cephfs-sc"
        resources:
          requests:
            storage: 1Gi
  selector:
    matchLabels:
      app: nacos


# 执行部署命令
[root@master ~]# kubectl apply -f nacos-statefulset.yaml
# 查看部署状态
[root@master ~]# kubectl get statefulset -n nacos
NAME    READY   AGE
nacos   3/3     28d
[root@master ~]# kubectl get pod -n nacos
NAME                READY   STATUS    RESTARTS   AGE
mysql-naocs-f4kwc   1/1     Running   3          29d
nacos-0             1/1     Running   1          8d
nacos-1             1/1     Running   2          28d
nacos-2             1/1     Running   3          28d

 官方bug:### 已知问题
  - 启动后需要重启pod nacos-0集群才能正常使用

6.  可以配置Ingress(可选),这儿直接用的nodeport暴露端口方式外部访问。

http://192.168.1.90:38848/nacos/

 7. 参考

nacos官方文档

https://blog.51cto.com/fengwan/2941368

https://blog.csdn.net/u011936655/article/details/108364176

https://blog.csdn.net/weixin_42562106

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐