

 **帮助改进此页面** 

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

# 使用 Amazon EKS Connector 将 Kubernetes 集群连接到 Amazon EKS 管理控制台
<a name="eks-connector"></a>

您可以使用 Amazon EKS Connector 注册并将任何符合要求的 Kubernetes 集群连接至 Amazon，并在 Amazon EKS 控制台中进行显示。连接集群后，您可以在 Amazon EKS 控制台中查看集群的状态、配置和工作负载。您可以使用此功能在 Amazon EKS 控制台中查看已连接的集群，但您无法对其进行管理。Amazon EKS Connector 需要一个代理，该代理是 [Github 上的开源项目](https://github.com/aws/amazon-eks-connector)。有关其它技术内容，包括常见问题和故障排除，请参阅[排查 Amazon EKS Connector 问题](troubleshooting-connector.md)

Amazon EKS Connector 能够将以下类型的 Kubernetes 集群连接到 Amazon EKS。
+ 本地部署 Kubernetes 集群
+ 在 Amazon EC2 上运行的自托管式集群
+ 来自其他云提供商的管理集群

## Amazon EKS Connector 注意事项
<a name="connect-cluster-reqts"></a>

在使用 Amazon EKS Connector 之前，请先了解以下内容：
+ 您必须拥有 Kubernetes 集群的管理权限才能将集群连接到 Amazon EKS。
+ 连接前，Kubernetes 集群必须有 Linux 64 位 (x86) Worker 节点。不支持 ARM Worker 节点。
+ 您的 Kubernetes 集群中必须包含拥有对 `ssm.` 和 `ssmmessages.` Systems Manager 端点出站访问的 Worker 节点。有关更多信息，请参阅 *Amazon 一般参考*中的 [Systems Manager 端点](https://docs.amazonaws.cn/general/latest/gr/ssm.html)。
+ 每个区域原定设置最多可连接 10 个集群。您可以通过[服务配额控制台](https://docs.amazonaws.cn/servicequotas/latest/userguide/request-quota-increase.html)请求增加配额。请参阅[请求增加配额](https://docs.amazonaws.cn/servicequotas/latest/userguide/request-quota-increase.html)了解更多信息。
+ 对于外部 Kubernetes 集群，仅支持 Amazon EKS `RegisterCluster`、`ListClusters`、`DescribeCluster` 和 `DeregisterCluster` API。
+ 您必须拥有以下权限才能注册集群：
  + eks:RegisterCluster
  + ssm:CreateActivation
  + ssm:DeleteActivation
  + iam:PassRole
+ 您必须拥有以下权限才能注销集群：
  + eks:DeregisterCluster
  + ssm:DeleteActivation
  + ssm:DeregisterManagedInstance

## Amazon EKS Connector 所需的 IAM 角色
<a name="connector-iam-permissions"></a>

使用 Amazon EKS Connector 需要以下两个 IAM 角色：
+ 首次注册集群时，您需要创建 [Amazon EKS Connector](using-service-linked-roles-eks-connector.md) 服务相关角色。
+ 您必须创建 Amazon EKS Connector 代理 IAM 角色。有关详细信息，请参阅[Amazon EKS Connector IAM 角色](connector-iam-role.md)。

要为 [IAM 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html#iam-term-principal)启用集群和工作负载视图权限，请将 `eks-connector` 和 Amazon EKS Connector 集群角色应用到集群。按[授予在 Amazon EKS 控制台上查看 Kubernetes 集群资源的权限](connector-grant-access.md)中的步骤操作。

# 将外部 Kubernetes 集群连接到 Amazon EKS 管理控制台
<a name="connecting-cluster"></a>

可在以下过程中使用多种方法将外部 Kubernetes 集群连接到 Amazon EKS。此过程包括两个步骤：向 Amazon EKS 注册集群，在集群中安装 `eks-connector` 代理。

**重要**  
您必须在完成第一步后 3 天内（注册到期之前）完成第二步。

## 注意事项
<a name="connecting-cluster-considerations"></a>

安装代理时，您可以使用 YAML 清单。或者，如果您向 Amazon Web Services 管理控制台 或 Amazon 命令行界面注册集群，则可以使用 Helm。但是，如果您向 `eksctl` 注册集群，则无法使用 Helm 安装代理。

## 先决条件
<a name="connector-prereqs"></a>
+ 确保已创建 Amazon EKS Connector 代理角色。按照[创建 Amazon EKS Connector 代理角色](connector-iam-role.md#create-connector-role)中的步骤操作。
+ 您必须拥有以下权限才能注册集群：
  +  `eks:RegisterCluster` 
  +  `ssm:CreateActivation` 
  +  `ssm:DeleteActivation` 
  +  `iam:PassRole` 

## 步骤 1：注册集群
<a name="connector-connecting"></a>

要向 Amazon EKS 连接器注册集群，您可以使用以下工具之一：
+  [Amazon CLI](#awscli_register_cluster_connect) 
+  [Amazon Web Services 管理控制台](#console_register_cluster_connect) 
+  [`eksctl`](#eksctl_register_cluster_connect) 

### Amazon CLI
<a name="awscli_register_cluster_connect"></a>

1.  必须安装 Amazon CLI。要进行安装或升级，请参阅[安装 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-install.html)。

1. 对于 Connector 配置，请指定您的 Amazon EKS Connector 代理 IAM 角色。有关更多信息，请参阅 [Amazon EKS Connector 所需的 IAM 角色](eks-connector.md#connector-iam-permissions)。

   ```
   aws eks register-cluster \
        --name my-first-registered-cluster \
        --connector-config roleArn=arn:aws-cn:iam::111122223333:role/AmazonEKSConnectorAgentRole,provider="OTHER" \
        --region aws-region
   ```

   示例输出如下。

   ```
   {
       "cluster": {
           "name": "my-first-registered-cluster",
           "arn": "arn:aws-cn:eks:region:111122223333:cluster/my-first-registered-cluster",
           "createdAt": 1627669203.531,
           "ConnectorConfig": {
               "activationId": "xxxxxxxxACTIVATION_IDxxxxxxxx",
               "activationCode": "xxxxxxxxACTIVATION_CODExxxxxxxx",
               "activationExpiry": 1627672543.0,
               "provider": "OTHER",
               "roleArn": "arn:aws-cn:iam::111122223333:role/AmazonEKSConnectorAgentRole"
           },
           "status": "CREATING"
       }
   }
   ```

   在下一步中使用 `aws-region`、`activationId` 和 `activationCode` 值。

### Amazon Web Services 管理控制台
<a name="console_register_cluster_connect"></a>

1. 打开 [Amazon EKS 控制台](https://console.amazonaws.cn/eks/home#/clusters)。

1. 选择 **Add cluster**（添加集群），然后选择 **Register**（注册）以打开配置页面。

1. 在 **Configure cluster (配置集群)** 部分，填写以下字段：
   +  **Name（名称）**– 集群的唯一名称。
   +  **Provider**（提供程序）– 选择以显示 Kubernetes 集群提供程序的下拉列表。如果您不了解具体的提供程序，请选择**其它**。
   +  **EKS Connector 角色**：选择用于连接集群的角色。

1. 选择 **Register cluster**（注册集群）。

1. 此时将显示集群概览页面。如果您想使用 Helm 图表，请复制 `helm install` 命令并继续下一步。如果要使用 YAML 清单，请选择**下载 YAML 文件**，将清单文件下载到本地驱动程序。
**重要**  
这是您复制 `helm install` 命令或下载此文件的唯一机会。不要离开此页面，否则将无法访问此链接，届时您必须注销集群并从头开始此步骤。

   对于注册的集群，命令或清单文件只能使用一次。如果从 Kubernetes 集群中删除资源，则必须重新注册集群并获取新的清单文件。

继续执行下一步，以将清单文件应用于 Kubernetes 集群。

### `eksctl`
<a name="eksctl_register_cluster_connect"></a>

1.  必须安装 `eksctl` 版本 `0.68` 或更高版本。要安装或对其升级，请参阅 [开始使用 Amazon EKS – `eksctl`](getting-started-eksctl.md)。

1. 提供名称、提供程序和区域来注册集群。

   ```
   eksctl register cluster --name my-cluster --provider my-provider --region region-code
   ```

   输出示例：

   ```
   2021-08-19 13:47:26 [ℹ]  creating IAM role "eksctl-20210819194112186040"
   2021-08-19 13:47:26 [ℹ]  registered cluster "<name>" successfully
   2021-08-19 13:47:26 [ℹ]  wrote file eks-connector.yaml to <current directory>
   2021-08-19 13:47:26 [ℹ]  wrote file eks-connector-clusterrole.yaml to <current directory>
   2021-08-19 13:47:26 [ℹ]  wrote file eks-connector-console-dashboard-full-access-group.yaml to <current directory>
   2021-08-19 13:47:26 [!]  note: "eks-connector-clusterrole.yaml" and "eks-connector-console-dashboard-full-access-group.yaml" give full EKS Console access to IAM identity "<aws-arn>", edit if required; read https://eksctl.io/usage/eks-connector for more info
   2021-08-19 13:47:26 [ℹ]  run `kubectl apply -f eks-connector.yaml,eks-connector-clusterrole.yaml,eks-connector-console-dashboard-full-access-group.yaml` before expiry> to connect the cluster
   ```

   这将在本地计算机上创建文件。必须在 3 天内将这些文件应用到外部集群，否则注册将会过期。

1. 在可以访问集群的终端中，应用 `eks-connector-binding.yaml` 文件：

   ```
   kubectl apply -f eks-connector-binding.yaml
   ```

## 步骤 2：安装 `eks-connector` 代理
<a name="eks-connector-apply"></a>

要安装 `eks-connector` 代理，请使用以下工具之一：
+  [Helm](#helm_agent_cluster_connect) 
+  [yaml](#yaml_agent_cluster_connect) 

### Helm
<a name="helm_agent_cluster_connect"></a>

**注意**  
如果您向 `eksctl` 注册了集群，则请使用 YAML 清单方法而不是 Helm 图表方法。

1. 如果在上一步中使用了 Amazon CLI，请将以下命令中的 `ACTIVATION_CODE` 和 `ACTIVATION_ID` 分别替换为 `activationId` 和 `activationCode` 值。将 `aws-region` 替换为在上一步中使用的 Amazon 区域。然后运行命令在注册集群上安装 `eks-connector` 代理：

   ```
   $ helm install eks-connector \
     --namespace eks-connector \
     oci://public.ecr.aws/eks-connector/eks-connector-chart \
     --set eks.activationCode=ACTIVATION_CODE \
     --set eks.activationId=ACTIVATION_ID \
     --set eks.agentRegion=aws-region
   ```

   如果在上一步中使用了 Amazon Web Services 管理控制台，请使用从上一步复制的已填充这些值的命令。

1. 检查已安装 `eks-connector` 部署的运行状况，并等待 Amazon EKS 中已注册集群的状态变为 `ACTIVE`。

### yaml
<a name="yaml_agent_cluster_connect"></a>

通过将 Amazon EKS Connector 清单文件应用于 Kubernetes 集群来完成连接。为此，必须使用前面描述的方法。如果没有在 3 天内应用清单，Amazon EKS Connector 注册将过期。如果集群连接过期，则必须在再次连接集群之前注销集群。

1. 下载 Amazon EKS Connector YAML 文件。

   ```
   curl -O https://amazon-eks.s3.us-west-2.amazonaws.com/eks-connector/manifests/eks-connector/latest/eks-connector.yaml
   ```

1. 编辑 Amazon EKS Connector YAML 文件，将 `%AWS_REGION%`、`%EKS_ACTIVATION_ID%`、`%EKS_ACTIVATION_CODE%` 的所有引用替换为上一步输出的 `aws-region`、`activationId` 和 `activationCode`。

   以下示例命令可以替换这些值。

   ```
   sed -i "s~%AWS_REGION%~$aws-region~g; s~%EKS_ACTIVATION_ID%~$EKS_ACTIVATION_ID~g; s~%EKS_ACTIVATION_CODE%~$(echo -n $EKS_ACTIVATION_CODE | base64)~g" eks-connector.yaml
   ```
**重要**  
确保激活码采用 base64 格式。

1. 在可以访问集群的终端中，可以运行以下命令应用更新的清单文件：

   ```
   kubectl apply -f eks-connector.yaml
   ```

1. 将绑定 Amazon EKS Connector 清单和角色的 YAML 文件应用于 Kubernetes 集群后，确认该集群现在已连接。

   ```
   aws eks describe-cluster \
        --name "my-first-registered-cluster" \
        --region AWS_REGION
   ```

   该输出应包含 `status=ACTIVE`。

1. （可选）向集群添加标签。有关更多信息，请参阅 [使用标签整理 Amazon EKS 资源](eks-using-tags.md)。

## 后续步骤
<a name="eks-connector-next"></a>

如果您对这些步骤有任何疑问，请参阅 [排查 Amazon EKS Connector 问题](troubleshooting-connector.md)。

要向其他 [IAM 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html#iam-term-principal)授予对 Amazon EKS 控制台的访问权限以查看已连接的集群中的 Kubernetes 资源，请参阅[授予在 Amazon EKS 控制台上查看 Kubernetes 集群资源的权限](connector-grant-access.md)。

# 授予在 Amazon EKS 控制台上查看 Kubernetes 集群资源的权限
<a name="connector-grant-access"></a>

向 [IAM 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html#iam-term-principal)授予对 Amazon EKS 控制台的访问权限，查看有关在已连接集群上运行的 Kubernetes 资源的信息。

## 先决条件
<a name="connector-grant-access-prereqs"></a>

您访问 Amazon Web Services 管理控制台 所用的 [IAM 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必须满足以下要求：
+ 它必须具有 `eks:AccessKubernetesApi` IAM 权限。
+ Amazon EKS Connector 服务账户应能够模拟集群中的 IAM 主体。这将允许 Amazon EKS Connector 将 IAM 主体映射到 Kubernetes 用户。

 **创建并应用 Amazon EKS Connector 集群角色** 

1. 下载 `eks-connector` 集群角色模板。

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/eks-connector/manifests/eks-connector-console-roles/eks-connector-clusterrole.yaml
   ```

1. 编辑集群角色模板 YAML 文件。将 `%IAM_ARN%` 参考替换为您的 IAM 主体的 Amazon 资源名称（ARN）。

1. 将 Amazon EKS Connector 集群角色 YAML 应用于您的 Kubernetes 集群。

   ```
   kubectl apply -f eks-connector-clusterrole.yaml
   ```

要让某个 IAM 主体能够在 Amazon EKS 控制台上查看 Kubernetes 资源，该主体必须与 Kubernetes `role` 或 `clusterrole` 关联，并拥有读取这些资源的必要权限。有关更多信息，请参阅 Kubernetes 文档中的[使用 RBAC 授权](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。

 **要配置 IAM 主体以访问连接的集群** 

1. 您可以下载以下任一示例清单文件，分别创建 `clusterrole` 和 `clusterrolebinding` 或 `role` 和 `rolebinding`：  
 **查看所有命名空间中的 Kubernetes 资源**   
   + `eks-connector-console-dashboard-full-access-clusterrole` 集群角色允许访问控制台中可视化的所有命名空间和资源。您可以更改 `role`、`clusterrole` 及其对应绑定的名称，然后再将其应用于集群。使用以下命令下载示文件。

     ```
     curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/eks-connector/manifests/eks-connector-console-roles/eks-connector-console-dashboard-full-access-group.yaml
     ```  
 **查看特定命名空间中的 Kubernetes 资源**   
   + 此文件中的命名空间是 `default`，因此如果要指定不同命名空间，请编辑该文件，然后应用到集群。使用以下命令下载示文件。

     ```
     curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/eks-connector/manifests/eks-connector-console-roles/eks-connector-console-dashboard-restricted-access-group.yaml
     ```

1. 编辑完全访问权限或受限访问权限 YAML 文件以将 `%IAM_ARN%` 参考替换为您的 IAM 主体的 Amazon 资源名称（ARN）。

1. 将完全访问权限或受限访问权限 YAML 文件应用于 Kubernetes 集群。将 YAML 文件的值替换为您自己的值。

   ```
   kubectl apply -f eks-connector-console-dashboard-full-access-group.yaml
   ```

要查看已连接集群中的 Kubernetes 资源，请参阅 [在 Amazon Web Services 管理控制台中查看 Kubernetes 资源](view-kubernetes-resources.md)。**资源**选项卡上某些资源类型的数据不适用于已连接的集群。

# 从 Amazon EKS 控制台注销 Kubernetes 集群
<a name="deregister-connected-cluster"></a>

使用完已连接集群后，可以将其注销。取消注册后，该集群将不再在 Amazon EKS 控制台中显示。

您必须拥有以下权限才能调用 deregisterCluster API：
+  `eks:DeregisterCluster` 
+  `ssm:DeleteActivation` 
+  `ssm:DeregisterManagedInstance` 

此过程包括两个步骤：向 Amazon EKS 取消注册集群，在集群中卸载 eks-connector 代理。

## 注销 Kubernetes 集群
<a name="deregister-connected-cluster-eks"></a>

要从 Amazon EKS 连接器取消注册集群，您可以使用以下工具之一：
+  [Amazon CLI](#awscli_deregister_cluster_connect) 
+  [Amazon Web Services 管理控制台](#console_deregister_cluster_connect) 
+  [`eksctl`](#eksctl_deregister_cluster_connect) 

### Amazon CLI
<a name="awscli_deregister_cluster_connect"></a>

1.  必须安装 Amazon CLI。要进行安装或升级，请参阅[安装 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-install.html)。

1. 确保已创建 Amazon EKS Connector 代理角色。

1. 注销已连接的集群。

   ```
   aws eks deregister-cluster \
       --name my-cluster \
       --region region-code
   ```

### Amazon Web Services 管理控制台
<a name="console_deregister_cluster_connect"></a>

1. 打开 [Amazon EKS 控制台](https://console.amazonaws.cn/eks/home#/clusters)。

1. 选择 **Clusters (集群)**。

1. 请在 **Clusters**（集群）页面上，选择连接的集群，然后选择 **Deregister**（注销）。

1. 确认您要注销该层。

### `eksctl`
<a name="eksctl_deregister_cluster_connect"></a>

1. 安装 `eksctl` 版本 `0.68` 或更高版本。要安装或对其升级，请参阅 [开始使用 Amazon EKS – `eksctl`](getting-started-eksctl.md)。

1. 确保已创建 Amazon EKS Connector 代理角色。

1. 取消注册已连接的集群：

   ```
   eksctl deregister cluster --name my-cluster
   ```

## 清除 Kubernetes 集群中的资源
<a name="deregister-connected-cluster-k8s"></a>

要卸载 `eks-connector` 代理，请使用以下工具之一：
+  [helm](#helm_agent_cluster_deregister) 
+  [yaml](#yaml_agent_cluster_deregister) 

### helm
<a name="helm_agent_cluster_deregister"></a>

运行以下命令来卸载代理。

```
helm -n eks-connector uninstall eks-connector
```

### yaml
<a name="yaml_agent_cluster_deregister"></a>

1. 从 Kubernetes 集群中删除 Amazon EKS Connector YAML 文件。

   ```
   kubectl delete -f eks-connector.yaml
   ```

1. 如果为其他 [IAM 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html#iam-term-principal)创建了 `clusterrole` 或 `clusterrolebindings` 来访问集群，请从 Kubernetes 集群中删除它们。

# 排查 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 集群通过一个 Amazon 账户和 Amazon 区域内的 `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 尚未成功将集群连接到 Amazon。对于已注册的集群，`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) 代表 Amazon Web Services 管理控制台 中的 [IAM 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html#iam-term-principal)进行操作。对于从 Amazon `eks-connector` 服务账户访问 Kubernetes API 的每个主体，必须授予权限以使用 IAM ARN 作为其 Kubernetes 用户名来模拟相应 Kubernetes 用户。在以下示例中，IAM ARN 映射到 Kubernetes 用户。
+ 来自 Amazon 账户 *111122223333* 的 IAM 用户 *john* 映射到 Kubernetes 用户。[IAM 最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users.html)建议您向角色而不是用户授予权限。

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

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

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

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

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

考虑以下问题。Amazon EKS Connector 已成功模拟目标 Kubernetes 集群中请求的 Amazon Web Services 管理控制台 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 运行状况不佳。
+ 目标集群与 Amazon 区域之间的连接不佳或连接中断。

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

## 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-cn: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-cn:iam::111122223333:role/my-connector-role"
          }
      }
  }
  ```

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

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

为正常工作，Amazon EKS Connector 需要到多个 Amazon 端点的出站连接。如果没有到目标 Amazon 区域的出站连接，则无法连接私有集群。要解决此问题，您必须添加必要的出站连接。有关连接器要求的信息，请参阅 [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 映像提取问题，或考虑映像您选择的私有容器注册表中的映像。

# Amazon Connector 常见问题
<a name="tsc-faq"></a>

**问：Amazon EKS Connector 背后的底层技术是如何工作的？**  
答：Amazon EKS Connector 基于 Amazon Systems Manager（Systems Manager）代理。Amazon EKS Connector 作为 `StatefulSet` 在您的 Kubernetes 集群上运行。它建立连接并代理集群的 API 服务器与 Amazon Web Services 之间的通信。这样做是为了在 Amazon EKS 控制台中显示集群数据，直到您将集群与 Amazon 断开连接。Systems Manager 代理是一个开源项目。有关此项目的更多信息，请参阅 [GitHub 项目页面](https://github.com/aws/amazon-ssm-agent)。

**问：我想要连接一个本地部署的 Kubernetes 集群。我需要打开防火墙端口来连接它吗？**  
答：不，您不需要打开任何防火墙端口。Kubernetes 集群只需要到 Amazon 区域的出站连接。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 区域以外的集群吗？**  
答：可以，您可以将任何位置的集群连接到 Amazon EKS。此外，您的 Amazon EKS 服务可以位于任何 Amazon 公共商业 Amazon 区域。这适用于从集群到目标 Amazon 区域的有效网络连接。我们建议您选择距集群位置最近的 Amazon 区域以优化 UI 性能。例如，如果您的集群在东京运行，请将集群连接到东京的 Amazon 区域（即 `ap-northeast-1` Amazon 区域）以实现低延迟。您可以将任何位置的集群连接到任何公共商业 Amazon 区域（中国或 GovCloud Amazon 区域除外）中的 Amazon EKS。

# 了解 Amazon EKS Connector 中的安全性
<a name="security-connector"></a>

Amazon EKS Connector 是在您的 Kubernetes 集群上运行的开源组件。此集群可以位于 Amazon 环境之外。这为安全责任创造了额外的注意事项。下面的图表对此配置进行说明。橙色代表 Amazon 责任，蓝色代表客户责任：

![\[EKS Connector 责任\]](http://docs.amazonaws.cn/eks/latest/userguide/images/connector-model.png)


本主题介绍了连接的集群在 Amazon 外部时责任模型的差异。

## Amazon 责任
<a name="connect-aws-resp"></a>
+ 维护、构建和交付 Amazon EKS Connector，后者是在客户的 Kubernetes 集群上运行并与 Amazon 通信的[开源组件](https://github.com/aws/amazon-eks-connector)。
+ 维护连接的 Kubernetes 集群和 Amazon 服务之间的传输层和应用程序层通信安全。

## 客户责任
<a name="connect-cust-resp"></a>
+ Kubernetes 集群特定的安全性，具体来说如下：
  + Kubernetes 密钥必须得到妥当的加密和保护。
  + 锁定对 `eks-connector` 命名空间的访问权限。
+ 配置基于角色的访问控制（RBAC）权限以管理 Amazon 的 [IAM 主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html#iam-term-principal)访问权限。有关说明，请参阅 [授予在 Amazon EKS 控制台上查看 Kubernetes 集群资源的权限](connector-grant-access.md)。
+ 安装和升级 Amazon EKS Connector。
+ 维护支持已连接的 Kubernetes 集群的硬件、软件和基础设施。
+ 保护他们的 Amazon 账户安全（例如，通过保护您的[根用户凭证](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#lock-away-credentials)安全）。