本页面介绍了如何变换 GKE 集群凭据。规划并定期变换集群凭据对于保持集群处于健康状态至关重要。在本页中,您将了解如何执行凭据变换。您还将了解规划定期变换的最佳实践。
本页面适用于负责 GKE 集群上凭证生命周期的安全专家。如需详细了解我们在 Trusted Cloud by S3NS 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
GKE 中的凭据轮替简介
集群根证书授权机构 (CA) 的生命周期有限。CA 过期后,所有由 CA 签名的凭据将不再有效,包括集群客户端证书(来自 MasterAuth
API 字段)、API 服务器的密钥和证书以及 kubelet 客户端证书。
集群凭据的有效期取决于您创建集群的时间或上次变换凭据的时间。如需了解详情,请查看凭据的有效期。
您可以执行凭证变换以便为集群撤消凭证并颁发新凭证。此操作会轮替集群 CA 私钥,并需要重新创建节点以使用新凭据。您必须在当前凭证到期之前为集群启动和完成凭证变换。除变换凭证外,凭证变换还执行 IP 地址变换。
何时执行凭证变换
您应在当前凭据到期日期之前定期执行凭据轮替。凭据轮替需要重新创建节点才能使用新凭据,这可能会中断正在运行的工作负载。规划维护时段并在维护窗口执行变换,以避免工作负载意外停机或集群外部的 API 客户端无响应。
如需详细了解维护可用性如何影响凭证变换,以及集群在变换步骤期间会遇到哪种类型的中断,请参阅使用节点升级策略并遵循维护政策重新创建节点的手动更改表中的凭证变换对应行。GKE 依赖于资源可用性来更新节点。如需详细了解节点更新,请参阅规划节点更新中断。
集群凭证生命周期
集群凭据的生命周期通常取决于集群的创建时间或凭据的最近变换时间:
- 大约在 2021 年 10 月之前创建的集群的 CA 有效期为 5 年。
- 大约在 2021 年 10 月之后创建的集群的 CA 有效期为 30 年。
- 大约在 2022 年 1 月之后变换的集群的 CA 有效期为 30 年。
查找凭证即将过期或已过期的集群
如果集群的凭据将在未来 180 天内过期,或者集群的凭据已过期,则 GKE 会提供包含数据分析和建议的指导,说明您必须为此集群执行凭据轮替。此指导包含凭据的过期日期。您可以在 Trusted Cloud 控制台中查看此指导。或者,您可以使用 gcloud CLI 或 Recommender API 查看此指导,并指定 CLUSTER_CA_EXPIRATION
子类型。
如果您收到集群的数据分析和建议,则必须执行凭证变换,否则 GKE 会在当前 CA 过期日期前的 30 天内自动启动凭证变换,如下一部分所述。凭据轮替完成后,分析和建议最多可能需要 36 小时才能生成。
用于防止集群服务中断的 GKE 自动化政策
为了防止集群在当前凭据过期时进入不可恢复的状态,GKE 会在当前 CA 过期日期前的 30 天内自动启动凭据轮替。例如,您的集群 CA 于 2024 年 1 月 6 日过期,而您未在 2023 年 12 月 5 日之前变换凭据。GKE 会在 2023 年 12 月 7 日或之后启动自动变换,并会在操作开始七天后尝试完成此变换。这种自动变换是用于防止集群服务中断的最后手段,因此请考虑以下事项:
- 自动变换通常会遵循维护窗口或维护排除项,但 GKE 保留在到期日后 30 天内执行变换凭据的步骤的权利,无论是否有可用的维护。在 30 天内,GKE 会忽略第一步(即启动变换)的维护可用性。
- 如果维护可用性阻止 GKE 最初完成变换,GKE 会继续尝试完成变换,直到凭据过期,之后集群将无法恢复。
- 凭证变换完成后,到期的凭证将被撤消。除非您将客户端配置为使用新凭据,否则集群外部的 Kubernetes API 客户端(如本地环境中的 kubectl)将无法运行
- 在变换期间重新创建节点池可能会导致正在运行的工作负载中断。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
检查凭据生命周期
我们建议您在执行凭证变换前后检查凭证生命周期,以便了解集群根 CA 的有效性。
如需检查单个集群的凭据生命周期,请运行以下命令:
gcloud container clusters describe CLUSTER_NAME \
--location LOCATION \
--format "value(masterAuth.clusterCaCertificate)" \
| base64 --decode \
| openssl x509 -noout -dates
输出类似于以下内容:
notBefore=Mar 17 16:45:34 2023 GMT
notAfter=Mar 9 17:45:34 2053 GMT
如果您在启动凭据轮替后运行此命令,输出内容将是原始证书的有效期。此证书在您完成变换之前一直有效。变换完成后,输出内容为新证书的有效期。
如需检查项目中所有集群的凭据生命周期,请运行以下命令:
gcloud container clusters list --project PROJECT_ID \
--format="value(name,masterAuth.clusterCaCertificate)" | \
while read -r cluster ca; do \
expiry_date=$(echo -e "$ca" | base64 --decode | openssl x509 -noout -enddate | awk -F'=' '{print $2}'); \
printf "%-40s | %s\n" "$cluster" "$expiry_date" ; \
done | \
column -t | \
awk -F',' 'BEGIN{print "Cluster Name | Certificate Expiry Date"} {print}'
执行凭证变换
任何凭证变换都涉及以下步骤:
- 开始轮替:除了原始 IP 地址以外,控制平面还会通过新 IP 地址开始处理流量。新凭据会颁发给工作负载和控制平面。
- 重新创建节点:GKE 会重新创建集群节点,以便节点使用新的 IP 地址和凭据,并遵循可用的维护窗口和排除项。 您还可以通过将节点版本升级到节点已在运行的同一 GKE 版本,手动重新创建节点。
- 更新 API 客户端:启动轮替后,更新任何集群 API 客户端(例如使用
kubectl
的开发机器),以使用新的 IP 地址与控制平面进行通信。 - 完成轮替:控制平面会停止通过原始 IP 地址处理流量。旧凭据会被撤销,包括 Kubernetes ServiceAccount 的任何现有静态凭据。
当您启动凭证变换或 GKE 自动启动变换时,GKE 会自动执行这些步骤,包括尝试完成变换。在每个步骤中,如果集群到期时间距现在超过 30 天,GKE 会考虑维护可用性。在集群到期前的自动变换期间,GKE 保留忽略维护可用性的权利,以防止集群无法恢复。在 30 天内,GKE 会忽略第一步(即启动变换)的维护可用性。
如果您未在启动凭证变换后的七天内完成变换,则 GKE 会尝试为您完成变换。如果集群中的任何节点仍使用之前的凭据,则自动完成操作会失败,但 GKE 会继续尝试完成操作,直到凭据过期且集群无法恢复为止。您应计划手动跟踪和完成您启动的所有凭据变换。如需替换维护可用性阻止程序,请运行以下各部分中的命令,以手动触发变换过程的这些阶段。请勿依赖自动完成,这是尽力而为的措施。
启动轮替
如需启动凭证变换,请运行以下命令:
gcloud container clusters update CLUSTER_NAME \
--location LOCATION \
--start-credential-rotation
此命令会创建新凭据,向控制平面颁发这些凭据,并将控制平面配置为通过两个 IP 地址(原始 IP 地址和新 IP 地址)处理流量。
重新创建节点
重新配置 API 服务器以在新 IP 地址上提供服务后,如果有可用的维护窗口,GKE 会自动更新节点以使用新的 IP 地址和凭据。GKE 会将所有节点升级到节点已经运行的 GKE 版本,从而重新创建节点。如需了解详情,请参阅节点池升级。
默认情况下,GKE 会在您启动操作七天后自动完成凭据轮替。如果集群中的活跃维护窗口或排除项阻止 GKE 在这七天内重新创建某些节点,则凭证变换最初无法完成。不过,GKE 会继续尝试重新创建节点并完成变换,直到维护可用性允许 GKE 继续操作为止。 在 Trusted Cloud Next 等重大事件期间,GKE 也可能会暂停自动重新创建节点,以免发生中断。
如果您使用可能导致轮替失败的维护排除项或维护窗口,请手动升级集群以强制重新创建节点:
gcloud container clusters upgrade CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION
将
VERSION
替换为集群已在使用的同一 GKE 版本。如需了解详情,请参阅遵循 GKE 维护政策的手动更改。
检查节点池重新创建的进度
要启动轮替操作,请运行以下命令:
gcloud container operations list \ --filter="operationType=UPGRADE_NODES AND status=RUNNING" \ --format="value(name)"
此命令返回节点升级操作的 ID。
要轮询操作,请将操作 ID 传递给以下命令:
gcloud container operations wait OPERATION_ID
节点池会逐一重新创建,并且每个节点池都有自己的操作。如果您有多个节点池,请按照以下说明轮询每个操作。
更新 API 客户端
启动凭证变换后,您必须更新集群外的所有 API 客户端(例如开发者机器上的 kubectl
)才能使用新凭证并指向控制平面的新 IP 地址。
要更新 API 客户端,请为每个客户端运行以下命令:
gcloud container clusters get-credentials CLUSTER_NAME \
--location LOCATION
更新 Kubernetes ServiceAccount 凭据
如果您在集群的 ServiceAccount 中使用静态凭据,请切换到短期凭据。完成变换后,现有的服务账号凭据将失效。如果您不想使用短期凭据,请确保在完成轮替后为集群中的所有 ServiceAccounts 重新创建静态凭据。
更新硬编码 IP 地址和防火墙规则
如果您在环境中对控制平面的 IP 地址进行了硬编码,或者有防火墙规则以控制平面的 IP 地址为目标,请将地址更新为新的 IP 地址。如果您完成轮替但未在应用和防火墙规则中更新 IP 地址,则当 GKE 停止在之前的控制平面 IP 地址上提供服务时,这些资源可能会中断。
完成轮替
更新集群外部的 API 客户端后,请完成轮替以将控制平面配置为仅通过新凭据和新 IP 地址处理流量:
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION \
--complete-credential-rotation
如果凭证变换无法完成,并返回类似于以下内容的错误消息,请参阅错误 400:节点池需要重新创建:
ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.
在自动完成变换时,GKE 会遵循维护可用性,但 GKE 可能会在过期后的 30 天内忽略此可用性,以防止集群无法恢复。如果变换最初未能完成,并且变换至少在七天前开始,则 GKE 会尝试在凭据到期之前完成变换,之后集群将无法恢复。