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

排查 Amazon EKS Connector 中的问题

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

常见问题

本节介绍如何排查使用 Amazon EKS Connector 时可能遇到的一些功能问题。它提供了这些问题的解决方案和变通方法。

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

如果注册集群之后,集群在 Amazon EKS 控制台中卡在 Pending 状态,可能是因为 Amazon EKS Connector 尚未成功将集群连接到 Amazon。对于已注册的集群,Pending 状态表示尚未成功建立连接。要解决此问题,请确保您已将清单应用到目标 Kubernetes 集群。如果您确实将其应用到集群,但集群仍处于“待处理”状态,则很可能是 Amazon EKS Connector 在您的集群中运行状况不佳。要排查此问题,请参阅本主题中名为 Amazon EKS Connector 容器处于崩溃循环 的章节。

控制台错误:用户“system:serviceaccount:eks-connector:eks-connector”无法在集群范围内模拟 API 组“”中的资源“用户”

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

  • 来自 Amazon 账户 123456789012 的 IAM 用户 jeff 映射到 Kubernetes 用户。

    arn:aws:iam::123456789012:user/jeff
  • 来自 Amazon 账户 123456789012 的 IAM 角色管理员映射到 Kubernetes 用户:

    arn:aws:iam::123456789012:role/admin

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

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

控制台错误:... 已禁止:用户 ... 无法在集群范围内列出“API 组中的 ...”资源

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

要解决此问题,作为集群管理员,您必须向各个 Kubernetes 用户授予适当级别的 RBAC 权限。有关更多信息以及示例,请参阅 向用户授予查看集群的访问权限

控制台错误: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 容器处于崩溃循环

可导致 EKS Connector 容器进入 CrashLoopBackOff 状态的原因有很多。此问题可能涉及 connector-init 容器。在以下示例中,是 connector-init 容器进入 CrashLoopBackOff 状态。

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

要排查此问题,检查 Amazon EKS Connector 的日志

无法启动 eks-connector: InvalidActivation

初次启动 Amazon EKS Connector 时,它会向亚马逊云科技注册 activationIdactivationCode。注册可能会失败,进而可能导致 connector-init 容器崩溃。

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

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

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

  • 注册失败可能是因为激活已过期。这是因为,出于安全原因,您必须在注册集群后的 3 天内激活 EKS Connector。要解决此问题,请确保在到期日期和时间之前将 EKS Connector 清单应用到目标 Kubernetes 集群。要确认激活到期日期,请调用 DescribeCluster API 操作。在以下示例响应中,到期日期和时间记录为 2021-11-12T22:28:51.101000-08:00。

    aws eks describe-cluster --name my-cluster { "cluster": { "name": "my-cluster", "arn": "arn:aws:eks:us-east-1:123456789012: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::123456789012:role/my-connector-role" } } }

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

集群 Worker 节点缺少出站连接

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

Amazon EKS Connector 容器处于 ImagePullBackOff 状态

如果您运行 getpods 命令且容器处于 ImagePullBackOff 状态,则容器无法正常工作。如果 EKS Connector 容器处于 ImagePullBackOff 状态,则容器无法正常工作。请参见以下示例:

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 Registry 的镜像。目标 Kubernetes 集群可能无法从 Amazon ECR Public 拉取镜像。解决 Amazon ECR Public 镜像拉取问题,或考虑镜像您选择的私有容器注册表中的镜像。

常见问题

问:Amazon EKS Connector 背后的底层技术是如何工作的?

答:Amazon EKS Connector 基于 System Manager (SSM) Agent。EKS Connector 作为 StatefulSet 在您的 Kubernetes 集群上运行。它建立连接并代理集群的 API 服务器与亚马逊云科技之间的通信。这样做是为了在 Amazon EKS 控制台中显示集群数据,直到您将集群与 Amazon 断开连接。SSM Agent 是一个开源项目。有关此项目的更多信息,请参阅 GitHub 项目页面

问:我想要连接一个本地部署的 Kubernetes 集群。我需要打开防火墙端口来连接它吗?

答:不,您不需要打开任何防火墙端口。Kubernetes 集群只需要到 Amazon Web Services 区域 的出站连接。Amazon 服务永远不会访问本地部署网络中的资源。Amazon EKS Connector 在您的集群上运行并启动与 Amazon 的连接。集群注册完成后,Amazon 仅在您从 Amazon EKS 控制台启动操作(需要集群中 Kubernetes API 服务器的信息)后向 Amazon EKS Connector 发出命令。

问:Amazon EKS Connector 将哪些数据从我的集群发送到 Amazon?

答:Amazon EKS Connector 会发送在 Amazon 上注册集群所必需的技术信息。它还发送客户请求的 Amazon EKS 控制台功能的集群和工作负载元数据。Amazon EKS Connector 仅当您从 Amazon EKS 控制台或 Amazon EKS API 启动的操作需要将数据发送到 Amazon 时才会收集或发送此数据。默认情况下,Amazon 不会存储除 Kubernetes 版本号以外的任何数据。它仅在您授权的情况下才会存储数据。

问:我可以连接 Amazon Web Services 区域 以外的集群吗?

答:可以,您可以将任何位置的集群连接到 Amazon EKS。此外,您的 EKS 服务可以位于任何 Amazon 公共商业 Amazon Web Services 区域。这适用于从集群到目标 Amazon Web Services 区域的有效网络连接。我们建议您选择距集群位置最近的 Amazon Web Services 区域 以优化 UI 性能。例如,如果您的集群在东京运行,请将集群连接到东京的 Amazon Web Services 区域(即 ap-northeast-1 Amazon Web Services 区域)以实现低延迟。您可以将任何位置的集群连接到任何公共商业 Amazon Web Services 区域(中国或 GovCloud Amazon Web Services 区域除外)中的 Amazon EKS。

基本问题排查

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

检查 Amazon EKS Connector 状态

使用以下命令检查 Amazon EKS Connector 状态。

kubectl get pods -n eks-connector

有两个 eks-connector-x 容器处于运行状态。

检查 Amazon EKS Connector 的日志

Amazon EKS Connector Pod 包含三个容器。您可以检查所有三个容器的日志。

  • connector-init

  • connector-proxy

  • connector-agent

要检索所有这些容器的完整日志以便进行查看,请运行以下命令。

  • # Retrieve log for connector-init container kubectl logs eks-connector-0 --container connector-init -n eks-connector kubectl logs eks-connector-1 --container connector-init -n eks-connector
  • # Retrieve log for connector-proxy container kubectl logs eks-connector-0 --container connector-proxy -n eks-connector kubectl logs eks-connector-1 --container connector-proxy -n eks-connector
  • # Retrieve log for connector-agent container 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 中容器使用的镜像。

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

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

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

    kubectl get nodes -o wide --show-labels