本页面介绍如何解决 Google Kubernetes Engine (GKE) 集群升级的问题。
如果您需要其他帮助,请与 Cloud Customer Care 联系。控制平面升级后 kube-apiserver 运行状况不佳
对集群 GKE 版本启动手动控制平面升级时,会出现以下问题。某些用户部署的准入网络钩子可以阻止系统组件创建正常运行所需的宽松 RBAC 角色。在控制平面升级期间,Google Cloud 会重新创建 Kubernetes API 服务器 (kube-apiserver) 组件。如果网络钩子阻止 API 服务器组件的 RBAC 角色,则 API 服务器将不会启动,并且集群升级也不会完成。
gcloud CLI 中的错误消息类似于以下内容:
FAILED: All cluster resources were brought up, but: component "KubeApiserverReady" from endpoint "readyz of kube apiserver is not successful" is unhealthy.
如需确定失败的网络钩子,请检查 GKE 审核日志中是否具有包含以下信息的 RBAC 调用:
protoPayload.resourceName="RBAC_RULE"
protoPayload.authenticationInfo.principalEmail="system:apiserver"
RBAC_RULE
是 RBAC 角色的全名,例如 rbac.authorization.k8s.io/v1/clusterroles/system:controller:horizontal-pod-autoscaler
。
失败的网络钩子的名称以如下格式显示在日志中:
admission webhook WEBHOOK_NAME denied the request
如需解决此问题,请尝试执行以下操作:
- 调整限制条件,允许创建和更新具有
system:
前缀的 ClusterRole。 - 调整网络钩子,不拦截用于创建和更新系统 RBAC 角色的请求。
- 停用网络钩子。
为什么会出现这种情况?
Kubernetes 会将默认系统 RBAC 角色与最新次要版本中的默认政策自动协调。系统角色的默认政策有时会在新的 Kubernetes 版本中发生变化。
为了执行此协调,GKE 会在集群中创建或更新 ClusterRole 和 ClusterRoleBinding。如果您的网络钩子因默认 RBAC 政策使用的权限范围而拦截或拒绝创建请求或更新请求,则 API 服务器无法在新的次要版本上运行。
标准集群升级后逐出的工作负载
如果满足以下所有条件,则集群升级后您的工作负载可能面临驱出的风险:
- 当集群的控制平面运行新的 GKE 版本时,系统工作负载需要更多空间。
- 现有节点没有足够的资源来运行新的系统工作负载和现有工作负载。
- 集群已停用集群自动扩缩器。
如需解决此问题,请尝试执行以下步骤: