

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 排查 Amazon EKS Connector 问题
<a name="troubleshooting-connector"></a>

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

## 基本问题排查
<a name="tsc-steps"></a>

本节介绍诊断 Amazon EKS Connector 问题的步骤。

### 检查 Amazon EKS Connector 状态
<a name="tsc-check"></a>

要检查 Amazon EKS Connector 的状态，请输入：

```
kubectl get pods -n eks-connector
```

### 检查 Amazon EKS Connector 的日志
<a name="tsc-logs"></a>

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
  ```

### 获取有效的集群名称
<a name="tsc-name"></a>

Amazon EKS 集群通过一个 AWS 账户和 AWS 区域内的 `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/"
```

### 其他命令
<a name="tsc-misc"></a>

以下命令可用于检索排查问题所需的信息。
+ 使用以下命令可收集 Amazon EKS Connector 中容器组（pod）使用的映像。

  ```
  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
<a name="w662aac60c33b9"></a>

如果在运行 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
```

## 控制台错误：集群卡在待处理状态
<a name="symp-pending"></a>

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

## 控制台错误：用户“system:serviceaccount:eks-connector:eks-connector”无法在集群范围内模拟 API 组中的资源用户
<a name="symp-imp"></a>

Amazon EKS Connector 使用 Kubernetes [用户模拟](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation) 代表 AWS 管理控制台 中的 [IAM 主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)进行操作。对于从 AWS `eks-connector` 服务账户访问 Kubernetes API 的每个主体，必须授予权限以使用 IAM ARN 作为其 Kubernetes 用户名来模拟相应 Kubernetes 用户。在以下示例中，IAM ARN 映射到 Kubernetes 用户。
+ 来自 AWS 账户 *111122223333* 的 IAM 用户 *john* 映射到 Kubernetes 用户。[IAM 最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)建议您向角色而不是用户授予权限。

  ```
                 arn:aws:iam::111122223333:user/john
  ```
+ 来自 AWS 账户 *111122223333* 的 IAM 角色 *admin* 映射到 Kubernetes 用户：

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

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

有关如何配置 `ClusterRole` 和 `ClusterRoleBinding` 以授予 `eks-connector` 服务账户模拟映射用户权限的说明，请参阅[授予在 Amazon EKS 控制台上查看 Kubernetes 集群资源的权限](connector-grant-access.md)。确保在模板中将 `%IAM_ARN%` 替换为 AWS 管理控制台 IAM 主体的 IAM ARN。

## 控制台错误：[…​] 已禁止：用户 […​] 无法在集群范围内列出 API 组中的列表资源 […​]
<a name="symp-rbac"></a>

考虑以下问题。Amazon EKS Connector 已成功模拟目标 Kubernetes 集群中请求的 AWS 管理控制台 IAM 主体。但模拟主体没有 Kubernetes API 操作的 RBAC 权限。

要解决此问题，有两种方法可以向其他用户授予权限。如果您之前通过 Helm 图表安装了 eks-connector，则可以通过运行以下命令轻松授予用户访问权限。将 `userARN1` 和 `userARN2` 替换为 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 权限。有关更多信息以及示例，请参阅 [授予在 Amazon EKS 控制台上查看 Kubernetes 集群资源的权限](connector-grant-access.md)。

## 控制台错误：Amazon EKS 无法与您的 Kubernetes 集群 API 服务器进行通信。集群必须处于 ACTIVE（活动）状态才能成功连接。过几分钟再试。
<a name="symp-con"></a>

如果 Amazon EKS 服务无法与目标集群中的 Amazon EKS Connector 进行通信，可能是由于以下原因之一导致：
+ 目标集群中的 Amazon EKS Connector 运行状况不佳。
+ 目标集群与 AWS 区域之间的连接不佳或连接中断。

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

## Amazon EKS Connector 容器组（pod）处于崩溃循环
<a name="symp-loop"></a>

可导致 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 的日志](#tsc-logs) 排查问题。

## 无法启动 eks-connector：InvalidActivation
<a name="symp-regis"></a>

初次启动 Amazon EKS Connector 时，它会向 Amazon Web Services 注册 `activationId` 和 `activationCode`。注册可能会失败，进而可能导致 `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：注册集群](connecting-cluster.md#connector-connecting)。
+ 注册失败可能是因为激活已过期。这是因为，出于安全原因，您必须在注册集群后的三天内激活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` 已过，则注销集群然后重新注册。执行此操作会生成新的激活信息。

## 集群节点缺少出站连接
<a name="symp-out"></a>

为正常工作，Amazon EKS Connector 需要到多个 AWS 端点的出站连接。如果没有到目标 AWS 区域的出站连接，则无法连接私有集群。要解决此问题，您必须添加必要的出站连接。有关连接器要求的信息，请参阅 [Amazon EKS Connector 注意事项](eks-connector.md#connect-cluster-reqts)。

## Amazon EKS Connector 容器组（pod）处于 `ImagePullBackOff` 状态
<a name="symp-img"></a>

如果您运行 `get pods` 命令且容器组（pod）处于 `ImagePullBackOff` 状态，则其无法正常工作。如果 Amazon EKS Connector 容器组（pod）处于 `ImagePullBackOff` 状态，则其无法正常工作。检查 Amazon EKS Connector 容器组（pod）的状态。

```
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](https://gallery.ecr.aws/) 的映像。目标 Kubernetes 集群可能无法从 Amazon ECR 公开映像浏览馆提取映像。解决 Amazon ECR Public Gallery 映像提取问题，或考虑映像您选择的私有容器注册表中的映像。