本文說明如何在 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 以再次輪替憑證。
使用
az aks get-credentials命令連線到您的叢集。az aks get-credentials --resource-group <resource-group> --name <cluster-name>使用
az aks rotate-certs命令,輪替叢集上的所有憑證、CA 和 SA。az aks rotate-certs --resource-group <resource-group> --name <cluster-name>使用任何
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 用戶端憑證
使用帶有
kubectl旗標的az aks get-credentials指令更新--overwrite-existing客戶端憑證。az aks get-credentials --resource-group <resource-group> --name <cluster-name> --overwrite-existing請用指令
kubectl get確認憑證是否已更新。kubectl get nodesNote
若有任何在 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 服務憑證輪替
透過使用
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透過節點 映像升級 或將池縮放到 零 實例數再回溯到想要的值來重新映像你的節點。
相關內容
欲了解更多AKS安全性資訊,請參閱以下文章: