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 节点池当前不支持此功能。
安装 Azure CLI aks-preview
扩展
重要
AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
使用
az extension add
命令安装 aks-preview 扩展。az extension add --name aks-preview
使用
az extension update
命令更新到扩展的最新版本。az extension update --name aks-preview
注册 CustomCATrustPreview
功能标志
使用
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
在 AKS 节点池上安装自定义 CA
在 AKS 节点池上安装 CA
如果环境要求将自定义 CA 添加到节点信任存储中以便正确预配,则需要在
az aks create
或az aks update
操作期间传递最多包含 10 个证书(以空行分隔)的文本文件。 示例文本文件:-----BEGIN CERTIFICATE----- cert1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- cert2 -----END CERTIFICATE-----
在创建节点池期间安装 CA
使用
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
在节点池启动期间进行 CA 轮换以实现可用性
使用
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
如果可以在没有自定义 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
配置新的 AKS 群集以使用自定义 CA
使用
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
将新的 AKS 群集配置为使用自定义 CA,并且在节点启动之前安装 CA
使用
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
将现有 AKS 群集配置为在节点启动之前安装自定义 CA
使用
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
将新节点池配置为使用自定义 CA
使用
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 将在更新完成后显示。
将现有节点池配置为使用自定义 CA
使用
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 将在更新完成后显示。
疑难解答
功能已启用并添加了带 CA 的机密,但操作失败并出现“X.509 证书由未知授权机构签名”错误
机密中传递的证书格式不正确
AKS 要求传入用户创建的机密中的证书采用正确的格式并经过适当的 base64 编码。 确保传递的 CA 已经过适当的 base64 编码,并且包含 CA 的文件没有 CRLF 换行符。
传递给 --custom-ca-trust-certificates
的证书不应进行 base64 编码。
containerd 尚未选取新证书
在节点的 shell 中,运行 systemctl restart containerd
。 重启 containerd 后,容器运行时会正确选取新证书。
后续步骤
有关 AKS 安全性最佳做法的详细信息,请参阅 Azure Kubernetes 服务 (AKS) 中的群集安全性和升级的最佳做法。