KubeSphere 最佳實戰:Kubernetes 部署叢集模式 Nacos 實戰指南

kubesphere發表於2024-10-22

Nacos 是 Dynamic Naming and Configuration Service 的首字母簡稱,一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。

Nacos 是構建以服務為中心的現代應用架構 (例如微服務正規化、雲原生正規化) 的服務基礎設施。更多的功能特性介紹請檢視 Nacos 概覽

在本文中,我將為您提供一份全面的實戰指南,詳細地指導您如何在 Kubernetes 叢集中部署以叢集模式執行的 Nacos 服務。

實戰伺服器配置(架構1:1復刻小規模生產環境,配置略有不同)

主機名 IP CPU 記憶體 系統盤 資料盤 用途
ksp-registry 192.168.9.90 4 8 40 200 Harbor 映象倉庫
ksp-control-1 192.168.9.91 4 8 40 100 KubeSphere/k8s-control-plane
ksp-control-2 192.168.9.92 4 8 40 100 KubeSphere/k8s-control-plane
ksp-control-3 192.168.9.93 4 8 40 100 KubeSphere/k8s-control-plane
ksp-worker-1 192.168.9.94 8 16 40 100 k8s-worker/CI
ksp-worker-2 192.168.9.95 8 16 40 100 k8s-worker
ksp-worker-3 192.168.9.96 8 16 40 100 k8s-worker
ksp-storage-1 192.168.9.97 4 8 40 400+ ElasticSearch/Longhorn/Ceph/NFS
ksp-storage-2 192.168.9.98 4 8 40 300+ ElasticSearch/Longhorn/Ceph
ksp-storage-3 192.168.9.99 4 8 40 300+ ElasticSearch/Longhorn/Ceph
ksp-gpu-worker-1 192.168.9.101 4 16 40 100 k8s-worker(GPU NVIDIA Tesla M40 24G)
ksp-gpu-worker-2 192.168.9.102 4 16 40 100 k8s-worker(GPU NVIDIA Tesla P100 16G)
ksp-gateway-1 192.168.9.103 2 4 40 自建應用服務代理閘道器/VIP:192.168.9.100
ksp-gateway-2 192.168.9.104 2 4 40 自建應用服務代理閘道器/VIP:192.168.9.100
ksp-mid 192.168.9.105 4 8 40 100 部署在 k8s 叢集之外的服務節點(Gitlab 等)
合計 15 68 152 600 2100+

實戰環境涉及軟體版本資訊

  • 作業系統:openEuler 22.03 LTS SP3 x86_64
  • KubeSphere:v3.4.1
  • Kubernetes:v1.28.8
  • KubeKey: v3.1.1
  • MySQL:v5.7.44
  • Nacos: v2.4.2.1

1. 部署方案規劃

1.1 部署架構圖

1.2 準備 Nacos 部署資源

  • 建立部署資源根目錄
mkdir /srv/nacos
cd /srv/nacos
  • 獲取官方資源配置清單
# wget 方式(推薦)
wget https://codeload.github.com/nacos-group/nacos-k8s/zip/refs/heads/master -O nacos-k8s-master.zip

# git 方式
git clone https://github.com/nacos-group/nacos-k8s.git
  • 獲取初始化資料庫檔案
wget https://raw.githubusercontent.com/alibaba/nacos/refs/heads/master/distribution/conf/mysql-schema.sql

1.3 準備 MySQL

Nacos 需要使用 MySQL,本文使用更加貼近生產的 MySQL 主從複製方案部署 MySQL,具體可以參考 一文搞定,在 Kubernetes 叢集上部署主從複製 MySQL

提示: 也可以使用官方提供的資源清單 deploy/mysql/mysql-nfs.yaml ,部署單機版的 MySQL 服務。

Step 1:匯入 MySQL 初始化資料

  1. 進入 MySQL 主節點容器內部。
$ kubectl exec -it mysql-source-0 -- mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
  1. 建立資料庫及 Nacos 使用者。
-- 建立資料庫
mysql> CREATE DATABASE IF NOT EXISTS `nacos` DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 建立使用者
mysql> CREATE USER 'nacos'@'%' IDENTIFIED BY 'ChangeMe';

-- 賦予許可權
mysql> GRANT ALL PRIVILEGES ON `nacos`.* TO 'nacos'@'%';

-- 重新整理許可權
mysql> FLUSH PRIVILEGES;
  1. 匯入資料(無需登入容器內部)。
# 進入資料庫初始化 sql 檔案目錄
$ cd /srv/nacos/

# 匯入資料
kubectl exec -i mysql-source-0 -- mysql -S /var/lib/mysql/mysql.sock -u nacos -pChangeMe nacos < mysql-schema.sql

Step 2:檢視匯入的資料

  1. 登陸 MySQL 主節點容器內部。
