Azure Kubernetes 服务 (AKS) 中的自定义证书颁发机构 (CA) (预览版)
AKS 可生成和使用以下证书、证书颁发机构 (CA) 和服务帐户 (SA):
- AKS API 服务器会创建一个称为“群集 CA”的 CA。
- API 服务器具有一个群集 CA,该 CA 对证书进行签名,以用于从 API 服务器到 kubelet 的单向通信。
- 每个 kubelet 还创建一个证书签名请求 (CSR),该 CSR 由群集 CA 签名,用于从 kubelet 到 API 服务器的通信。
- API 聚合器使用群集 CA 颁发证书,以便与其他 API 进行通信。 API 聚合器也可以拥有自己的 CA 来颁发这些证书,但它目前使用群集 CA。
- 每个节点都使用 SA 令牌,该令牌由群集 CA 签名。
kubectl
客户端具有用于与 AKS 群集通信的证书。
你还可以创建自定义证书颁发机构,以便在 Azure Kubernetes 服务 (AKS) 群集与工作负载(例如专用注册表、代理和防火墙)之间建立信任。 Kubernetes 机密用于存储证书颁发机构的信息,然后将其传递到群集中的所有节点。 此功能按节点池应用,因此你需要在新的和现有的节点池上启用此功能。
本文介绍了如何创建自定义 CA 并将其应用于 AKS 群集。
- Windows 节点池当前不支持此功能。
重要
AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
使用
az extension add
命令安装 aks-preview 扩展。az extension add --name aks-preview
使用
az extension update
命令更新到扩展的最新版本。az extension update --name aks-preview
使用
az feature register
命令注册CustomCATrustPreview
功能标志。az feature register --namespace "Microsoft.ContainerService" --name "CustomCATrustPreview"
状态显示为“已注册”需要几分钟时间。
使用
az feature show
命令验证注册状态。az feature show --namespace "Microsoft.ContainerService" --name "CustomCATrustPreview"
当状态反映为已注册时,使用
az provider register
命令刷新 Microsoft.ContainerService 资源提供程序的注册。az provider register --namespace Microsoft.ContainerService
如果环境要求将自定义 CA 添加到节点信任存储中以便正确预配,则需要在
az aks create
或az aks update
操作期间传递最多包含 10 个证书(以空行分隔)的文本文件。 示例文本文件:-----BEGIN CERTIFICATE----- cert1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- cert2 -----END CERTIFICATE-----
使用
az aks create
命令并为--custom-ca-trust-certificates
参数指定文本文件,在创建节点池期间安装 CA。az aks create \ --resource-group <resource-group-name> \ --name <cluster-name> \ --node-count 2 \ --enable-custom-ca-trust \ --custom-ca-trust-certificates pathToFileWithCAs \ --generate-ssh-keys
使用
az aks update
命令在启动期间更新传递给群集的 CA,并为--custom-ca-trust-certificates
参数指定文本文件。az aks update \ --resource-group <resource-group-name> \ --name <cluster-name> \ --custom-ca-trust-certificates pathToFileWithCAs
备注
此操作会触发模型更新,从而确保新节点具有进行正确预配所需的最新 CA。 AKS 会创建额外的节点、耗尽现有的节点、删除它们,然后用安装了新 CA 集的节点代替它们。
如果可以在没有自定义 CA 的情况下成功预配环境,则可以通过在 kube-system
命名空间中部署机密来提供 CA。 使用此方法,无需重新创建节点即可实现证书轮换。
在
data
域中使用 base64 编码的证书字符串创建 [Kubernetes secret][kubernetes-secrets] YAML 清单。apiVersion: v1 kind: Secret metadata: name: custom-ca-trust-secret namespace: kube-system type: Opaque data: ca1.crt: | {base64EncodedCertStringHere} ca2.crt: | {anotherBase64EncodedCertStringHere}
此机密中的数据用于更新所有节点上的 CA。 请确保机密被命名为
custom-ca-trust-secret
,并且是在kube-system
命名空间中创建的。 通过在kube-system
命名空间中使用机密安装 CA,无需重新创建节点即可实现 CA 轮换。 若要更新或移除 CA,可编辑并应用 YAML 清单。 群集将对更改进行轮询,并相应地更新节点。 应用更改可能需要几分钟的时间。备注
可能需要在节点上重启 containerd 才能正确选取 CA。 如果 CA 似乎未正确添加到节点的信任存储中,则可以从节点的 shell 中使用以下命令触发此类重启:
systemctl restart containerd
使用
az aks create
命令及--enable-custom-ca-trust
参数,将新的 AKS 群集配置为使用自定义 CA。az aks create \ --resource-group <resource-group-name> \ --name <cluster-name> \ --node-count 2 \ --enable-custom-ca-trust \ --generate-ssh-keys
使用
az aks create
命令以及--enable-custom-ca-trust
和--custom-ca-trust-certificates
参数,将新的 AKS 群集配置为使用自定义 CA,并且在节点启动之前安装 CA。az aks create \ --resource-group <resource-group-name> \ --name <cluster-name> \ --node-count 2 \ --enable-custom-ca-trust \ --custom-ca-trust-certificates pathToFileWithCAs \ --generate-ssh-keys
使用
az aks update
命令及--custom-ca-trust-certificates
参数,将现有 AKS 群集配置为在节点启动之前将自定义 CA 添加到节点的信任存储。az aks update \ --resource-group <resource-group-name> \ --name <cluster-name> \ --custom-ca-trust-certificates pathToFileWithCAs
使用
az aks nodepool add
命令及--enable-custom-ca-trust
参数,将新的节点池配置为使用自定义 CA。az aks nodepool add \ --cluster-name <cluster-name> \ --resource-group <resource-group-name> \ --name <node-pool-name> \ --enable-custom-ca-trust \ --os-type Linux
如果没有其他启用了该功能的节点池,则群集必须协调其设置才能使更改生效。 此操作会在 AKS 协调循环中自动发生。 在该操作之前,守护程序集和 Pod 不会显示在群集上。 你可以使用
az aks update
命令触发即时协调操作。 守护程序集和 Pod 将在更新完成后显示。
使用
az aks nodepool update
命令及--enable-custom-ca-trust
参数,将现有节点池配置为使用自定义 CA。az aks nodepool update \ --resource-group <resource-group-name> \ --cluster-name <cluster-name> \ --name <node-pool-name> \ --enable-custom-ca-trust
如果没有其他启用了该功能的节点池,则群集必须协调其设置才能使更改生效。 此操作会在 AKS 协调循环中自动发生。 在该操作之前,守护程序集和 Pod 不会显示在群集上。 你可以使用
az aks update
命令触发即时协调操作。 守护程序集和 Pod 将在更新完成后显示。
AKS 要求传入用户创建的机密中的证书采用正确的格式并经过适当的 base64 编码。 确保传递的 CA 已经过适当的 base64 编码,并且包含 CA 的文件没有 CRLF 换行符。
传递给 --custom-ca-trust-certificates
的证书不应进行 base64 编码。
在节点的 shell 中,运行 systemctl restart containerd
。 重启 containerd 后,容器运行时会正确选取新证书。
有关 AKS 安全性最佳做法的详细信息,请参阅 Azure Kubernetes 服务 (AKS) 中的群集安全性和升级的最佳做法。