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 群集。

先决条件

  • 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 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) 中的群集安全性和升级的最佳做法