排查升级问题


本页面介绍如何解决 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 角色与最新次要版本中的默认政策自动协调{track-name="k8sLink" track-type="troubleshooting"}。系统角色的默认政策有时会在新的 Kubernetes 版本中发生变化。

为了执行此协调,GKE 会在集群中创建或更新 ClusterRole 和 ClusterRoleBinding。如果您的网络钩子因默认 RBAC 政策使用的权限范围而拦截或拒绝创建请求或更新请求,则 API 服务器无法在新的次要版本上运行。

问题:标准集群升级后逐出的工作负载

如果满足以下所有条件,则集群升级后您的工作负载可能面临驱出的风险:

  • 当集群的控制平面运行新的 GKE 版本时,系统工作负载需要更多空间。
  • 现有节点没有足够的资源来运行新的系统工作负载和现有工作负载。
  • 为集群停用了集群自动扩缩器。

如需解决此问题,请尝试执行以下步骤:

问题:节点版本与控制平面版本不兼容

请检查集群的控制平面正在运行的 Kubernetes 版本,然后检查集群的节点池正在运行的 Kubernetes 版本。如果集群的任一节点池比控制平面高两个次要版本,则可能会导致您的集群出现问题。

GKE 团队会代表您定期升级集群控制平面。控制平面将升级到较新的 Kubernetes 稳定版本。默认情况下,集群的节点已启用自动升级,我们建议您不要将其停用

如果集群的节点已停用自动升级,并且您未将节点池版本手动升级到与控制平面兼容的版本,则您的控制平面最终会与节点不兼容,因为控制平面会随着时间的推移自动升级。集群的控制平面与节点之间不兼容会导致出现意外问题。

Kubernetes 版本和版本倾斜支持政策指出控制平面与最多比控制平面低两个次要版本的节点兼容。例如,Kubernetes 1.19 控制层面与 Kubernetes 1.19、1.18 和 1.17 节点兼容。要解决此问题,请手动将节点池版本升级到与控制平面兼容的版本。

如果您担心升级过程会导致受影响节点上运行的工作负载出现中断情况,请完成以下步骤,将您的工作负载迁移到新节点池:

  1. 使用兼容版本创建新节点池
  2. Cordon现有节点池的节点。
  3. 可选:更新现有节点池上运行的工作负载,以为标签 cloud.google.com/gke-nodepool:NEW_NODE_POOL_NAME 添加 nodeSelector,其中 NEW_NODE_POOL_NAME 是新节点池的名称。这可以确保 GKE 将这些工作负载放置在新节点池中的节点上。
  4. 排空现有节点池。
  5. 检查工作负载是否在新节点池中成功运行。如果是,您可以删除旧节点池。如果您发现工作负载中断,请通过解除现有节点池中的节点封锁并排空新节点,重新安排现有节点上的工作负载。排查问题并重试。

问题:配置“节点可分配”后,Pod 陷入待处理状态

配置节点可分配资源并执行节点版本升级后,您可能会注意到,正在运行的 Pod 会更改为待处理状态。

如果 Pod 在升级后处于待处理状态,我们建议执行以下操作:

  • 确保 Pod 的 CPU 和内存请求没有超出峰值使用量。如果 GKE 为开销预留了 CPU 和内存,则 Pod 无法请求这些资源。如果 Pod 请求的 CPU 或内存超出其使用量,则会阻止其他 Pod 请求这些资源,而且可能会导致集群利用率过低。如需了解详情,请参阅如何安排具有资源请求的 Pod

  • 请考虑调整集群大小。如需查看相关说明,请参阅调整集群大小

  • 通过将集群降级来还原此更改。如需查看相关说明,请参阅手动升级集群或节点池

后续步骤

如果您需要其他帮助,请与 Cloud Customer Care 联系。