排查 Amazon EKS Connector 中的问题 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

排查 Amazon EKS Connector 中的问题

本主题介绍您在使用 Amazon EKS Connector 时可能遇到的一些常见错误,包括有关如何解决这些错误的说明和变通方法。

基本问题排查

本节介绍问题不清楚时诊断问题的步骤。

检查 Amazon EKS Connector 状态

检查 Amazon EKS Connector 的状态。

kubectl get pods -n eks-connector

检查 Amazon EKS Connector 的日志

Amazon EKS Connector Pod 包含三个容器。要检索所有这些容器的完整日志以便进行查看,请运行以下命令:

  • connector-init

    kubectl logs eks-connector-0 --container connector-init -n eks-connector kubectl logs eks-connector-1 --container connector-init -n eks-connector
  • connector-proxy

    kubectl logs eks-connector-0 --container connector-proxy -n eks-connector kubectl logs eks-connector-1 --container connector-proxy -n eks-connector
  • connector-agent

    kubectl exec eks-connector-0 --container connector-agent -n eks-connector -- cat /var/log/amazon/ssm/amazon-ssm-agent.log kubectl exec eks-connector-1 --container connector-agent -n eks-connector -- cat /var/log/amazon/ssm/amazon-ssm-agent.log

获取有效的集群名称

Amazon EKS 集群通过一个 Amazon 账户和 Amazon Web Services 区域内的 clusterName 唯一标识。如果您在 Amazon EKS 中有多个连接的集群,则可以确认当前 Kubernetes 集群注册到哪个 Amazon EKS 集群。为此,请输入以下内容以找出当前集群的 clusterName

kubectl exec eks-connector-0 --container connector-agent -n eks-connector \ -- cat /var/log/amazon/ssm/amazon-ssm-agent.log | grep -m1 -oE "eks_c:[a-zA-Z0-9_-]+" | sed -E "s/^.*eks_c:([a-zA-Z0-9_-]+)_[a-zA-Z0-9]+.*$/\1/" kubectl exec eks-connector-1 --container connector-agent -n eks-connector \ -- cat /var/log/amazon/ssm/amazon-ssm-agent.log | grep -m1 -oE "eks_c:[a-zA-Z0-9_-]+" | sed -E "s/^.*eks_c:([a-zA-Z0-9_-]+)_[a-zA-Z0-9]+.*$/\1/"

其他命令

以下命令可用于检索排查问题所需的信息。

  • 使用以下命令可收集 Amazon EKS Connector 中 Pods 使用的镜像。

    kubectl get pods -n eks-connector -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n'
  • 使用以下命令可确定运行 Amazon EKS Connector 的节点名称。

    kubectl get pods -n eks-connector -o jsonpath="{.items[*].spec.nodeName}" | tr -s '[[:space:]]' '\n'
  • 运行以下命令可获取您的 Kubernetes 客户端和服务器版本。

    kubectl version
  • 运行以下命令可获取有关节点的信息。

    kubectl get nodes -o wide --show-labels

Helm 问题:403 Forbidden

如果在运行 helm install 命令时收到以下错误:

Error: INSTALLATION FAILED: unexpected status from HEAD request to https://public.ecr.aws/v2/eks-connector/eks-connector-chart/manifests/0.0.6: 403 Forbidden

您可以运行以下行来修复它:

docker logout public.ecr.aws

控制台错误:集群卡在待处理状态

如果注册集群之后,集群在 Amazon EKS 控制台中卡在 Pending 状态,可能是因为 Amazon EKS Connector 尚未成功将集群连接到 Amazon。对于已注册的集群,Pending 状态表示未成功建立连接。要解决此问题,请确保您已将清单应用到目标 Kubernetes 集群。如果将其应用于集群,但集群仍处于 Pending 状态,则 eks-connector statefulset 可能不正常。要排查此问题,请参阅本主题中的Amazon EKS Connector Pods 处于崩溃循环

控制台错误:在集群范围内 User “system:serviceaccount:eks-connector:eks-connector” can't impersonate resource “users” in API group “”

Amazon EKS Connector 使用 Kubernetes 用户模拟代表 Amazon Web Services Management Console 中的 IAM 主体进行操作。对于从 Amazon eks-connector 服务账户访问 Kubernetes API 的每个主体,必须授予服务账户使用 IAM ARN 作为其 Kubernetes 用户名模拟相应 Kubernetes 用户的权限。在以下示例中,IAM ARN 映射到 Kubernetes 用户。

  • 来自 Amazon 账户 111122223333 的 IAM 用户 john 映射到 Kubernetes 用户。IAM 最佳实践建议您向角色而不是用户授予权限。

    arn:aws:iam::111122223333:user/john
  • 来自 Amazon 账户 111122223333 的 IAM 角色 admin 映射到 Kubernetes 用户。

    arn:aws:iam::111122223333:role/admin

    结果是 IAM 角色 ARN,而不是 Amazon STS 会话 ARN。

有关如何配置 ClusterRoleClusterRoleBinding 以授予 eks-connector 服务账户模拟映射用户权限的说明,请参阅向 IAM 主体授予查看集群上的 Kubernetes 资源的访问权限。确保在模板中将 %IAM_ARN% 替换为 Amazon Web Services Management Console IAM 主体的 IAM ARN。

控制台错误:在集群范围内 [...] is forbidden: User [...] cannot list resource “[...] in API group”