$ kubectl exec -it mysql-source-0 -- mysql -u nacos -p
Enter password:
  1. 檢視資料庫。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| nacos              |
+--------------------+
2 rows in set (0.01 sec)
  1. 檢視錶。
# 切換資料庫
mysql> use nacos;
Database changed

# 檢視錶
mysql> show tables;
+----------------------+
| Tables_in_nacos      |
+----------------------+
| config_info          |
| config_info_aggr     |
| config_info_beta     |
| config_info_tag      |
| config_tags_relation |
| group_capacity       |
| his_config_info      |
| permissions          |
| roles                |
| tenant_capacity      |
| tenant_info          |
| users                |
+----------------------+
12 rows in set (0.00 sec)

從結果中可以看到執行 mysql-schema.sql 後,自動建立了 Nacos 服務的相關表和資料。

1.4 準備持久化儲存

本實戰環境使用 NFS 作為 K8s 叢集的持久化儲存,如果是新叢集可以參考《探索 Kubernetes 持久化儲存之 NFS 終極實戰指南》 部署 NFS 儲存。

提示: 也可以使用官方提供的 deploy/nfs/ 目錄下的資源清單,部署單機版的 NFS 服務。

2. 叢集模式 Nacos 部署

2.1 修改配置檔案

  1. 解壓部署程式碼。
$ cd /srv/nacos
$ unzip nacos-k8s-master.zip
$ cd nacos-k8s-master/deploy/nacos
  1. 編輯 nacos-pvc-nfs.yaml,修改資料庫配置。
data:
  mysql.host: "mysql-source-headless.default.svc.cluster.local"		# 資料庫地址,本文使用 MySQL 服務在 k8s 叢集內的 DNS 域名
  mysql.db.name: "nacos"
  mysql.port: "3306"
  mysql.user: "nacos"
  mysql.password: "ChangeMe"
  1. 修改 StoreClass 名稱(可選,自建 NFS 儲存時使用)。

預設的配置檔案使用的 StoreClass 名稱為 managed-nfs-storage,使用下面的命令修改為實際的值。

$ sed -i 's/managed-nfs-storage/nfs-sc/g' nacos-pvc-nfs.yaml
  1. 刪除 serviceAccountName(可選,自建 NFS 儲存時使用)。
sed -i '/serviceAccountName/d' nacos-pvc-nfs.yaml
  1. 修改映象地址(可選,映象下載受限或是離線部署時可用)。
sed -i 's#nacos/nacos-peer-finder-plugin:1.1#registry.opsxlab.cn:8443/nacos/nacos-peer-finder-plugin:1.1#g' nacos-pvc-nfs.yaml
sed -i 's#nacos/nacos-server:latest#registry.opsxlab.cn:8443/nacos/nacos-server:v2.4.2.1#g' nacos-pvc-nfs.yaml
  1. 開啟鑑權配置(建議)。

Nacos 預設配置沒有開啟鑑權,生產環境建議開啟。在 containers.env 部分增加下面的內容:

- name: NACOS_AUTH_ENABLE
  value: "true"
- name: NACOS_AUTH_TOKEN
  value: "SecretKeyYzJlMTMxOTU5ZTljZTkxZGQ2MDcwZGIxMzU1YTFkMjg="
- name: NACOS_AUTH_IDENTITY_KEY
  value: "serverIdentity"
- name: NACOS_AUTH_IDENTITY_VALUE
  value: "ChangeMe"

注意: 自定義 NACOS_AUTH_TOKEN 金鑰時,推薦將配置項設定為Base64 編碼的字串,且原始金鑰長度不得低於32字元

可以執行下面的命令生成TOKEN 金鑰:

echo -n $(openssl rand -hex 16) | base64 -w0

2.2 部署 Nacos 叢集

  1. 執行下面的命令,建立 Nacos。
$ kubectl create -f nacos-pvc-nfs.yaml

正確執行後,輸出結果如下 :

$ kubectl create -f nacos-pvc-nfs.yaml
service/nacos-headless created
configmap/nacos-cm created
statefulset.apps/nacos created
  1. 驗證 Nacos 節點狀態。
$ kubectl get pod -l app=nacos -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
nacos-0   1/1     Running   0          25s   10.233.96.233   ksp-worker-3   <none>           <none>
nacos-1   1/1     Running   0          25s   10.233.94.125   ksp-worker-1   <none>           <none>
nacos-2   1/1     Running   0          25s   10.233.68.221   ksp-worker-2   <none>           <none>

2.3 配置 K8s 叢集外部訪問

我們採用 NodePort 方式在 Kubernetes 叢集中對外發布 Nacos 服務,以便管理員能夠訪問圖形化控制檯,同時也為叢集外的應用提供服務,指定的埠為 31848

使用 vi 編輯器,新建 NodePort 服務資源清單檔案 nacos-external.yaml,並輸入以下內容:

