Skip to content

antony@notes:~/rancher$ cat "RKE2-設定-configmap-加密儲存在-etcd.md"

RKE2 設定 configmap 加密儲存在 etcd

2025-08-19· rancher

RKE2 設定 configmap 加密儲存在 etcd

RKE2 預設會把 secret 做加密儲存

  1. 檢視 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": {}
            }
          ]
        }
      ]
    }
  2. 建立一個新的自訂加密設定檔。

    重要:必須沿用舊的 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: {}
  3. 修改 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/
  4. 重新啟動 RKE2 伺服器服務以載入新的設定

    sudo systemctl restart rke2-server --no-block
  5. 追蹤 RKE2 的啟動日誌,確保服務正常重啟

    sudo journalctl -u rke2-server.service -f
  6. 檢查 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
    ...
  7. 如果是 HA 架構的 RKE2,則依照以上方法,依序將 server node 都做更改

  8. 直接從 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␦"
  9. 重新寫入所有的 ConfigMap。這個指令會觸發 API Server 使用新的加密設定將資料加密後再存回 etcd。

    kubectl get configmaps --all-namespaces -o json | kubectl replace -f -
  10. 再次從 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�"