antony@notes:~/rancher$ cat "RKE2-設定-configmap-加密儲存在-etcd.md"
RKE2 設定 configmap 加密儲存在 etcd
RKE2 設定 configmap 加密儲存在 etcd
RKE2 預設會把 secret 做加密儲存
檢視 RKE2 預設的加密設定檔,確認目前 secrets 的加密金鑰。(在 server node 的 OS 執行)
sudo cat /var/lib/rancher/rke2/server/cred/encryption-config.json | jq .執行結果:
{ "kind": "EncryptionConfiguration", "apiVersion": "apiserver.config.k8s.io/v1", "resources": [ { "resources": [ "secrets" ], "providers": [ { "aescbc": { "keys": [ { "name": "aescbckey", "secret": "jJaRyU/gBJNCteq3T1ibCYPgEqMA9GTQHJnqZ9jxmNo=" } ] } }, { "identity": {} } ] } ] }建立一個新的自訂加密設定檔。
重要:必須沿用舊的 secret 金鑰,並在 resources 區塊中新增 configmaps,表示也要對 ConfigMap 進行加密。
sudo nano /etc/rancher/rke2/custom-encryption-config.yaml檔案內容如下:
apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets - configmaps providers: - aescbc: keys: - name: aescbckey secret: "jJaRyU/gBJNCteq3T1ibCYPgEqMA9GTQHJnqZ9jxmNo=" - identity: {}修改 RKE2 的主設定檔,讓 kube-apiserver 啟用我們自訂的加密設定。
encryption-provider-config指向 Pod 內的設定檔路徑。kube-apiserver-extra-mount則將主機上的設定檔掛載進 Pod 中。
sudo nano /etc/rancher/rke2/config.yaml新增的內容如下:
kube-apiserver-arg: - encryption-provider-config=/etc/kubernetes/enc/custom-encryption-config.yaml kube-apiserver-extra-mount: - /etc/rancher/rke2/:/etc/kubernetes/enc/重新啟動 RKE2 伺服器服務以載入新的設定
sudo systemctl restart rke2-server --no-block追蹤 RKE2 的啟動日誌,確保服務正常重啟
sudo journalctl -u rke2-server.service -f檢查 RKE2 服務的最終狀態,確認已成功運行。
sudo systemctl status rke2-server正確執行結果:
● rke2-server.service - Rancher Kubernetes Engine v2 (server) Loaded: loaded (/usr/local/lib/systemd/system/rke2-server.service; enabled; preset: disabled) Active: active (running) since Mon 2025-08-18 16:54:46 CST; 55min ago ...如果是 HA 架構的 RKE2,則依照以上方法,依序將 server node 都做更改
直接從 etcd 讀取一個 ConfigMap 的原始資料。
此時,因為還沒重新寫入,資料內容仍是可讀的明文,表示加密尚未作用於現有物件上。
kubectl -n kube-system exec -it etcd-${$HOSTNAME} \ -- etcdctl \ --cert /var/lib/rancher/rke2/server/tls/etcd/server-client.crt \ --key /var/lib/rancher/rke2/server/tls/etcd/server-client.key \ --cacert /var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \ --endpoints https://127.0.0.1:2379 \ get /registry/configmaps/kube-system/cluster-dns執行結果:
/registry/configmaps/kube-system/cluster-dns k8s v1 ConfigMap� � cluster-dns␦ kube-system"*$2647dbe1-1096-49ea-b25d-bb337ca550742�����y rke2-supervisor@rke2-c1Update␦v����FieldsV1:< :{"f:data":{".":{},"f:clusterDNS":{},"f:clusterDomain":{}}}B clusterDNS 10.43.0.10 cluster.local␦"重新寫入所有的 ConfigMap。這個指令會觸發 API Server 使用新的加密設定將資料加密後再存回 etcd。
kubectl get configmaps --all-namespaces -o json | kubectl replace -f -再次從 etcd 讀取同一個 ConfigMap。這次,資料內容已變成亂碼,表示它已經成功被加密儲存。
kubectl -n kube-system exec -it etcd-${$HOSTNAME} \ -- etcdctl \ --cert /var/lib/rancher/rke2/server/tls/etcd/server-client.crt \ --key /var/lib/rancher/rke2/server/tls/etcd/server-client.key \ --cacert /var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \ --endpoints https://127.0.0.1:2379 \ get /registry/configmaps/kube-system/cluster-dns執行結果:
/registry/configmaps/kube-system/cluster-dns c���V��6ob��E␦���S�T!\��ew�X ����M��� ��g����D���1�G@4��`c�F�R���x��qA�� V,eM2��J���A�ǴW��H�;E<�=XwĔ�A�f>$gC��+��\�T_��;@�7�c�0���^�:) r)��.�~�ºJ���edt�Va<��L�2���m�v@��Շbe��j��D���$7␦YM�#zV� ˊב�H�5dp|)��̿�1{�lʚ�dĢ����;4�K��쒷��+E��␦vN� ���;��? �#�k{�O�@G�"