本文介绍如何管理和轮换Azure Kubernetes 服务 (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"
检查独立 VM 证书过期日期
使用 az vm run-command invoke 命令检查独立 VM 的到期日期。
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 命令验证集群状态是否显示为 Certificate Rotating。 如果群集处于失败状态,请重新运行 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 nodes注释
如果有任何服务在 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 引导获取的证书
使用 [kubectl debug][kubectl-debug] 命令检查 kubelet 的 PKI 目录内容,确认节点的 kubelet 是否正在使用由群集 CA 签名的服务证书。
kubectl debug node/<node> -ti --image=mcr.azk8s.cn/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 安全性的详细信息,请参阅以下文章: