配置 Kubernetes 服务账户以使用 EKS 容器组身份分派 IAM 角色 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

配置 Kubernetes 服务账户以使用 EKS 容器组身份分派 IAM 角色

本主题介绍如何配置 Kubernetes 服务账户,以使用 EKS 容器组身份分派 Amazon Identity and Access Management(IAM)角色。然后,配置为使用服务账户的任何 Pods 都可以访问该角色有权访问的任何 Amazon Web Service。

要创建 EKS 容器组身份关联,只需一步;您可以通过 Amazon Web Services Management Console、Amazon CLI、Amazon SDK、Amazon CloudFormation,以及其他工具在 EKS 中创建关联。任何 Kubernetes 对象中都没有关于集群内关联的任何数据或元数据,也不需要向服务账户帐户添加任何注释。

先决条件
  • 现有集群。如果您没有,可以按照 开始使用 Amazon EKS 指南之一创建一个。

  • 创建关联的 IAM 主体必须具有 iam:PassRole

  • 在您的设备或 Amazon CloudShell 上安装和配置的最新版本 Amazon CLI。您可以使用 aws --version | cut -d / -f2 | cut -d ' ' -f1 检查您的当前版本。软件包管理器(如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 Amazon CLI 的最新版本落后几个版本。要安装最新版本,请参阅《Amazon Command Line Interface 用户指南》中的安装、更新和卸载 Amazon CLI使用 aws configure 进行快速配置。Amazon CloudShell 中安装的 Amazon CLI 版本也可能比最新版本落后几个版本。要对其进行更新,请参阅《Amazon CloudShell 用户指南》中的将 Amazon CLI 安装到您的主目录

  • 您的设备或 Amazon CloudShell 上安装了 kubectl 命令行工具。该版本可以与集群的 Kubernetes 版本相同,或者最多早于或晚于该版本一个次要版本。例如,如果您的集群版本为 1.29,则可以将 kubectl1.281.291.30 版本与之配合使用。要安装或升级 kubectl,请参阅 安装或更新 kubectl

  • 包含集群配置的现有 kubectl config 文件。要创建 kubectl config 文件,请参阅 为 Amazon EKS 集群创建或更新 kubeconfig 文件

创建 EKS 容器组身份关联

Amazon Web Services Management Console
  1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

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

  3. 选择访问选项卡。

  4. 容器组身份关联中,选择创建

  5. 对于 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 在对 Amazon STS 的请求中包含会话标签

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

    有关 Amazon EKS 条件键的列表,请参阅《服务授权参考》中的 Amazon Elastic Kubernetes Service 定义的条件。要了解您可以对哪些操作和资源使用条件键,请参阅 Amazon Elastic Kubernetes Service 定义的操作

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

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

  8. (可选)对于标签,选择添加标签以在键值对中添加元数据。这些标签将应用于关联,并可在 IAM 策略中使用。

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

  9. 选择创建

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

    创建一个 IAM 策略。您可以创建自己的策略,也可以复制已授予您部分所需权限的 Amazon 托管策略,并根据您的特定要求对其进行自定义。有关更多信息,请参阅《IAM 用户指南》中的创建 IAM 策略

    1. 创建一个包含 Pods 访问 Amazon Web Services 所需权限的文件。有关所有 Amazon Web Services 的所有操作的列表,请参阅服务授权参考

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

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. 创建 IAM 策略。

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. 创建 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
    2. 运行以下命令为 IAM 角色创建信任策略文件。

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] } EOF
    3. 创建角色。将 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"
    4. 将 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 容器组身份不在服务账户上使用注释。

    5. 运行以下命令以创建关联。将 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 容器组身份关联才能正常工作。

  3. 确认角色和服务账户配置正确。

    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" ] } ] }
    2. 确认您在上一步中附加到角色的策略已附加到该角色。

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

      示例输出如下。

      arn:aws:iam::111122223333:policy/my-policy
    3. 设置一个变量以存储要使用策略的 Amazon 资源名称(ARN)。将 my-policy 替换为要确认其权限的策略的名称。

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. 查看该策略的默认版本。

      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", [...] } }
    5. 查看策略内容以确保该策略包括您的 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" } ] }

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

后续步骤

配置 Pods 以使用 Kubernetes 服务账户