kind: Service
apiVersion: v1
metadata:
  name: nacos-external
  labels:
    app: nacos-external
spec:
  ports:
    - protocol: TCP
      port: 8848
      targetPort: 8848
      nodePort: 31848
  selector:
    app: nacos
  type: NodePort

2.4 設定管理員密碼

2.4.0 版本開始,Nacos構建時不再提供管理員使用者nacos的預設密碼,需要在首次開啟鑑權後,透過 API 或 Nacos 控制檯進行管理員使用者nacos的密碼初始化。

本文選擇 Nacos 控制檯的方式初始化密碼,當 Nacos 叢集開啟鑑權後,訪問 Nacos 控制檯時,會校驗管理員使用者nacos的密碼是否已經初始化,若發現未初始化密碼時,則會跳轉至初始化密碼的頁面進行初始化。

在該頁面密碼文字框內輸入自定義密碼,然後點選提交即可。

注意: 若密碼文字框內未輸入自定義密碼或輸入空白密碼,Nacos 將會生成隨機密碼,請儲存好生成的隨機密碼。

初始化成功後會彈窗提示初始化成功,並明文展示指定的密碼或隨機生成的密碼,請儲存好此密碼。

點選「確定」後,會跳轉到登入頁面,並彈出許可權認證失敗的提示框。

點選「確定」後,輸入 nacos 使用者名稱和對應的密碼。

登入成功後,進入「配置管理」頁面。

3. 驗證測試 Nacos 服務是否正確配置

使用 curl 命令,在 K8s 叢集外的機器上呼叫 Nacos API 介面,透過 Nacos 對外服務對應的 NodePort 埠,驗證測試 Nacos 服務是否正常。

3.1 獲取 Token

首先,使用使用者名稱和密碼登陸 nacos,若使用者名稱和密碼正確,會返回 Token 資訊。

curl -X POST 'http://192.168.9.91:31848/nacos/v1/auth/login' -d 'username=nacos&password=ChangeMe'

正確執行後,返回的結果如下:

{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}

3.2 服務註冊

curl -X POST 'http://192.168.9.91:31848/nacos/v1/ns/instance?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&serviceName=nacos.naming.serviceName&ip=192.168.9.81&port=8080'

3.3 服務發現

curl -X GET 'http://192.168.9.91:31848/nacos/v1/ns/instance/list?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&serviceName=nacos.naming.serviceName'

正確執行後,返回的結果如下:

{"name":"DEFAULT_GROUP@@nacos.naming.serviceName","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[],"lastRefTime":1727692102280,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}[

3.4 釋出配置

curl -X POST "http://192.168.9.91:31848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&dataId=nacos.cfg.dataId&group=test&content=helloWorld"

3.5 獲取配置

curl -X GET "http://192.168.9.91:31848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&dataId=nacos.cfg.dataId&group=test"

正確執行後,返回的結果如下:

helloWorld

3.6 Nacos 控制檯檢視

  • 配置管理列表

  • 配置詳情

至此,我們完成了在 KubeSphere 管理的 Kubernetes 叢集上手動部署 Nacos 叢集的全過程,後續的配置管理請根據實際應用的需求進行配置。

免責宣告:

  • 筆者水平有限,儘管經過多次驗證和檢查,盡力確保內容的準確性,但仍可能存在疏漏之處。敬請業界專家大佬不吝指教。
  • 本文所述內容僅透過實戰環境驗證測試,讀者可學習、借鑑,但嚴禁直接用於生產環境由此引發的任何問題,作者概不負責!

本文內容首發:運維有術。

關於 KubeSphere

KubeSphere (https://kubesphere.io)是在 Kubernetes 之上構建的開源容器平臺,提供全棧的 IT 自動化運維的能力,簡化企業的 DevOps 工作流。

KubeSphere 已被 Aqara 智慧家居、本來生活、東方通訊、微宏科技、東軟、華雲、新浪、三一重工、華夏銀行、四川航空、國藥集團、微眾銀行、紫金保險、去哪兒網、中通、中國人民銀行、中國銀行、中國人保壽險、中國太平保險、中國移動、中國聯通、中國電信、天翼雲、中移金科、Radore、ZaloPay 等海內外數萬家企業採用。KubeSphere 提供了開發者友好的嚮導式操作介面和豐富的企業級功能,包括 Kubernetes 多雲與多叢集管理、DevOps (CI/CD)、應用生命週期管理、邊緣計算、微服務治理 (Service Mesh)、多租戶管理、可觀測性、儲存與網路管理、GPU support 等功能,幫助企業快速構建一個強大和功能豐富的容器雲平臺。

✨ GitHub:https://github.com/kubesphere
💻 官網(中國站):https://kubesphere.io/zh
🙋 論壇:https://ask.kubesphere.io/forum/
👨‍💻‍ 微信群:請搜尋新增群助手微訊號 kubesphere

相關文章