排查常见问题

本页面介绍了如何解决 GKE on AWS 的常见问题。

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

常见的错误消息

以下部分介绍了一些常见错误消息出现的原因及解决方法。

服务器没有资源

如果集群没有正在运行的节点池,或者 Connect 网关无法连接到节点池,则可能会发生 error: the server doesn't have a resource type "services" 等错误。如需检查节点池的状态,请运行以下命令:

gcloud container aws node-pools list \
    --cluster-name CLUSTER_NAME \
    --location LOCATION

替换以下内容:

  • CLUSTER_NAME:您的集群的名称
  • LOCATION:托管集群的 Google Cloud 位置

输出包含集群的节点池的状态。如果未列出任何节点池,请创建节点池

用户被禁止

如果您的用户名没有集群的管理员访问权限,则会发生以下错误:

Error from server (Forbidden): users "administrator@example.com" is forbidden:
User "system:serviceaccount:gke-connect:connect-agent-sa" cannot impersonate
resource "users" in API group "" at the cluster scope

如需配置其他用户,您可以在创建集群时传递 --admin-users 标志。

如果您使用 Connect 网关且无法连接到集群,请尝试以下步骤:

  1. 获取集群的授权用户。

    gcloud container aws clusters describe CLUSTER_NAME \
        --format 'value(authorization.admin_users)'
    

    CLUSTER_NAME 替换为您的集群名称。

    输出包括对集群具有管理员访问权限的用户名。例如:

    {'username': 'administrator@example.com'}
    
  2. 获取当前使用 Google Cloud CLI 进行身份验证的用户名。

    gcloud config get-value account
    

    输出包括使用 Google Cloud CLI 进行身份验证的账号。如果 gcloud containers aws clusters describegcloud config get-value account 的输出不匹配,请运行 gcloud auth login 并以对集群具有管理员权限的用户名进行身份验证。

kubectl 命令存在问题

以下部分介绍如何解决 kubectl 命令无响应或失败的问题。

kubectl 命令停止响应

如果您的集群运行的 Kubernetes 版本低于 1.25 并且 kubectl 命令无响应或超时,最常见的原因是您尚未创建节点池。默认情况下,GKE on AWS 会生成 kubeconfig 文件,这些文件使用 Connect 网关作为互联网可访问端点。为此,gke-connect-agent Deployment 需要在集群上的节点池中运行。

如需详细了解诊断信息,请运行以下命令:

kubectl cluster-info -v=9

如果没有正在运行的节点池,您会看到对 connectgateway.googleapis.com 的请求失败,并显示 404 cannot find active connections for cluster 错误。

对于 Kubernetes 版本为 1.25 或更高版本的集群,gke-connect-agent 在控制平面上运行,并且不需要节点池。如果 kubectl 命令无响应,请使用 Cloud Logging 检查控制平面组件日志。

kubectl exec、attach 和 port-forward 命令失败

使用 Connect 网关时,kubectl execkubectl attachkubectl port-forward 命令可能会失败,并显示消息 error: unable to upgrade connection。在将 Connect 网关用作 Kubernetes API 服务器端点时,需要遵守此限制。

如需解决此问题,请使用 kubeconfig 来指定集群的专用端点。如需了解如何通过集群的专用端点访问集群,请参阅为 kubectl 配置集群访问权限

kubectl 日志失败并显示远程错误:tls:内部错误

控制平面 API 角色缺少权限时,可能会发生此问题。例如,如果 AWS 角色缺少 ec2:DescribeDhcpOptions 权限,则可能会发生这种情况。在这种情况下,无法批准来自节点的证书签名请求,并且工作器节点缺少有效的证书。

要确定是否存在问题,您可使用以下命令检查是否存在尚未批准的待处理证书签名请求:

kubectl get csr

如需解决此问题,请验证 AWS 角色是否符合要求

常规 kubectl 问题排查

如果您使用 Connect 网关,请注意以下几点:

  • 确保您已在 Google Cloud 项目中启用 Connect 网关:

    gcloud services enable connectgateway.googleapis.com
    
  • 对于 Kubernetes 版本低于 1.25 的集群,请确保您至少有一个 Linux 节点池正在运行,并且 gke-connect-agent 正在运行。 如需了解详情,请参阅排查集群连接问题

  • 对于 Kubernetes 版本为 1.25 或更高版本的集群,请使用 Cloud Logging 检查 gke-connect-agent 日志。

Kubernetes Service (LoadBalancer) 或 Kubernetes Ingress 不起作用

如果您的 AWS 弹性负载均衡器 (ELB/NLB/ALB) 已创建但无法按预期运行,这可能是因为子网标记存在问题。如需了解详情,请参阅负载均衡器子网

Arm 节点上的 Pod 崩溃

如果您在 Arm 节点上部署 Pod,但容器映像不是专为 Arm 架构而构建的,则会出现以下问题。

如需查明问题,请完成以下任务:

  1. 获取 Pod 的状态:

    kubectl get pods
    
  2. 获取崩溃的 Pod 的日志:

    kubectl logs POD_NAME
    

    POD_NAME 替换为崩溃的 Pod 的名称。

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

    exec ./hello-app: exec format error
    

如需解决此问题,请确保您的容器映像支持 Arm 架构。最佳实践是构建多个架构映像。

无法删除集群

如果您在尝试删除集群时收到类似于以下内容的错误,则说明您的 GKE Multi-Cloud API 角色可能不存在:

ERROR: (gcloud.container.aws.clusters.delete) FAILED_PRECONDITION: Could not
assume role
"arn:aws:iam::ACCOUNT_NUMBER:role/gke123456-anthos-api-role"
through service account
"service-123456789@gcp-sa-gkemulticloud.iam.gserviceaccount.com".
Please make sure the role has a trust policy allowing the GCP service agent to
assume it: WebIdentityErr failed to retrieve credentials

如需解决此问题,请按照创建 GKE Multi-Cloud API 角色中的步骤操作。使用相同的名称和权限重新创建角色时,您可以重试该命令。

后续步骤