你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Kubernetes 服务 (AKS) 中的自定义证书颁发机构 (CA) (预览版)

本文介绍了如何创建自定义 CA 并将其应用于 AKS 群集。

先决条件

  • Azure 订阅。 如果还没有 Azure 订阅,可以创建一个免费帐户
  • 已安装 Azure CLI(2.43.0 或更高版本)。
  • 一个 base64 编码的证书字符串或一个包含证书的文本文件。

限制

  • Windows 节点池当前不支持此功能。

安装 Azure CLI aks-preview 扩展

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

  1. 使用 az extension add 命令安装 aks-preview 扩展。

    az extension add --name aks-preview
    
  2. 使用 az extension update 命令更新到扩展的最新版本。

    az extension update --name aks-preview
    

注册 CustomCATrustPreview 功能标志

  1. 使用 az feature register 命令注册 CustomCATrustPreview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "CustomCATrustPreview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "CustomCATrustPreview"
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

在 AKS 节点池上安装自定义 CA

在 AKS 节点池上安装 CA

  • 如果环境要求将自定义 CA 添加到节点信任存储中以便正确预配,则需要在 az aks createaz 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 机密 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

  • 使用带 --disable-custom-ca-trust 参数的 az aks nodepool update 命令在现有节点池上禁用自定义 CA 功能。

    az aks nodepool update \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --disable-custom-ca-trust
    

故障排除

功能已启用并添加了带 CA 的机密,但操作失败并出现“X.509 证书由未知授权机构签名”错误

机密中传递的证书格式不正确

AKS 要求传入用户创建的机密中的证书采用正确的格式并经过适当的 base64 编码。 确保传递的 CA 已经过适当的 base64 编码,并且包含 CA 的文件没有 CRLF 换行符。 传递给 --custom-ca-trust-certificates 的证书不应进行 base64 编码。

containerd 尚未选取新证书

在节点的 shell 中,运行 systemctl restart containerd。 重启 containerd 后,容器运行时会正确选取新证书。

后续步骤

有关 AKS 安全性最佳做法的详细信息,请参阅 Azure Kubernetes 服务 (AKS) 中的群集安全性和升级的最佳做法