排查 Autopilot 集群问题


本页面介绍如何解决 Google Kubernetes Engine (GKE) Autopilot 集群的问题。

集群问题

无法创建集群:已注册 0 个节点

您在尝试通过已停用或没有所需权限的 IAM 服务账号创建 Autopilot 集群时会发生以下问题。集群创建失败,并显示以下错误消息:

All cluster resources were brought up, but: only 0 nodes out of 2 have registered.

如需解决此问题,请执行以下操作:

  1. 检查默认 Compute Engine 服务账号或您要使用的自定义 IAM 服务账号是否已停用:

    gcloud iam service-accounts describe SERVICE_ACCOUNT
    

    SERVICE_ACCOUNT 替换为服务账号电子邮件地址,例如 my-iam-account@my-first-project.iam.gserviceaccount.com

    如果服务账号已停用,则输出类似于以下内容:

    disabled: true
    displayName: my-service-account
    email: my-service-account@my-project.iam.gserviceaccount.com
    ...
    
  2. 如果服务账号已停用,请启用它:

    gcloud iam service-accounts enable SERVICE_ACCOUNT
    

如果在启用该服务账号后仍然出现该错误,请向该服务账号授予 GKE 所需的最低权限:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:SERVICE_ACCOUNT" \
    --role roles/container.nodeServiceAccount

当集群有 0 个节点时,命名空间卡在终止状态

当您在集群缩减到零个节点后删除集群中的命名空间时,会出现以下问题。metrics-server 组件无法接受命名空间删除请求,因为该组件没有副本。

如需诊断此问题,请运行以下命令:

kubectl describe ns/NAMESPACE_NAME

NAMESPACE_NAME 替换为命名空间的名称。

输出如下所示:

Discovery failed for some groups, 1 failing: unable to retrieve the complete
list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to
handle the request

如需解决此问题,请扩容任何工作负载以触发 GKE 来创建新节点。节点准备就绪后,命名空间删除请求会自动完成。在 GKE 删除命名空间后,请缩减工作负载。

扩缩问题

节点纵向扩容失败:Pod 存在不被安排的风险

当您在 Google Cloud 项目中停用串行端口日志记录功能时,会发生以下问题。GKE Autopilot 集群需要串行端口日志记录功能才能有效调试节点问题。如果停用串行端口日志记录功能,则 Autopilot 无法预配节点来运行工作负载。

Kubernetes 事件日志中的错误消息类似于以下内容:

LAST SEEN   TYPE      REASON          OBJECT                          MESSAGE
12s         Warning   FailedScaleUp   pod/pod-test-5b97f7c978-h9lvl   Node scale up in zones associated with this pod failed: Internal error. Pod is at risk of not being scheduled

通过实施 compute.disableSerialPortLogging 限制条件的组织政策,可以在组织级层停用串行端口日志记录功能。您也可以在项目或虚拟机 (VM) 实例级层停用串行端口日志记录功能。

如需解决此问题,请执行以下操作:

  1. 要求您的 Google Cloud 组织政策管理员在您的 Autopilot 集群中移除项目中的 compute.disableSerialPortLogging 限制条件
  2. 如果您没有强制执行此限制条件的组织政策,请尝试在项目元数据中启用串行端口日志记录。此操作需要 compute.projects.setCommonInstanceMetadata IAM 权限

节点无法纵向扩容:已超出 Pod 可用区级资源

当 Autopilot 未在特定可用区为 Pod 预配新节点时,会发生以下问题,因为新节点会违反资源限制。

日志中的错误消息类似于以下内容:

    "napFailureReasons": [
            {
              "messageId": "no.scale.up.nap.pod.zonal.resources.exceeded",
              ...

此错误指的是 noScaleUp 事件,其中节点自动预配功能未为可用区中的 Pod 预配任何节点组

如果遇到此错误,请确认以下内容:

工作负载问题

Pod 卡滞在“待处理”状态

如果您为 Pod 选择了特定节点,但 Pod 和 DaemonSet 中必须在该节点上运行的资源请求总和超过该节点的可分配容量上限,则 Pod 可能会卡在 Pending 状态。这可能会导致您的 Pod 变为 Pending 状态并保持未安排状态。

为避免此问题,请评估已部署的工作负载的大小,以确保它们不超过受支持的 Autopilot 资源请求上限

您还可以尝试在安排常规工作负载 Pod 之前安排 DaemonSet。

特定节点上的工作负载性能持续不可靠

在 GKE 1.24 及更高版本中,如果特定节点上的工作负载持续出现中断、崩溃或类似不可靠的行为,您可以使用以下命令封锁有问题的节点,从而将此节点告知 GKE:

kubectl drain NODE_NAME --ignore-daemonsets

NODE_NAME 替换为有问题的节点的名称。您可以通过运行 kubectl get nodes 找到节点名称。

GKE 会执行以下操作:

  • 从节点逐出现有工作负载并停止在该节点上调度工作负载。
  • 在其他节点上自动重新创建由控制器(例如 Deployment 或 StatefulSet)管理的任何被逐出的工作负载。
  • 终止保留在节点上的所有工作负载,并随着时间的推移修复或重新创建节点。
  • 如果您使用 Autopilot,GKE 会立即关闭并替换节点,并忽略任何已配置的 PodDisruptionBudget。