本页面介绍如何解决 Google Kubernetes Engine (GKE) Autopilot 集群的问题。
集群问题
无法创建集群:已注册 0 个节点
您在尝试通过已停用或没有所需权限的 IAM 服务账号创建 Autopilot 集群时会发生以下问题。集群创建失败,并显示以下错误消息:
All cluster resources were brought up, but: only 0 nodes out of 2 have registered.
如需解决此问题,请执行以下操作:
检查默认 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 ...
如果服务账号已停用,请启用它:
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) 实例级层停用串行端口日志记录功能。
如需解决此问题,请执行以下操作:
- 要求您的 Google Cloud 组织政策管理员在您的 Autopilot 集群中移除项目中的
compute.disableSerialPortLogging
限制条件。 - 如果您没有强制执行此限制条件的组织政策,请尝试在项目元数据中启用串行端口日志记录。此操作需要
compute.projects.setCommonInstanceMetadata
IAM 权限。
节点无法纵向扩容:已超出 Pod 可用区级资源
当 Autopilot 未在特定可用区为 Pod 预配新节点时,会发生以下问题,因为新节点会违反资源限制。
日志中的错误消息类似于以下内容:
"napFailureReasons": [
{
"messageId": "no.scale.up.nap.pod.zonal.resources.exceeded",
...
此错误指的是 noScaleUp
事件,其中节点自动预配功能未为可用区中的 Pod 预配任何节点组。
如果遇到此错误,请确认以下内容:
- 您的 Pod 具有足够的内存和 CPU。
- Pod IP 地址 CIDR 范围足够大,可以支持您预期的集群大小上限。
工作负载问题
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。