

 **帮助改进此页面** 

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

# Amazon EKS 节点 IAM 角色
<a name="create-node-role"></a>

Amazon EKS 节点 `kubelet` 守护进程代表您调用 AWS API。节点通过 IAM 实例配置文件和关联的策略获得这些 API 调用的权限。您必须先为节点创建 IAM 角色以在启动它们时使用，然后才能启动这些节点并在集群中注册它们。此要求适用于通过由 Amazon 提供的 Amazon EKS 优化版 AMI 启动的节点，也适用于您打算使用的任何其他节点 AMI。此外，此要求适用于托管节点组和自行管理的节点。

**注意**  
您不能使用创建任何集群时使用的相同角色。

必须先使用以下权限创建 IAM 角色，然后才能创建节点：
+ `kubelet` 描述 VPC 中 Amazon EC2 资源的权限，例如 [AmazonEKSWorkerNodePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKSWorkerNodePolicy.html) 策略提供的权限。该策略还为 Amazon EKS 容器组身份代理提供权限。
+ `kubelet` 使用来自 Amazon Elastic Container Registry（Amazon ECR）的容器映像的权限，例如 [AmazonEC2ContainerRegistryPullOnly](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ContainerRegistryPullOnly.html) 策略提供的权限。使用来自 Amazon Elastic Container Registry（Amazon ECR）的容器映像的权限是必要条件，因为用于联网的内置附加组件运行的 Pod 使用来自 Amazon ECR 的容器映像。
+ （可选）Amazon EKS 容器组身份代理使用 `eks-auth:AssumeRoleForPodIdentity` 操作检索容器组凭证的权限。如果不使用 [AmazonEKSWorkerNodePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKSWorkerNodePolicy.html)，则除了使用 EKS 容器组身份的 EC2 权限外，您还必须提供此权限。
+ （可选）如果不使用 IRSA 或 EKS 容器组身份向 VPC CNI 容器组授予权限，则必须在实例角色中提供 VPC CNI 的权限。您可以使用 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html) 托管策略（如果使用 `IPv4` 系列创建集群）或[您创建的 IPv6 策略](cni-iam-role.md#cni-iam-role-create-ipv6-policy)（如果使用 `IPv6` 系列创建集群）。但是，我们建议您将策略附加到专门用于 Amazon VPC CNI 附加组件的单独角色，而不是附加到此角色。有关为 Amazon VPC CNI 附加组件创建单独角色的详细信息，请参阅 [配置 Amazon VPC CNI 插件以使用 IRSA](cni-iam-role.md)。

**注意**  
Amazon EC2 节点组必须具有与 Fargate 配置文件不同的 IAM 角色。有关更多信息，请参阅 [Amazon EKS 容器组（pod）执行 IAM 角色](pod-execution-role.md)。

## 检查现有节点角色
<a name="check-worker-node-role"></a>

可以使用以下过程检查并查看您的账户是否已有 Amazon EKS 节点角色。

1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

1. 在左侧导航窗格中，选择 **角色**。

1. 在角色列表中搜索 `eksNodeRole`、`AmazonEKSNodeRole` 或 `NodeInstanceRole`。如果其中一个名称的角色不存在，请参阅[创建 Amazon EKS 节点 IAM 角色](#create-worker-node-role)以创建该角色。如果包含 `eksNodeRole`、`AmazonEKSNodeRole` 或 `NodeInstanceRole` 的角色确实存在，请选择该角色以查看附加的策略。

1. 选择**权限**。

1. 确保将 **AmazonEKSWorkerNodePolicy** 和 **AmazonEC2ContainerRegistryPullOnly** 托管策略附加到此角色，或者使用最低权限附加自定义策略。
**注意**  
如果 **AmazonEKS\$1CNI\$1Policy** 策略已附加到角色，我们建议删除此策略并改为将其附加到映射到 `aws-node` Kubernetes 服务账户的 IAM 角色。有关更多信息，请参阅 [配置 Amazon VPC CNI 插件以使用 IRSA](cni-iam-role.md)。

1. 选择 **Trust relationships**（信任关系），然后选择 **Edit trust policy**（编辑信任策略）。

1. 验证信任关系是否包含以下策略。如果信任关系符合以下策略，请选择 **Cancel**（取消）。如果信任关系不匹配，请将策略复制到**编辑信任策略**窗口并选择**更新策略**。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sts:AssumeRole"
               ],
               "Principal": {
                   "Service": [
                       "ec2.amazonaws.com"
                   ]
               }
           }
       ]
   }
   ```

## 创建 Amazon EKS 节点 IAM 角色
<a name="create-worker-node-role"></a>

您可以使用 AWS 管理控制台 或 AWS 创建节点 IAM 角色。

 AWS 管理控制台   

1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

1. 在左侧导航窗格中，选择 **Roles**（角色）。

1. 在 **Roles**（角色）页面上，选择 **Create role**（创建角色）。

1. 在 **Select trusted entity**（选择受信任的实体）页面上，请执行以下操作：

   1. 在**可信实体类型**部分中，选择 **AWS 服务**。

   1. 在 **Use case**（使用案例）下，选择 **EC2**。

   1. 选择**下一步**。

1. 在**添加权限**页面上，附加自定义策略或执行以下操作：

   1. 在 **Filter policies (筛选器策略)** 框中，输入 `AmazonEKSWorkerNodePolicy`。

   1. 选中搜索结果中的 **AmazonEKSWorkerNodePolicy** 左侧的复选框。

   1. 请选择 **Clear filters**（清除筛选条件）。

   1. 在 **Filter policies (筛选器策略)** 框中，输入 `AmazonEC2ContainerRegistryPullOnly`。

   1. 选中搜索结果中的 **AmazonEC2ContainerRegistryPullOnly** 左侧的复选框。

      **AmazonEKS\$1CNI\$1Policy** 托管式策略或您创建的 [IPv6 策略](cni-iam-role.md#cni-iam-role-create-ipv6-policy)还必须附加到此角色或映射到 `aws-node` Kubernetes 服务账户的其他角色。我们建议将策略分配给与 Kubernetes 服务账户关联的角色，而不是将其分配给此角色。有关更多信息，请参阅 [配置 Amazon VPC CNI 插件以使用 IRSA](cni-iam-role.md)。

   1. 选择**下一步**。

1. 在 **Name, review, and create**（命名、查看和创建）页面中，请执行以下操作：

   1. 对于 **Role name**（角色名称），请为角色输入唯一名称，例如 `AmazonEKSNodeRole`。

   1. 对于 **Description**（说明），请将当前文本替换为描述性文本，例如 `Amazon EKS - Node role`。

   1. 在**添加标签（可选）**下，将标签作为键值对附加，以将元数据添加到角色。有关在 IAM 中使用标签的更多信息，请参阅《IAM 用户指南》** 中的[标记 IAM 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)。

   1. 选择**创建角色**。

 AWS CLI  

1. 运行以下命令以创建 `node-role-trust-relationship.json` 文件。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sts:AssumeRole"
               ],
               "Principal": {
                   "Service": [
                       "ec2.amazonaws.com"
                   ]
               }
           }
       ]
   }
   ```

