作者:濯光、翼嚴
Kubernetes 配置管理的局限
目前,在 Kubernetes 集群中,配置管理主要通過 ConfigMap 和 Secret 來實現。這兩種資源允許用戶將配置信息通過環境變量或者文件等方式,注入到 Pod 中。盡管 Kubernetes 提供了這些強大的工具,但在實際應用中仍存在一些挑戰:
1. 歷史版本管理缺失:Kubernetes 中的 ConfigMap 和 Secret 本身并不直接支持歷史版本管理,更新后舊版本的配置將被覆蓋,且無法直接恢復到之前的版本。如果配置更新后出現問題,無法快速回滾到之前的版本,可能導致系統不穩定或服務中斷,也不利于故障排查和合規性審計。
2. 缺乏動態性:Kubernetes 原生的配置管理機制不支持實時推送配置變更,這意味著更改后的配置不會立即在應用中生效,除非重啟 Pod,這導致系統的響應速度慢,靈活性差。
3. 沒有灰度能力:Kubernetes 原生的配置管理機制(如 ConfigMap 和 Secret)不直接支持灰度發布。配置變更通常需要手動更新,并且會立即應用到所有相關的 Pod。
4. 安全性問題:雖然 Secret 可以用來存儲敏感信息,但其安全性和訪問控制仍有待加強。
Nacos 配置管理的優勢
Nacos(Dynamic Naming and Configuration Service)是一個動態服務發現、配置管理和服務管理平臺。它旨在幫助開發者更容易地構建云原生應用,提供了一套簡單易用的特性來簡化微服務架構中的服務發現、配置管理和服務管理。Nacos 在配置管理方面提供了許多高階的管理功能,能夠有效解決上述問題:
- 歷史版本管理: Nacos 支持配置的歷史版本管理,您可以輕松查看和恢復到之前的配置版本。這使得回滾配置變得更加簡單和可靠。
- 統一配置管理: Nacos 提供了一個集中式的配置管理中心,可以將所有環境下的配置信息統一管理,簡化了配置管理流程。通過一個直觀的 Web 界面,用戶可以輕松查看、編輯和管理配置
- 動態配置更新: Nacos 支持實時推送配置變更,無需重啟 Pod 即可使新的配置生效,大大提升了系統的靈活性和響應速度。
- 灰度發布支持: Nacos 支持配置灰度發布功能,可以針對特定的服務實例或環境推送配置變更。通過 Nacos 的灰度發布功能,可以在部分實例上測試新的配置,確保其穩定后再逐步推廣到所有實例。
- 敏感信息安全存儲: Nacos 提供了多層次的安全機制,包括配置加密、安全傳輸等,確保敏感信息的安全性。
- 豐富的多語言支持: Nacos 提供了豐富的多語言支持,涵蓋了 Java\Go\Python 無論您的微服務架構基于何種技術棧,只要它們能夠接入 Nacos,就可以享受到一致性的配置管理體驗。
最近,伴隨著 Nacos 3.0-Beta 版本的發布,Nacos 社區發布了 Nacos-Controller 2.0 版本,它可以幫助同步 K8s 的 Service 到 Nacos,同時也支持 K8s 的 Configmap、Secret 與 Nacos 配置的雙向同步。基于 Nacos-Controller 2.0,可以實現 Nacos 一鍵托管 K8s 配置,使用 Nacos 賦能 K8s 配置管理。接下來就讓我們來看看如何使用 Nacos 來管理 K8s 配置吧。
使用 Nacos-Controller 一鍵托管 K8s 配置
Nacos Controller 2.0 支持 Kubernetes 集群配置和 Nacos 配置的雙向同步,支持將 Kubernetes 集群特定命名空間下的 ConfigMap 以及 Secret 同步到 Nacos 指定命名空間下中。用戶可以通過 Nacos 實現對于 Kubernetes 集群配置的動態修改和管理。Nacos 配置和 Kubernetes 配置的映射關系如下表所示:
ConfigMap/Secret | Nacos Config |
---|---|
Namespace | 用戶指定的命名空間 |
Name | Group |
Key | DataId |
Value | Content |
目前主要支持兩種配置同步的策略:
- 全量同步:Kubernetes 集群特定命名空間下的所有 ConfigMap 以及 Secret 自動同步至 Nacos,Nacos Controller 會自動同步所有新建的 ConfigMap 和 Secret
- 部分同步:只同步用戶指定的 ConfigMap 和 Secret 至 Nacos
部署 Nacos Controller
-
安裝 helm,參考文檔【1】
-
安裝 Nacos Controller 到對應的 kubernetes 集群中
git clone https://github.com/nacos-group/nacos-controller.git
cd nacos-controller/charts/nacos-controllerexport KUBECONFIG=/你的K8s集群/訪問憑證/文件路徑
kubectl create ns nacos
helm install -n nacos nacos-controller .
快速開始
通過以下的命令,你可以快速將 kubernetes 集群中當前命名空間的配置全量同步到 Nacos 中。
cd nacos-controller
chmod +x configQuicStart.sh ./configQuicStart.sh <nacos-addr> <nacos-namespace-id>
除此之外,你還可以參照以下說明:根據自己的需要編寫 DynamicConfiguration yaml 文件,并部署到 K8s 集群中。
K8s 集群命名空間配置全量同步 Nacos
- 編寫 DynamicConfiguration yaml 文件:
apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:name: dc-demo
spec:nacosServer:# endpoint: nacos地址服務器,與serverAddr互斥,優先級高于serverAddr,與serverAddr二選一即可endpoint: <your-nacos-server-endpoint># serverAddr: nacos地址,與endpoint二選一即可serverAddr: <your-nacos-server-addr># namespace: 用戶指定的命名空間namespace: <your-nacos-namespace-id># authRef: 引用存放Nacos 客戶端鑒權信息的Secret,支持用戶名/密碼 和 AK/SK, Nacos服務端未開啟鑒權可忽略authRef:apiVersion: v1kind: Secretname: nacos-authstrategy:# scope: 同步策略,full 表示全量同步,partial 表示部分同步scope: full# 是否同步配置刪除操作syncDeletion: true# conflictPolicy: 同步沖突策略,preferCluster 表示初次同步內容沖突時以Kubernetes集群配置為準,preferServer 表示以Nacos配置為準conflictPolicy: preferCluster
---
apiVersion: v1
kind: Secret
metadata:name: nacos-auth
data:#阿里云Mse Nacos采用AK SK進行鑒權accessKey: <base64 ak>secretKey: <base64 sk>#開源Nacos采用用戶名密碼進行鑒權username: <base64 your-nacos-username>password: <base64 your-nacos-password>
- 執行命令部署 DynamicConfiguration 到需要全量同步的 Kubernetes 集群命名空間下, 即可實現配置的全量同步
kubectl apply -f dc-demo.yaml -n <namespace>
K8s 集群命名空間配置部分同步 Nacos
- 編寫 DynamicConfiguration yaml 文件,和全量同步的區別主要在于 strategy 部分,并且要指定需要同步的 ConfigMap 和 Secret:
apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:name: dc-demo
spec:nacosServer:# endpoint: nacos地址服務器,與serverAddr互斥,優先級高于serverAddr,與serverAddr二選一即可endpoint: <your-nacos-server-endpoint># serverAddr: nacos地址,與endpoint二選一即可serverAddr: <your-nacos-server-addr># namespace: 用戶指定的命名空間namespace: <your-nacos-namespace-id># authRef: 引用存放Nacos 客戶端鑒權信息的Secret,支持用戶名/密碼 和 AK/SK, Nacos服務端未開啟鑒權可忽略authRef:apiVersion: v1kind: Secretname: nacos-authstrategy:# scope: 同步策略,full 表示全量同步,partial 表示部分同步scope: partial# 是否同步配置刪除操作syncDeletion: true# conflictPolicy: 同步沖突策略,preferCluster 表示初次同步內容沖突時以Kubernetes集群配置為準,preferServer 表示以Nacos配置為準conflictPolicy: preferCluster# 需要同步的ConfigMap和SecretobjectRefs:- apiVersion: v1kind: ConfigMapname: nacos-config-cm- apiVersion: v1kind: Secretname: nacos-config-secret
---
apiVersion: v1
kind: Secret
metadata:name: nacos-auth
data:accessKey: <base64 ak>secretKey: <base64 sk>username: <base64 your-nacos-username>password: <base64 your-nacos-password>
- 執行命令部署 DynamicConfiguration 到需要同步的 Kubernetes 集群命名空間下,即可實現配置的部分同步
kubectl apply -f dc-demo.yaml -n <namespace>
通過以上的步驟,Nacos Controller 就會根據我們提供的 DynamicConfiguration 配置信息,自動實現 K8s 集群配置和 Nacos 配置之間的全量同步或者部分同步,讓我們來看看具體效果吧!
效果演示
以全量同步為例,在完成 Nacos-controller 的部署后,我們執行以下命令,查看當前 K8s 集群中默認命名空間下的 ConfigMap:
% kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 63m
可以發現當前只有 kube-root-ca.crt 一個配置。
編寫 DynamicConfiguration yaml 文件,選擇全量同步模式,并執行命令部署:
apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:name: dc-demo
spec:nacosServer:endpoint: nacos-serverAddrserverAddr: nacos-serverAddrnamespace: xxxxxxxxxxxxxxxxx #選擇要同步到的nacos命名空間strategy:scope: fullsyncDeletion: trueconflictPolicy: preferCluster
kubectl?apply -f dc-demo.yaml
查看對應的 Nacos 控制臺:
可以發現對應的命名空間下面已經多了一條分組為 configmap.kube-root-ca.crt,dataId 為 ca.crt 的 Nacos 配置,對應的 K8s 配置已經同步到了 Nacos 中。
此時我們通過 kubectl 命令在 K8s 中再創建一個 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:name: testconfignamespace: default
data:test.properties: "Hello, World"
kubectl?apply -f test.yaml
查看 Nacos 控制臺,可以發現命名空間下已經也多了一條對應的 Nacos 配置,dataId 為 ConfigMap 中的 Key,分組為 ConfigMap的Name:
在 Nacos 控制臺上編輯對應的配置內容并發布:
通過 kubectl 查看對應的 ConfigMap 內容:
kubectl describe configmap testconfigName: testconfig
Namespace: default
Labels: <none>
Annotations: <none>Data
====
test.properties:
----
Hi, WorldBinaryData
====Events: <none>
可以發現對應的配置內容產生了更改,Nacos 上對于配置內容的變更同步到了 K8s 集群中。
同時,通過 Nacos 的歷史版本功能,還可以對歷史變更操作進行溯源定位,比較每個版本之間的內容差異,并在故障發生時及時回滾:
通過 Nacos-Controller 將 K8s 集群配置托管至 Nacos,用戶可以使用 Nacos 控制臺對 K8s 配置進行白屏化管理,避免使用 kubectl 進行的黑屏操作。同時,在 Nacos 上可以對不同環境的配置(開發、線上、測試)進行統一的管理,歷史版本功能也能幫助用戶進行審計、溯源和恢復。目前,Nacos-Controller 2.0 已經和 Nacos 3.0-BETA 版本同步發布,快來體驗下吧。
接入 Nacos 高階配置管理能力
Nacos-Controller 2.0 支持將 K8s 集群配置托管至 Nacos 進行雙向同步,讓 K8s 配置擁有了歷史版本,白屏化操作以及配置集中化管理等能力。
而如果你希望能夠更加高效的對應用配置進行管理,對配置管理還有以下的更高的要求:
- 動態配置生效: 配置的更改能夠直接在應用中生效,無需重啟。
- 配置灰度發布: 配置更新上線時,先在小部分節點進行灰度驗證,確認無風險后再全量推送。
- 敏感配置安全存儲: 我的配置中存儲了密鑰等敏感機密的信息,要保證這些信息不會泄露。
- 配置監聽查詢: 我希望直觀的了解有哪些節點在使用這份配置。
那我們建議你采用第二種方式:在應用中接入 Nacos sdk,即可輕松享受 Nacos 提供的以上高階配置管理能力:
配置灰度
Nacos 支持基于 IP 的灰度發布:
正式節點監聽到的內容:
receive:Hi, World
IP=192.168.255.254 的灰度節點監聽到的內容:
receive:Hi, World Gray
阿里云企業版 Mse Nacos 還額外提供了更強大的多版本標簽灰度的能力,歡迎了解。
配置監聽查詢
在 Nacos 控制臺上可以輕松查看有哪些客戶端監聽了對應的配置
敏感信息安全傳輸和存儲
如果敏感信息以明文形式存儲或傳輸,容易成為黑客攻擊的目標,導致數據泄露或系統被濫用。這些信息一旦泄露,可能對用戶隱私、企業安全和系統穩定性造成嚴重影響。Nacos 配置中心支持配置加密功能,并支持 TLS 傳輸加密,建設了完善的零信任安全體系,可以對存放在 Nacos 上的敏感信息從存儲到傳輸的全鏈路加密,大大提高安全性:
MSE Nacos 更進一步,和阿里云秘鑰管理服務 KMS 合作,支持對配置進行安全等級更高的非對稱加密。針對數據安全隱患,MSE Nacos 可為敏感配置提供滿足國家三級等保中數據安全要求的解決方案。
應用接入 Nacos SDK
以 Java 為例,當用戶沒有接入 Nacos,直接通過環境變量或者文件方式去 K8s 配置變化時,一般采用輪訓的方式:
String ENV_VARIABLE_NAME = "YOUR_ENV_VARIABLE_NAME"; // 替換為您的環境變量名稱
String lastValue = System.getenv(ENV_VARIABLE_NAME);
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);// 每5秒檢查一次環境變量的變化
executorService.scheduleAtFixedRate(() -> {String currentValue = System.getenv(ENV_VARIABLE_NAME);if (currentValue != null && !currentValue.equals(lastValue)) {System.out.println("環境變量 " + ENV_VARIABLE_NAME + " 發生變化: 從 " + lastValue + " 變為 " + currentValue);lastValue = currentValue;}
}, 0, 5, TimeUnit.SECONDS);
而只修改幾行代碼,就可以接入 Nacos Java sdk,享受到 Nacos 配置管理的高階功能:
String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
# 指定Nacos的地址
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
# 查詢Nacos的配置
String content = configService.getConfig(dataId, group, 5000);
# 監聽Nacos的配置
configService.addListener(dataId, group, new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("recieve1:" + configInfo);}@Overridepublic Executor getExecutor() {return null;}
});
而除了 Java 之外,Nacos 還提供了豐富的多語言支持,覆蓋了 Go/Python 等熱門編程語言,對應的開源社區也非常活躍,無論您的應用使用的是以上什么類型的編程語言,都可以采用類似的方式輕松接入,享受到 Nacos 高階的配置管理能力。
結語
無論是使用 Nacos-Controller 實現配置的雙向同步,還是直接在應用中接入 Nacos SDK 以獲得更高級的配置管理特性,都能顯著提升配置管理的靈活性、安全性和可維護性。使用 Nacos,您能夠更好地管理和優化您的應用配置,從而提高系統的穩定性和可靠性。此外,Nacos-Controller 2.0 還支持 Nacos 服務和 K8S Service 的同步。近期,Nacos 3.0-BETA 版本也已經重磅發布,在安全性方面顯著提升,同時增加了分布式鎖,模糊訂閱等新特性,歡迎各位體驗使用。
安裝 helm,參考文檔https://helm.sh/docs/intro/install/
相關鏈接
[1] Nacos 官網
https://nacos.io
[2] Nacos Github 主倉庫
https://github.com/alibaba/nacos
[3] 生態組倉庫
https://github.com/nacos-group
[4] MSE 配置灰度發布
https://help.aliyun.com/zh/mse/user-guide/configure-canary-release
Nacos 多語言生態倉庫:
[1] Nacos-GO-SDK
https://github.com/nacos-group/nacos-sdk-go
[2] Nacos-Python-SDK
https://github.com/nacos-group/nacos-sdk-python
[3] Nacos-Rust-SDK
https://github.com/nacos-group/nacos-sdk-rust
[4] Nacos C# SDK
https://github.com/nacos-group/nacos-sdk-csharp
[5] Nacos C++ SDK
https://github.com/nacos-group/nacos-sdk-cpp
[6] Nacos PHP-SDK
https://github.com/nacos-group/nacos-sdk-php
[7] Rust Nacos Server
https://github.com/nacos-group/r-nacos