管理及輪換 Azure Kubernetes Service (AKS) 中的憑證

本文說明如何在 Azure Kubernetes Service (AKS) 叢集中管理及輪換憑證,以維持元件間的安全通訊並確保合規性。

先決條件

  • Azure CLI 版本 2.0.77 或更新。 請使用指令 az --version 檢查你的版本。 若要安裝或升級,請參閱安裝 Azure CLI。

請檢查叢集證書授權機構(CA)的證書到期日

請用指令 kubectl config view 查詢叢集 CA 憑證的到期日。

kubectl config view --raw -o jsonpath="{.clusters[?(@.name == '')].cluster.certificate-authority-data}" | base64 -d | openssl x509 -text | grep -A2 Validity

檢查 API 伺服器憑證到期日

請使用以下 curl 指令檢查 API 伺服器憑證的有效期限:

curl https://{apiserver-fqdn} -k -v 2>&1 | grep expire

檢查 VMSS 代理節點憑證的到期日

使用 az vmss run-command invoke 命令檢查虛擬機器擴展集代理程式節點憑證的到期日。

az vmss run-command invoke \
    --resource-group <node-resource-group> \
    --name <vmss-name> \
    --command-id RunShellScript \
    --instance-id 1 \
    --scripts "openssl x509 -in  /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate" \
    --query "value[0].message"

檢查獨立虛擬機憑證的到期日

用指令 az vm run-command invoke 檢查獨立虛擬機的有效期限。

az vm run-command invoke \
    --resource-group <resource-group> \
    --name <vm-name> \
    --command-id RunShellScript \
    --scripts "openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate" \
    --query "value[0].message"

手動輪換叢集 CA 憑證

當您輪換叢集 CA 憑證時,以下子憑證也會被更新:

  • 服務帳戶(SA)令牌
  • API 伺服器憑證
  • Kubelet 用戶端憑證
  • Kubelet 伺服器憑證(如果叢集啟用 kubelet 提供憑證輪替)

Warning

使用 az aks rotate-certs 輪替您的憑證會重新建立您的所有節點、虛擬機器擴展集和磁碟。 這個過程可能導致你的 AKS 叢集最多 30 分鐘的停機 時間。 如果指令在完成前失敗,請使用該 az aks show 指令確認叢集狀態顯示 憑證輪替。 如果叢集處於失敗狀態,請重新執行 az aks rotate-certs 以再次輪替憑證。

  1. 使用 az aks get-credentials 命令連線到您的叢集。

    az aks get-credentials --resource-group <resource-group> --name <cluster-name>
    
  2. 使用 az aks rotate-certs 命令,輪替叢集上的所有憑證、CA 和 SA。

    az aks rotate-certs --resource-group <resource-group> --name <cluster-name>
    
  3. 使用任何 kubectl 命令,例如 kubectl get nodes,確認舊憑證不再有效。

    kubectl get nodes
    

    如果你沒有更新 所 kubectl使用的憑證,你會看到類似以下範例輸出的錯誤:

    Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "ca")
    

更新 kubectl 用戶端憑證

  1. 使用帶有kubectl旗標的az aks get-credentials指令更新--overwrite-existing客戶端憑證。

    az aks get-credentials --resource-group <resource-group> --name <cluster-name> --overwrite-existing
    
  2. 請用指令 kubectl get 確認憑證是否已更新。

    kubectl get nodes
    

    Note

    若有任何在 AKS 上執行的服務,則您可能必須更新憑證。

確認 kubelet 服務憑證輪替是否啟用

開啟功能的每個節點都會自動獲得標籤 kubernetes.azure.com/kubelet-serving-ca=cluster。 請使用 kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca 指令確認標籤是否已設定。

kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca

確認 kubelet 透過 TLS 啟動載入程序

啟用此功能後,在您的各個節點上執行的每個 kubelet 都會經過服務用 TLS 啟動程序。

請使用 kubectl get 指令確認啟動過程是否正在進行,取得叢集內目前的 CSR 物件。

kubectl get csr --field-selector=spec.signerName=kubernetes.io/kubelet-serving

所有現用中的 CSR 都處於 Approved,Issued 狀態,這表示該 CSR 已獲核准,並已簽發簽署的憑證。 服務 CSR 的簽署者名稱為 kubernetes.io/kubelet-serving。 例如:

NAME        AGE    SIGNERNAME                                    REQUESTOR                    REQUESTEDDURATION   CONDITION
csr-1ab2c   113s   kubernetes.io/kube-apiserver-client-kubelet   system:bootstrap:abcd1e      none              Approved,Issued
csr-defgh   111s   kubernetes.io/kubelet-serving                 system:node:akswinp1000000   none              Approved,Issued
csr-ij3kl   46m    kubernetes.io/kubelet-serving                 system:node:akswinp2000000   none              Approved,Issued
csr-mn4op   46m    kubernetes.io/kube-apiserver-client-kubelet   system:bootstrap:ab1cde      none              Approved,Issued

確認 kubelet 使用從伺服器 TLS 啟動載入取得的憑證

確認節點的 kubelet 是否使用由叢集 CA 簽署的服務憑證,並使用 [kubectl debug][kubectl-debug] 指令檢查 kubelet 的 PKI 目錄內容。

kubectl debug node/<node> -ti --image=mcr.microsoft.com/azurelinux/base/core:3.0 -- ls -l /host/var/lib/kubelet/kubelet-server-current.pem

若存在 kubelet-server-current.pem 符號連結,kubelet 會透過 TLS 引導流程為自己的服務憑證進行引導與輪替,且該憑證會由叢集 CA 簽署。

停用 kubelet 服務憑證輪替

  1. 透過使用 az aks nodepool update 指令更新節點集區並指定 aks-disable-kubelet-serving-certificate-rotation=true 標籤,以停用 kubelet 服務憑證輪替。

    az aks nodepool update \
        --cluster-name <cluster-name> \
        --resource-group <resource-group> \
        --name <node-pool-name> \
        --tags aks-disable-kubelet-serving-certificate-rotation=true
    
  2. 透過節點 映像升級 或將池縮放到 零 實例數再回溯到想要的值來重新映像你的節點。

欲了解更多AKS安全性資訊,請參閱以下文章: