规划并定期转换集群凭据对于保持集群处于健康状态至关重要。本文档将向您介绍如何执行凭据轮替,并提供规划定期轮替的最佳实践。
本文档适用于负责 GKE 集群上凭证生命周期的安全专家。如需详细了解我们在 Cloud de Confiance by S3NS 内容中提及的 常见角色和示例任务,请参阅 常见的 GKE 用户角色和任务。
GKE 中的凭据轮替简介
集群根证书授权机构 (CA) 的生命周期有限。CA 过期后,所有由 CA 签名的凭据将不再有效,包括集群客户端证书(来自 MasterAuth API 字段)、API 服务器的密钥和证书以及 kubelet 客户端证书。
集群凭据的有效期取决于您创建集群的时间或上次转换凭据的时间。如需了解详情,请查看凭据
生命周期。
您可以通过执行以下任一类型的轮替来撤消和重新颁发这些凭据。
凭据轮替:
-
- 轮替控制平面用于 Kubernetes API 服务器的 IP 地址。
- 轮替集群根 CA。
对于这两种轮替类型,必须先重新创建节点,然后才能使用新凭据。
何时执行凭证转换
您应在当前凭据到期日期之前定期执行凭据轮替。凭据轮替需要重新创建节点才能使用新凭据,这可能会中断正在运行的工作负载。规划维护时段并在维护窗口执行变换,以避免工作负载意外停机或集群外部的 API 客户端无响应。
如需详细了解维护可用性如何影响凭证变换,以及集群在变换步骤期间会遇到哪种类型的中断,请参阅使用节点升级策略并遵循维护政策重新创建节点的手动更改表中的凭证变换对应行。GKE 依赖于 资源 可用性 来更新 节点。如需详细了解节点更新,请参阅规划节点更新中断。
集群凭证生命周期
集群凭据的生命周期通常取决于集群的创建时间或凭据的最近变换时间:
- 大约在 2021 年 10 月之前创建的集群的 CA 有效期为 5 年。
- 大约在 2021 年 10 月之后创建的集群的 CA 有效期为 30 年。
- 大约在 2022 年 1 月之后变换的集群的 CA 有效期为 30 年。
查找凭证即将过期或已过期的集群
如果集群的凭据将在未来 180 天内过期,或者集群的凭据已过期,则 GKE 会提供包含数据分析和建议的指导,说明您必须为此集群执行凭据轮替。此指导包含凭据的过期日期。您可以在 Cloud de Confiance 控制台中查看此指导。或者,您可以使用 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命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
- 确保您已有 Autopilot 或 Standard 集群。如果需要,请创建 Autopilot 集群。
检查凭据生命周期
在执行凭据轮替前后检查凭据生命周期,以便了解集群根 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 地址)处理流量。
重启具有长效连接的集群内组件
启动 IP 地址或凭证轮替后,集群的证书授权机构 (CA) 也会进行轮替。某些保持 TLS 长效连接的集群内组件(例如 metrics-server 和 konnectivity-agent)可能不会自动信任新的集群 CA。
这种情况可能会导致这些连接在与节点或其他集群端点通信时失败,您可能会在组件日志中看到 TLS 握手错误,例如 x509: certificate signed by unknown authority。
如果您在启动轮替后观察到这些错误,则可能需要手动重启 Pod。重启会强制 Pod 重新初始化其连接并加载新的集群 CA 证书。例如,如要重启 metrics-server 和 konnectivity-agent,请运行以下命令:
kubectl rollout restart deployment metrics-server -n kube-system
kubectl rollout restart deployment konnectivity-agent -n kube-system
重新创建节点
重新配置 API 服务器以在新 IP 地址上提供服务后,如果有可用的维护窗口,GKE 会自动更新节点以使用新的 IP 地址和凭据。GKE 会将所有节点升级到节点已经运行的 GKE 版本,从而重新创建节点。如需了解详情,请参阅节点池升级。
默认情况下,GKE 会在您启动操作七天后自动完成凭据轮替。如果集群中的活跃维护窗口或排除项阻止 GKE 在这七天内重新创建某些节点,则凭证变换最初无法完成。不过,GKE 会继续尝试重新创建节点并完成变换,直到维护可用性允许 GKE 继续操作为止。 在 Cloud de Confiance Next 等重大活动期间,GKE 也可能会暂停自动节点重新创建,以免您遭遇服务中断。
如果您使用的维护排除项或维护窗口可能导致轮替失败,请执行以下步骤之一,强制 GKE 重新创建您的节点:
对于 Autopilot 集群,手动升级您的控制平面:
gcloud container clusters upgrade CLUSTER_NAME \ --location=LOCATION \ --master \ --cluster-version=VERSION将
VERSION替换为集群已在使用的同一 GKE 版本。对于 Standard 集群,手动升级每个节点池。
如需了解详情,请参阅遵循 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 中使用静态凭据,请切换到短期凭据。完成转换后,现有的服务账号凭据将失效。如果您不想使用短期有效的凭证, 请确保在完成转换后为集群中的所有 ServiceAccount 重新创建静态凭证。
如需查找集群中存在的静态 ServiceAccount 凭证,请运行以下命令:
kubectl get secrets --all-namespaces --field-selector type=kubernetes.io/service-account-token
如果此命令的输出为 No resources found,则表示集群没有静态 ServiceAccount 凭证。
更新硬编码 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 会尝试在凭据到期之前完成变换,之后集群将无法恢复。
后续步骤
- 详细了解 Kubernetes Secret 对象。
- 了解如何轮替控制平面 IP。
- 了解 GKE RBAC 的最佳实践。
- 详细了解如何排查 GKE 问题。