1. 程式人生 > 其它 >Kubernetes 部署 Nacos 1.4 叢集

Kubernetes 部署 Nacos 1.4 叢集

文章轉載自:http://www.mydlq.club/article/104/

系統環境:

  • Nacos 版本:1.4.1
  • Mysql 版本:8.0.19
  • Kubernetes 版本:1.20.1

一、什麼是 Nacos

Nacos 是阿里開源的服務註冊中心與配置中心元件,能夠幫助開發人員快速實現動態服務發現、服務配置、服務元資料及流量管理。同時能夠與 SpringCloud、Kubernetes、Dubbo 等開源生態無縫整合。

Nacos 支援如下核心特性:

  • 服務發現: 支援 DNS 與 RPC 服務發現,也提供原生 SDK 、OpenAPI 等多種服務註冊方式和 DNS、HTTP 與 API 等多種服務發現方式。
  • 服務健康監測: Nacos 提供對服務的實時的健康檢查,阻止向不健康的主機或服務例項傳送請求。
  • 動態配置服務: Nacos 提供配置統一管理功能,能夠幫助我們將配置以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。
  • 動態 DNS 服務: Nacos 支援動態 DNS 服務權重路由,能夠讓我們很容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及資料中心內網的簡單 DNS 解析服務。
  • 服務及其元資料管理: Nacos 支援從微服務平臺建設的視角管理資料中心的所有服務及元資料,包括管理服務的描述、生命週期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計資料。

二、提前部署 Mysql

Nacos 需要提前部署 Mysql,目前支援 5.7 及 8.0 版本。

三、匯入 SQL 相關資料

等資料庫建立完成後,還需要匯入 SQL 檔案來建立它的表結構和一些基礎資料。操作如下,我們進入 Mysql 客戶端,執行 source 命令匯入 SQL 檔案。

$ mysql -uroot -p123456

mysql> source /data/nacos.sql

SQL 地址:https://files.cnblogs.com/files/sanduzxcvbnm/nacos-deploy.zip

也可以通過 Navicat 等視覺化工具進行快捷匯入。

四、部署 Nacos

這裡我們部署 Nacos 叢集模式,整體如下示意圖,會在 Kubernetes 中建立一個 Service,該 Service 關聯 Nacos 中的多個 Pod,一個 Pod 就是 Nacos 節點,Pod 之間通過該 Service 進行互動。最後我們會配置一個 NodePort 方式對外訪問。當然,你如果你的 Kubernetes 叢集已經部署了 Ingress Controller 則可以建立 Ingress 規則對外提供訪問。

1、建立 RBAC 資源

nacos-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nacos-admin
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nacos-admin-clusterrole
rules:
- apiGroups: [""]
  resources: ["persistentvolumes"]
  verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
  resources: ["persistentvolumeclaims"]
  verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nacos-admin-binding
subjects:
- kind: ServiceAccount
  name: nacos-admin
  namespace: mydlqcloud
roleRef:
  kind: ClusterRole
  name: nacos-admin-clusterrole
  apiGroup: rbac.authorization.k8s.io

執行部署 Nacos RBAC 資源

-n:指定部署的 Namespace

$ kubectl apply -f nacos-rbac.yaml -n mydlqcloud

2、建立資料庫配置 ConfigMap 資源

nacos-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-config
data:
  SERVICE_NAME: "nacos-headless"
  DOMAIN_NAME: "cluster.local"
  NACOS_REPLICAS: "3"
  PREFER_HOST_MODE: "hostname"
  NACOS_SERVER_PORT: "8848"
  NACOS_APPLICATION_PORT: "8848"
  JVM_XMX: "2g"
  JVM_XMS: "2g"
  JVM_XMN: "1g"
  MYSQL_SERVICE_HOST: "mysql"
  MYSQL_SERVICE_DB_NAME: "nacos_config_cluster"
  MYSQL_SERVICE_PORT: "3306"
  MYSQL_SERVICE_USER: "root"
  MYSQL_SERVICE_PASSWORD: "123456"

引數說明:

  • MYSQL_SERVICE_HOST:資料庫地址(這裡使用上面部署的 Mysql,由於部署在 K8S 裡面,所以使用 Mysql Service 提供的 K8S 內部地址)
  • MYSQL_SERVICE_PORT: 資料庫埠。
  • MYSQL_SERVICE_DB_NAME: 指定使用的庫名稱。
  • MYSQL_SERVICE_USER: 資料庫使用者名稱。
  • MYSQL_SERVICE_PASSWORD: 資料庫密碼。
  • NACOS_APPLICATION_PORT:指定 Nacos 埠號。
  • PREFER_HOST_MODE:配置 Nacos 叢集節點間服務發現使用的模式,支援 hostname、ip 兩種模式。
  • JVM_XMS: 設定 JVM 最大堆記憶體大小。
  • JVM_XMX: 設定 JVM 最初是堆記憶體大小。
  • JVM_XMN: 設定 JVM 堆內新生代的記憶體大小。
  • SERVICE_NAME:指定 Nacos 部署在 K8S 中的 Service 名稱。
  • DOMAIN_NAME:指定 k8s domain 配置,一般預設即可。

