

 **帮助改进此页面** 

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

# 向 Kubernetes 服务账户分配 IAM 角色
<a name="pod-id-association"></a>

本主题介绍如何配置 Kubernetes 服务账户，以便使用 EKS 容器组身份担任 AWS Identity and Access Management（IAM）角色。然后，配置为使用服务账户的任何容器组（pod）都可以访问该角色有权访问的任何 AWS 服务。

要创建 EKS 容器组身份关联，只需一步；您可以通过 AWS 管理控制台、AWS CLI、AWS SDK、AWS CloudFormation，以及其它工具在 EKS 中创建关联。任何 Kubernetes 对象中都没有关于集群内关联的任何数据或元数据，也不需要向服务账户添加任何注释。

 **先决条件** 
+ 现有集群。如果您没有，可以按照[开始使用 Amazon EKS](getting-started.md) 中的指南之一创建一个。
+ 创建关联的 IAM 主体必须具有 `iam:PassRole`。
+ 在您的设备或 AWS CLI 上安装和配置的最新版本 AWS CloudShell。您可以使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1` 检查您的当前版本。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含集群配置的现有 `kubectl` `config` 文件。要创建 `kubectl` `config` 文件，请参阅 [通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群](create-kubeconfig.md)。

## 创建容器组身份关联（AWS 控制台）
<a name="pod-id-association-create"></a>

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

1. 在左侧导航窗格中，选择**集群**，然后为您要配置 EKS 容器组身份代理插件的集群选择集群名称。

1. 选择**访问**选项卡。

1. 在**容器组身份关联**中，选择**创建**。

1. 对于 **IAM 角色**，选择具有工作负载所需权限的 IAM 角色。
**注意**  
该列表仅包含具有以下信任策略的角色，该策略允许 EKS 容器组身份使用这些角色。

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

    `sts:AssumeRole` – 在将临时凭证传递给您的容器组之前，EKS 容器组身份使用 `AssumeRole` 分派 IAM 角色。

    `sts:TagSession` – EKS 容器组身份使用 `TagSession` 在对 AWS STS 的请求中包含*会话标签*。

   您可以在信任策略的*条件键*中使用这些标签，来限制哪些服务账户、命名空间和集群可以使用此角色。

   有关 Amazon EKS 条件键的列表，请参阅《Service Authorization Reference》**中的 [Conditions defined by Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-policy-keys)。要了解您可以对哪些操作和资源使用条件键，请参阅 [Actions defined by Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)。

1. 对于 **Kubernetes 命名空间**，选择包含服务账户和工作负载的 Kubernetes 命名空间。或者，您可以按名称指定集群中不存在的命名空间。

1. 对于 **Kubernetes 服务账户**，选择要使用的 Kubernetes 服务账户。Kubernetes 工作负载清单必须指定此服务账户。或者，您可以按名称指定集群中不存在的服务账户。

1. （可选）选择**禁用会话标签**以禁用容器组身份在担任角色时自动添加的默认会话标签。

1. （可选）切换**配置会话策略**，以配置 IAM 策略，以便对这个容器组身份关联施加超出附加到 IAM 角色的 IAM 策略所定义权限的额外限制。
**注意**  
只有在**禁用会话标签**设置被选中的情况下，才能应用会话策略。

1. （可选）对于**标签**，选择**添加标签**以在键值对中添加元数据。这些标签将应用于关联，并可在 IAM 策略中使用。

   您可以重复此步骤以添加多个标签。

1. 选择**创建**。

## 创建容器组身份关联（AWS CLI）
<a name="create_a_pod_identity_association_shared_aws_cli"></a>

1. 要将现有 IAM 策略关联到您的 IAM 角色，请跳至下一步。

   创建一个 IAM 策略。您可以创建自己的策略，也可以复制已授予您部分所需权限的 AWS 托管策略，并根据您的特定要求对其进行自定义。有关更多信息，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

   1. 创建一个文件，其中包含您希望容器组（pod）访问的 AWS 服务所需的权限。有关所有 AWS 服务的所有操作的列表，请参阅[服务授权参考](https://docs.aws.amazon.com/service-authorization/latest/reference/)。

      您可以运行以下命令创建一个示例策略文件，以实现对 Amazon S3 存储桶的只读访问权限。您可以选择将配置信息或引导脚本存储在此存储桶中，并且容器组（pod）中的容器可以从存储桶读取文件并将其加载到应用程序中。如果您要创建此示例策略，请将以下内容复制到您的设备。将 *my-pod-secrets-bucket* 替换为您的存储桶名称并运行该命令。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "s3:GetObject",
                  "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
              }
          ]
      }
      ```

   1. 创建 IAM 策略。

      ```
      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
      ```

