在 Azure Kubernetes 服务 (AKS) 中管理和轮换证书

本文介绍如何管理和轮换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 以再次轮换证书。

  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
    

    注释

    如果有任何服务在 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 服务证书轮换

  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 安全性的详细信息,请参阅以下文章: