排查 Amazon EKS Connector 中的问题
本主题介绍您在使用 Amazon EKS Connector 时可能遇到的一些常见错误,包括有关如何解决这些错误的说明和变通方法。
控制台错误:集群卡在待处理状态
如果注册集群之后,集群在 Amazon EKS 控制台中卡在 Pending 状态,可能是因为 Amazon EKS Connector 尚未成功将集群连接到 Amazon。对于已注册的集群,Pending 状态表示未成功建立连接。要解决此问题,请确保您已将清单应用到目标 Kubernetes 集群。如果您将其应用到集群,但集群仍处于 Pending 状态,则可能是 Amazon EKS Connector 的运行状况不佳。要排查此问题,请参阅本主题中的Amazon EKS Connector pods 处于崩溃循环 。
控制台错误:在集群范围内 User
“system:serviceaccount:eks-connector:eks-connector” can't impersonate resource
“users” in API group “”
Amazon EKS Connector 使用 Kubernetes 用户模拟eks-connector 服务账户访问 Kubernetes API 的每个主体,必须授予服务账户使用 IAM ARN 作为其 Kubernetes 用户名模拟相应 Kubernetes 用户的权限。在以下示例中,IAM ARN 映射到 Kubernetes 用户。
-
来自 Amazon 账户
的 IAM 用户111122223333映射到 Kubernetes 用户。IAM 最佳实践建议您向角色而不是用户授予权限。johnarn:aws:iam::111122223333:user/john -
来自 Amazon 账户
的 IAM 角色111122223333映射到 Kubernetes 用户。adminarn:aws:iam::111122223333:role/admin结果是 IAM 角色 ARN,而不是 Amazon STS 会话 ARN。
有关如何配置 ClusterRole 和 ClusterRoleBinding 以授予 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 权限。
要解决此问题,作为集群管理员,请向各个 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 时,它会向亚马逊云科技注册 activationId 和 activationCode。注册可能会失败,进而可能导致 connector-init 容器崩溃,并显示类似以下错误。
F1116 20:30:47.261469 1 init.go:43] failed to initiate eks-connector: InvalidActivation:
要排查此问题,请考虑以下原因和建议的修复方法:
-
注册失败可能是因为
activationId和activationCode不在清单文件中。如果是这种情况,请确保它们是从RegisterClusterAPI 操作返回的正确值,并且activationCode位于清单文件中。activationCode已添加到 Kubernetes 密钥中,因此必须为base64编码。有关更多信息,请参阅步骤 1:注册集群。 -
注册失败可能是因为激活已过期。这是因为,出于安全原因,您必须在注册集群后的三天内激活Amazon EKS Connector。要解决此问题,请确保在到期日期和时间之前将 Amazon EKS Connector 清单应用到目标 Kubernetes 集群。要确认激活到期日期,请调用
DescribeClusterAPI 操作。aws eks describe-cluster --namemy-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
基本问题排查
本节介绍问题不清楚时诊断问题的步骤。
检查 Amazon EKS Connector 状态
检查 Amazon EKS Connector 的状态。
kubectl get pods -n eks-connector
检查 Amazon EKS Connector 的日志
Amazon EKS Connector pod 包含三个容器。要检索所有这些容器的完整日志以便进行查看,请运行以下命令:
-
connector-initkubectl logs eks-connector-0 --container connector-init -n eks-connector kubectl logs eks-connector-1 --container connector-init -n eks-connector -
connector-proxykubectl logs eks-connector-0 --container connector-proxy -n eks-connector kubectl logs eks-connector-1 --container connector-proxy -n eks-connector -
connector-agentkubectl 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