在 Azure Stack Hub 上使用 AKS 引擎轮换 Kubernetes 证书

本文档提供了有关如何在现有 AKS 引擎群集上轮换证书的指导,以及有关采用 aks-engine rotate-certs 作为工具的建议。

先决条件

本指南假定你已使用 AKS 引擎部署了群集,并且群集处于正常状态。

规划证书轮换

考虑使用此功能时,请注意,在更新、验证和重启步骤中将无法使用 Kubernetes 控制平面。 请相应地规划此维护操作。 此外,尝试在生产环境中进行维护之前,请计划在具有相同配置的过渡环境中执行此操作。

尝试执行此操作之前,请查看以下注意事项:

备注

对于 AKSe 0.75.3 及更高版本,证书轮换命令以 aks-engine-azurestack 而不是 aks-engine 开头。

  • 你需要能够访问由 aks-engine deployaks-engine generate 命令生成的 API 模型 (apimodel.json)。 默认情况下,此文件放置在一个相对目录(例如 _output/<clustername>/)中。

  • aks-engine rotate-certs 操作会导致 API 服务器停机。

  • aks-engine rotate-certs 需要一个符合群集的当前状态的 API 模型。 aks-engine rotate-certs 在群集节点上执行远程命令,并使用 API 模型信息建立安全的 SSH 连接。 aks-engine rotate-certs 还预期某些资源根据原始 aks-engine 部署进行命名,例如,VM 须遵循 aks-engine 提供的命名。

  • aks-engine rotate-certs 在证书轮换期间依赖于与群集控制平面的工作连接来执行以下操作:

    • 验证过程的每个步骤。
    • 重启/重新创建群集资源,例如 kube-系统 Pod 和服务帐户令牌。

    如果要在不支持外部访问的 VNet 中轮换群集的证书,则必须从能够通过网络访问控制平面的主机 VM(例如,与主 VM 位于同一 VNet 中的 Jumpbox VM)运行 aks-engine rotate-certs

  • 如果要在生产环境中使用 aks-engine rotate-certs,建议在按照相同规范构建的群集上执行证书轮换测试。 也就是说,在执行证书轮换之前,将使用相同的群集配置、同一版本的 AKS 引擎命令行工具和同一组已启用的加载项来构建群集作为你的生产群集。 AKS 引擎支持不同的群集配置,而 AKS 引擎团队运行的端到端测试的范围实际上无法涵盖所有​​可能的配置。 因此,建议你尝试在生产群集上执行该操作之前,在过渡环境中确保特定的群集配置能够与 aks-engine rotate-certs 配合使用。

  • aks-engine rotate-certs保证后向兼容性。 如果你使用 aks-engine 版本 0.60.x 进行了部署,则你应该更喜欢使用版本 0.60.x 执行证书轮换过程。

  • 目前不支持从 Key Vault 提取一组新证书。

  • 请使用可靠的网络连接。 aks-engine rotate-certs 要求执行多个远程命令,这些命令可能会受潜在故障的影响,而故障通常在与群集节点的连接不可靠时发生。 从在目标 Azure Stack 缩放单元上运行的 VM 运行 aks-engine rotate-certs 可以减少暂时性问题的发生。

参数

参数 必需 说明
--api-model 声明了预期的群集配置的 API 模型(群集定义)的相对路径。
--ssh-host 某个可以访问群集中的所有节点的 SSH 侦听器的完全限定的域名 (FQDN) 或 IP 地址。
--linux-ssh-private-key 用于访问群集的 Linux 节点的有效私有 SSH 密钥的路径。
--location 部署了群集的 Azure 位置。
--subscription-id 部署了群集基础结构的 Azure 订阅。
--resource-group 部署了群集基础结构的 Azure 资源组。
--client-id 视情况而定 服务主体客户端 ID。 如果 auth-method 设置为 client_secret 或 client_certificate,则为必需。
--client-secret 视情况而定 服务主体客户端机密。 如果 auth-method 设置为 client_secret,则为必需。
--azure-env 视情况而定 目标云名称。
--certificate-profile 包含新的证书组的 JSON 文件的相对路径。
--force 即使 API 服务器未响应,也强制执行。

轮换证书的简单步骤

对于 AKS 引擎 0.75.3 及更高版本,请在阅读所有要求后,使用适当的参数运行 aks-engine-azurestack rotate-certs(见下文)。

对于 AKS 引擎 0.73.0 及更低版本,请在阅读所有要求后,使用适当的参数运行 aks-engine rotate-certs

./bin/aks-engine rotate-certs \
  --location <resource-group-location> \
  --api-model <generated-apimodel.json> \
  --linux-ssh-private-key <private-SSH-key> \
  --ssh-host <apiserver-URI> \
  --resource-group <resource-group-name> \
  --client-id <service-principal-id> \
  --client-secret <service-principal-secret> \
  --subscription-id <subscription-id> \
  --azure-env <cloud-name>

例如:

./bin/aks-engine rotate-certs \
  --location "chinaeast2" \
  --api-model "_output/my-cluster/apimodel.json" \
  --linux-ssh-private-key "~/.ssh/id_rsa" \
  --ssh-host "my-cluster.chinaeast2.chinacloudapp.cn"\
  --resource-group "my-cluster" \
  --client-id "00001111-aaaa-2222-bbbb-3333cccc4444" \
  --client-secret "00001111-aaaa-2222-bbbb-3333cccc4444" \
  --subscription-id "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" \
  --azure-env "AzureStackCloud"

轮换 front-proxy 证书

备注

对于 AKSe 0.75.3 及更高版本,证书轮换命令以 aks-engine-azurestack 而不是 aks-engine 开头。

作为节点启动过程的组成部分,AKS 引擎为 front-proxy 创建单独的 PKI,并通过 etcd 将其传递到所有节点。 若要有效地重复使用此功能,rotate-certs 必须替换存储在 etcd 中的证书。 front-proxy 证书在 30 年后过期。 aks-engine rotate-certs 转换前代理证书。

故障排除

备注

对于 AKSe 0.75.3 及更高版本,证书轮换命令以 aks-engine-azurestack 而不是 aks-engine 开头。

如果证书轮换过程由于故障或暂时性问题(例如,网络连接故障或问题)而在完成之前停止,则可以放心地使用 --force 标志重新运行 aks-engine rotate-certs

另请注意,aks-engine rotate-certs 会在文件 /var/log/azure/rotate-certs.log (Linux) 和 c:\\k\\rotate-certs.log (Windows) 中记录每个步骤的输出。

若要详细了解运行此操作时在幕后发生的情况,或者要进一步进行自定义,请参阅幕后情况

后续步骤