

 **帮助改进此页面** 

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

# 配置容器组（pod）使用 Kubernetes 服务账户
<a name="pod-configuration"></a>

如果容器组（pod）需要访问 AWS 服务，则必须配置它来使用 Kubernetes 服务账户。服务账户必须关联到有权访问 AWS 服务的 AWS Identity and Access Management（IAM）角色。
+ 现有集群。如果还没有，可以使用[开始使用 Amazon EKS](getting-started.md) 中的指南之一创建一个。
+ 您的集群的现有 IAM OpenID Connect (OIDC) 提供商。要了解您是否已拥有一个（IAM）角色或如何创建一个（IAM）角色，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+ 与 IAM 角色关联的现有 Kubernetes 服务账户。必须使用 IAM 角色的 Amazon 资源名称（ARN）注释服务账户。该角色必须具有关联的 IAM 策略，其中包含您希望容器组（pod）必须具有的权限，以便使用 AWS 服务。有关如何创建和配置服务账户和角色的更多信息，请参阅 [为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md)。
+ 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `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)。

  1. 使用以下命令创建部署清单，您可以使用该部署清单部署容器组（pod）来确认配置。将示例值替换为您自己的值。

     ```
     cat >my-deployment.yaml <<EOF
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: my-app
     spec:
       selector:
         matchLabels:
           app: my-app
       template:
         metadata:
           labels:
             app: my-app
         spec:
           serviceAccountName: my-service-account
           containers:
           - name: my-app
             image: public.ecr.aws/nginx/nginx:X.XX
     EOF
     ```

  1. 将清单部署到集群。

     ```
     kubectl apply -f my-deployment.yaml
     ```

  1. 确认容器组（pod）具有所需的环境变量。

     1. 按上一步部署后，查看部署的容器组（pod）。

        ```
        kubectl get pods | grep my-app
        ```

        示例输出如下。

        ```
        my-app-6f4dfff6cb-76cv9   1/1     Running   0          3m28s
        ```

     1. 查看容器组（pod）使用的 IAM 角色的 ARN。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_ROLE_ARN:
        ```

        示例输出如下。

        ```
        AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/my-role
        ```

        角色 ARN 必须与您用于注释现有服务账户的角色 ARN 匹配。有注释服务账户的更多信息，请参阅 [为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md)。

     1. 确认容器组（pod）有 Web 身份令牌文件挂载。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_WEB_IDENTITY_TOKEN_FILE:
        ```

        示例输出如下。

        ```
        AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
        ```

        `kubelet` 代表容器组（pod）请求并存储令牌。默认情况下，如果令牌早于其总生存时间的 80%，或者令牌大于 24 小时，则 `kubelet` 会刷新令牌。您可以使用容器组（pod）规范中的设置修改任何账户（默认服务账户除外）的到期期限。有关更多信息，请参阅 Kubernetes 文档中的[服务账户令牌卷预测](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#serviceaccount-token-volume-projection)。

        集群上的 [Amazon EKS 容器组身份 Webhook](https://github.com/aws/amazon-eks-pod-identity-webhook#amazon-eks-pod-identity-webhook) 监控使用具有以下注释的服务账户：

        ```
        eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
        ```

        Webhook 将之前的环境变量应用于这些容器组（pod）。您的集群无需使用 Webhook 来配置环境变量和令牌文件挂载。您可以手动配置容器组（pod）来包含这些环境变量。[AWS 开发工具包支持的版本](iam-roles-for-service-accounts-minimum-sdk.md)首先在凭证链提供商中查找这些环境变量。角色凭证用于满足这些标准的容器组（pod）。

  1. 确认您的容器组（pod）可以使用您在附加到角色的 IAM 策略中分配的权限与 AWS 服务进行交互。
**注意**  
当容器组（pod）使用来自与服务账户关联的 IAM 角色的 AWS 凭证时，该容器组（pod）中的 AWS CLI 或其他 SDK 包仅使用该角色提供的凭证。如果您不限制对提供给 [Amazon EKS 节点 IAM 角色](create-node-role.md)的凭证的访问，容器组（pod）仍然可以访问这些凭证。有关更多信息，请参阅[限制对分配给 Worker 节点的实例配置文件的访问](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

     如果您的容器组（pod）无法按预期与服务进行交互，请完成以下步骤，确认所有配置都正确。

     1. 确认您的容器组（pod）使用支持通过 OpenID Connect Web 身份令牌文件担任 IAM 角色的 AWS SDK 版本。有关更多信息，请参阅 [将 IRSA 与 AWS SDK 结合使用](iam-roles-for-service-accounts-minimum-sdk.md)。

     1. 确认部署正在使用服务账户。

        ```
        kubectl describe deployment my-app | grep "Service Account"
        ```

        示例输出如下。

        ```
        Service Account:  my-service-account
        ```

     1. 如果您的容器组（pod）仍然无法访问服务，请查看[为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md#irsa-confirm-role-configuration)中描述的[步骤](associate-service-account-role.md)，确认角色和服务账户的配置都正确。