1. 创建 IAM 角色并将其与 Kubernetes 服务账户关联。

   1. 如果您有要担任 IAM 角色的现有 Kubernetes 服务账户，则可跳过此步骤。

      创建一个 Kubernetes 服务账户。将以下内容复制到您的设备。将 *my-service-account* 替换为所需的名称，如有必要，将 *default* 替换为其他命名空间。如更改 *default*，则命名空间必须已经存在。

      ```
      cat >my-service-account.yaml <<EOF
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: my-service-account
        namespace: default
      EOF
      kubectl apply -f my-service-account.yaml
      ```

      运行如下命令。

      ```
      kubectl apply -f my-service-account.yaml
      ```

   1. 运行以下命令为 IAM 角色创建信任策略文件。

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

   1. 创建角色。将 *my-role* 替换为您的 IAM 角色的名称，并将 *my-role-description* 替换为您的角色的描述。

      ```
      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
      ```

   1. 将 IAM 策略附加到您的角色。将 *my-role* 替换为您的 IAM 角色的名称，并将 *my-policy* 替换为您创建的现有策略的名称。

      ```
      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::111122223333:policy/my-policy
      ```
**注意**  
与服务账户的 IAM 角色不同，EKS 容器组身份不在服务账户上使用注释。

   1. 运行以下命令以创建关联。将 `my-cluster` 替换为集群的名称，将 *my-service-account* 替换为您所需的名称，并根据需要将 *default* 替换为其他命名空间。

      ```
      aws eks create-pod-identity-association --cluster-name my-cluster --role-arn arn:aws:iam::111122223333:role/my-role --namespace default --service-account my-service-account
      ```

      示例输出如下。

      ```
      {
          "association": {
              "clusterName": "my-cluster",
              "namespace": "default",
              "serviceAccount": "my-service-account",
              "roleArn": "arn:aws:iam::111122223333:role/my-role",
              "associationArn": "arn:aws::111122223333:podidentityassociation/my-cluster/a-abcdefghijklmnop1",
              "associationId": "a-abcdefghijklmnop1",
              "tags": {},
              "createdAt": 1700862734.922,
              "modifiedAt": 1700862734.922
          }
      }
      ```
**注意**  
您可以按名称指定集群中不存在的命名空间和服务账户。您必须创建命名空间、服务账户，以及使用服务账户的工作负载，EKS 容器组身份关联才能正常工作。

## 确认配置
<a name="pod-id-confirm-role-configuration"></a>

1. 确认 IAM 角色的信任策略配置正确。

   ```
   aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
   ```

   示例输出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Allow EKS Auth service to assume this role for Pod Identities",
               "Effect": "Allow",
               "Principal": {
                   "Service": "pods.eks.amazonaws.com"
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:TagSession"
               ]
           }
       ]
   }
   ```

1. 确认您在上一步中附加到角色的策略已附加到该角色。

   ```
   aws iam list-attached-role-policies --role-name my-role --query 'AttachedPolicies[].PolicyArn' --output text
   ```

   示例输出如下。

   ```
                  arn:aws:iam::111122223333:policy/my-policy
   ```

1. 设置一个变量以存储要使用策略的 Amazon 资源名称（ARN）。将 *my-policy* 替换为要确认其权限的策略的名称。

   ```
   export policy_arn=arn:aws:iam::111122223333:policy/my-policy
   ```

1. 查看该策略的默认版本。

   ```
   aws iam get-policy --policy-arn $policy_arn
   ```

   示例输出如下。

   ```
   {
       "Policy": {
           "PolicyName": "my-policy",
           "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
           "Arn": "arn:aws:iam::111122223333:policy/my-policy",
           "Path": "/",
           "DefaultVersionId": "v1",
           [...]
       }
   }
   ```

1. 查看策略内容以确保该策略包含容器组（pod）所需的所有权限。如有必要，将以下命令中的 *1* 替换为上一个输出中返回的版本。

   ```
   aws iam get-policy-version --policy-arn $policy_arn --version-id v1
   ```

   示例输出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
           }
       ]
   }
   ```

   如果您在上一步中创建了示例策略，则您的输出与示例相同。如果您创建了其他策略，则与*示例*内容不同。

## 后续步骤
<a name="_next_steps"></a>

 [配置容器组（pod）使用服务账户访问 AWS 服务](pod-id-configure-pods.md) 