1. 创建 IAM 角色。

   ```
   aws iam create-role \
     --role-name AmazonEKSNodeRole \
     --assume-role-policy-document file://"node-role-trust-relationship.json"
   ```

1. 将两个所需的 IAM 托管策略附加到 IAM 角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \
     --role-name AmazonEKSNodeRole
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly \
     --role-name AmazonEKSNodeRole
   ```

1. 根据创建集群时使用的 IP 系列，将以下 IAM policy 之一附加到 IAM 角色。该策略必须附加到此角色，或与用于 Kubernetes 的 Amazon VPC CNI 插件的 Kubernetes `aws-node` 服务账户关联的角色。我们建议将策略分配给与 Kubernetes 服务账户关联的角色。要将策略分配给与 Kubernetes 服务账户关联的角色，请参阅 [配置 Amazon VPC CNI 插件以使用 IRSA](cni-iam-role.md)。
   + IPv4

     ```
     aws iam attach-role-policy \
       --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
       --role-name AmazonEKSNodeRole
     ```
   + IPv6

     1. 复制以下文本并将其保存到名为 `vpc-cni-ipv6-policy.json` 的文件。

        ```
        {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "ec2:AssignIpv6Addresses",
                        "ec2:DescribeInstances",
                        "ec2:DescribeTags",
                        "ec2:DescribeNetworkInterfaces",
                        "ec2:DescribeInstanceTypes"
                    ],
                    "Resource": "*"
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "ec2:CreateTags"
                    ],
                    "Resource": [
                        "arn:aws:ec2:*:*:network-interface/*"
                    ]
                }
            ]
        }
        ```

     1. 创建 IAM policy。

        ```
        aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json
        ```

     1. 将 IAM policy 附加到 IAM 角色。将 *111122223333* 替换为您的账户 ID。

        ```
        aws iam attach-role-policy \
          --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \
          --role-name AmazonEKSNodeRole
        ```