考虑以下问题。Amazon EKS Connector 已成功模拟目标 Kubernetes 集群中请求的 Amazon Web Services Management Console IAM 主体。但模拟主体没有 Kubernetes API 操作的 RBAC 权限。

要解决此问题,有两种方法可以向其他用户授予权限。如果您之前通过 Helm 图表安装了 eks-connector,则可以通过运行以下命令轻松授予用户访问权限。将 userARN1userARN2 替换为 IAM 角色的 ARN 列表,以授予查看 Kubernetes 资源的访问权限:

helm upgrade eks-connector oci://public.ecr.aws/eks-connector/eks-connector-chart \ --reuse-values \ --set 'authentication.allowedUserARNs={userARN1,userARN2}'

或者,作为集群管理员,向各个 Kubernetes 用户授予适当级别的 RBAC 权限。有关更多信息以及示例,请参阅 向 IAM 主体授予查看集群上的 Kubernetes 资源的访问权限

控制台错误:Amazon EKS 无法与您的 Kubernetes 集群 API 服务器进行通信。集群必须处于 ACTIVE(活动)状态才能成功连接。过几分钟再试。

如果 Amazon EKS 服务无法与目标集群中的 Amazon EKS Connector 进行通信,可能是由于以下原因之一导致:

  • 目标集群中的 Amazon EKS Connector 运行状况不佳。

  • 目标集群与 Amazon Web Services 区域之间的连接不佳或连接中断。

要解决此问题,请查看 Amazon EKS Connector 日志。如果您没有看到 Amazon EKS Connector 的错误,请在几分钟后重试连接。如果经常遇到目标集群的高延迟或间歇性连接,请考虑将集群重新注册到离您更近的 Amazon Web Services 区域 区域。

Amazon EKS Connector Pods 处于崩溃循环

可导致 Amazon EKS Connector Pod 进入 CrashLoopBackOff 状态的原因有很多。此问题可能涉及 connector-init 容器。检查 Amazon EKS Connector Pod 的状态。

kubectl get pods -n eks-connector

示例输出如下。

NAME READY STATUS RESTARTS AGE eks-connector-0 0/2 Init:CrashLoopBackOff 1 7s

如果您的输出与之前的输出类似,请参阅 检查 Amazon EKS Connector 的日志 排查问题。

Failed to initiate eks-connector: InvalidActivation

初次启动 Amazon EKS Connector 时,它会向 Amazon Web Services 注册 activationIdactivationCode。注册可能会失败,进而可能导致 connector-init 容器崩溃,并显示类似以下错误。

F1116 20:30:47.261469       1 init.go:43] failed to initiate eks-connector: InvalidActivation:

要排查此问题,请考虑以下原因和建议的修复方法:

  • 注册失败可能是因为 activationIdactivationCode 不在清单文件中。如果是这种情况,请确保它们是从 RegisterCluster API 操作返回的正确值,并且 activationCode 位于清单文件中。activationCode 已添加到 Kubernetes 密钥中,因此必须为 base64 编码。有关更多信息,请参阅 步骤 1:注册集群

  • 注册失败可能是因为激活已过期。这是因为,出于安全原因,您必须在注册集群后的三天内激活Amazon EKS Connector。要解决此问题,请确保在到期日期和时间之前将 Amazon EKS Connector 清单应用到目标 Kubernetes 集群。要确认激活到期日期,请调用 DescribeCluster API 操作。

    aws eks describe-cluster --name my-cluster

    在以下示例响应中,到期日期和时间记录为 2021-11-12T22:28:51.101000-08:00

    { "cluster": { "name": "my-cluster", "arn": "arn:aws:eks:region:111122223333:cluster/my-cluster", "createdAt": "2021-11-09T22:28:51.449000-08:00", "status": "FAILED", "tags": { }, "connectorConfig": { "activationId": "00000000-0000-0000-0000-000000000000", "activationExpiry": "2021-11-12T22:28:51.101000-08:00", "provider": "OTHER", "roleArn": "arn:aws:iam::111122223333:role/my-connector-role" } } }

    如果 activationExpiry 已过,则注销集群然后重新注册。执行此操作会生成新的激活信息。

集群节点缺少出站连接

为正常工作,Amazon EKS Connector 需要到多个 Amazon 端点的出站连接。如果没有到目标 Amazon Web Services 区域 的出站连接,则无法连接私有集群。要解决此问题,您必须添加必要的出站连接。有关连接器要求的信息,请参阅 Amazon EKS Connector 注意事项

Amazon EKS Connector Pods 处于 ImagePullBackOff 状态

如果您运行 get pods 命令且 Pods 处于 ImagePullBackOff 状态,则其无法正常工作。如果 Amazon EKS Connector Pods 处于 ImagePullBackOff 状态,则其无法正常工作。检查 Amazon EKS Connector Pods 的状态。

kubectl get pods -n eks-connector

示例输出如下。

NAME READY STATUS RESTARTS AGE eks-connector-0 0/2 Init:ImagePullBackOff 0 4s

默认 Amazon EKS Connector 清单文件引用来自 Amazon ECR Public Gallery 的映像。目标 Kubernetes 集群可能无法从 Amazon ECR Public Gallery 提取映像。解决 Amazon ECR Public Gallery 映像提取问题,或考虑映像您选择的私有容器注册表中的映像。