執行部署 Nacos 資料庫 ConfigMap 資源

-n:指定部署的 Namespace

$ kubectl apply -f nacos-config.yaml -n mydlqcloud

3、建立 Nacos 應用

nacos-deploy.yaml

apiVersion: v1
kind: Service
metadata:
  name: nacos-headless
  labels:
    app: nacos
spec:
  ports:
    - name: server
      port: 8848
      targetPort: 8848
    - name: rpc
      port: 7848
      targetPort: 7848
  clusterIP: None
  selector:
    app: nacos
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
spec:
  serviceName: nacos-headless
  replicas: 3
  template:
    metadata:
      labels:
        app: nacos
    spec:
      terminationGracePeriodSeconds: 10  #配置優雅停機時間
      serviceAccountName: nacos-admin    #分配服務賬戶給應用,方便應用能夠獲取一定的許可權
      initContainers:                    #初始化映象執行初始化操作
        - name: peer-finder-plugin-install
          image: nacos/nacos-peer-finder-plugin:1.0
          volumeMounts:
            - mountPath: "/home/nacos/plugins/peer-finder"
              name: plugindir
      affinity:    #配置Pod反親和性,放置Pod都起在同一節點上(如果都在一個節點,節點宕機將會使全部例項不可用)       
        podAntiAffinity:    
          # requiredDuringSchedulingIgnoredDuringExecution: #硬策略,pod一定不能啟在同一個節點上
          #   - topologyKey: "kubernetes.io/hostname"
          #     labelSelector:
          #       matchExpressions:
          #         - key: "app"
          #           operator: In
          #           values:
          #             - nacos
          preferredDuringSchedulingIgnoredDuringExecution:  #軟策略,儘可能pod不啟在同一個節點上
            - weight: 100 
              podAffinityTerm:
                topologyKey: "kubernetes.io/hostname"
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - nacos  
      containers:
        - name: nacos
          image: nacos/nacos-server:1.4.1
          resources:
            limits:
              cpu: 2
              memory: "2Gi"
            requests:
              cpu: 100m
              memory: "1Gi"
          ports:
            - name: client-port
              containerPort: 8848
            - name: rpc
              containerPort: 7848
          envFrom:
            - configMapRef:
                name: nacos-config
          env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
          volumeMounts:
            - name: plugindir
              mountPath: /home/nacos/plugins/peer-finder
            - name: datadir
              mountPath: /home/nacos/data
            - name: logdir
              mountPath: /home/nacos/logs
  volumeClaimTemplates:
    - metadata:
        name: plugindir
      spec:
        storageClassName: nfs-storage #指定storageclass名稱,這裡需要根據你的K8S叢集進行修改
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 5Gi
    - metadata:
        name: datadir
      spec:
        storageClassName: nfs-storage  
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 5Gi
    - metadata:
        name: logdir
      spec:
        storageClassName: nfs-storage
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 5Gi
  selector:
    matchLabels:
      app: nacos

上面配置中使用的是 StatefulSet 資源建立的 Nacos,所以需要儲存驅動支援 StorageClass 來動態建立 PVC,這裡使用的 NFS,並且使用 nfs-client-provisioner 外掛來動態建立 PVC。

執行部署 Nacos 應用
-n:指定部署的 Namespace

$ kubectl apply -f nacos-deploy.yaml -n mydlqcloud

4、暴露 Nacos 對外訪問
這裡我們再建立一個 Service 資源,設定其型別為 NodePort 方式,提供 NodePort 埠為 30848,方便後續我們對 Nacos Dashboard 進行訪問。

kind: Service
apiVersion: v1
metadata:
  name: nacos 
  labels:
    app: nacos
spec:
  ports:
    - name: server
      port: 8848
      targetPort: 8848
      nodePort: 30848
  selector:
    app: nacos
  type: NodePort

這裡使用 NodePort 方式暴露服務。當然,如果你的 Kubernetes 叢集部署了 Ingress Controller,也可以配置 Ingress 路由規則,來讓外部訪問你的服務。

五、訪問 Nacos 進行測試

本人這裡的 Kubernetes 地址 IP 為 192.168.2.11,而上面配置的 Nacos Service 中指定 NodePort 埠為 30848,又由於 Nacos 預設會帶上字首 /nacos,所以我們可以輸入地址 http://192.168.2.11:30848/nacos 訪問 Nacos 頁面。

輸入使用者名稱/密碼: nacos/nacos ,登入 Nacos 後會看到如下頁面:

六、Nacos 變數引數及其說明

Nacos 提供了很多可以配置的引數,以環境變數的方式讓我們進行配置,部分引數如下所示: