为服务账户创建 IAM 角色和策略 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为服务账户创建 IAM 角色和策略

您必须创建一个 IAM 策略,该策略指定您希望 Pod 中的容器拥有的权限。您可通过多种方式创建新的 IAM 权限策略。一种方法是复制已具有您期望的一些功能的完整 AWS 托管策略,然后根据您的特定要求对其进行自定义。有关更多信息,请参阅 https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html 中的创建新策略IAM 用户指南。

您还必须为 Kubernetes 服务账户创建 IAM 角色,以便在您将其与服务账户关联之前使用。该信任关系范围限定为您的集群和服务账户,这样各个集群和服务账户组合需要其自己的角色。然后,您可以将特定的 IAM 策略附加到角色,该策略为 Pod 中的容器提供所需的权限。以下过程介绍了如何执行此操作。

创建 IAM 策略

在此过程中,我们提供了您可用于应用程序的两个示例策略:

  • 一个策略允许对 Amazon S3 存储桶的只读访问权限。您应将配置信息或引导脚本存储在此存储桶中,并且您 Pod 中的容器可以从存储桶读取文件并将其加载到应用程序中。

  • 允许来自 AWS Marketplace 的付费容器映像的策略。

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航面板中,选择 Policies (策略),然后选择 Create policy (创建策略)

  3. 选择 JSON 选项卡。

  4. Policy Document (策略文档) 字段中,粘贴以下策略之一以应用到您的服务账户,或将您自己的策略文档粘贴到字段中。您还可以使用可视化编辑器构建自己的策略。

    以下示例授予对 <my-pod-secrets-bucket> Amazon S3 存储桶的权限。您可以修改策略文档以满足您的特定需求。

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

    以下示例授予所需权限以使用来自 AWS Marketplace 的付费容器映像。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "aws-marketplace:RegisterUsage" ], "Effect": "Allow", "Resource": "*" } ] }
  5. 选择查看策略

  6. 输入您策略的名称和描述,然后选择 Create policy (创建角色)

  7. 记录策略的 Amazon 资源名称 (ARN) 以便在您稍后创建角色时使用。

为服务账户创建 IAM 角色

为您的服务账户创建 IAM 角色。您可以使用 eksctlAWS 管理控制台 或 AWS CLI 创建角色。

Prerequisites

  • 使用现有 集群。如果没有,可以使用 Amazon EKS 入门 指南之一创建一个。

  • 如果使用 AWS 管理控制台 或 AWS CLI 创建角色,则集群必须具有现有 IAM OIDC 提供商。有关更多信息,请参阅为集群创建 IAM OIDC 提供商

  • 一个现有 IAM 策略,其中包含您的服务账户需要访问的 AWS 资源的权限。有关更多信息,请参阅创建 IAM 策略

使用 IAM 创建 eksctl 角色

使用以下命令来创建服务账户和 IAM 角色。将 <example values>(包括 <>)替换为您自己的值。

注意

此命令仅适用于使用 eksctl 创建的集群。 如果您未使用 eksctl 创建集群,则使用 AWS 管理控制台 或 AWS CLI 选项卡上的说明。

eksctl create iamserviceaccount \ --name <service_account_name> \ --namespace <service_account_namespace> \ --cluster <cluster_name> \ --attach-policy-arn <IAM_policy_ARN> \ --approve \ --override-existing-serviceaccounts

将部署一个 AWS CloudFormation 模板,以创建 IAM 角色并向其附加 IAM 策略。该角色与 Kubernetes 服务账户关联。如果您的集群没有现有的 IAM OIDC 提供商,则已创建一个。如果该服务账户不存在,则会在您提供的命名空间中创建它。如果服务账户已存在,则使用 eks.amazonaws.com/role-arn: arn:aws:iam::<your-account-id>:role/<iam-role-name-that-was-created> 为其添加注释。

使用 IAM 创建 AWS 管理控制台 角色

  1. Open the Amazon EKS console at https://console.amazonaws.cn/eks/home#/clusters.

  2. 选择集群的名称,然后选择 Configuration (配置) 选项卡。

  3. Details (详细信息) 部分中,记下 OpenID Connect provider URL (OpenID Connect 提供商 URL) 的值。

  4. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  5. 在导航窗格中,依次选择 Roles (角色)Create Role (创建角色)

  6. Select type of trusted entity (选择受信任实体的类型) 部分中,选择 Web identity (Web 身份)

  7. Choose a web identity provider (选择 Web 身份提供商) 部分中:

    1. 对于 Identity provider (身份提供商),选择您集群的 URL。

    2. 对于 Audience (受众),请选择 sts.amazonaws.com

  8. 选择 Next: Permissions (下一步:权限)

  9. Attach Policy (附加策略) 部分中,选择 IAM 策略,该策略具有您希望服务账户使用的权限。

  10. 选择下一步: 标签

  11. Add tags (optional) (添加标签(可选)) 屏幕上,您可以为账户添加标签。选择下一步:审核

  12. 对于 Role Name (角色名称),为您的角色输入名称 然后选择 Create Role (创建角色)

  13. 创建角色后,在控制台中选择角色以将其打开进行编辑。

  14. 选择 Trust relationships 选项卡,然后选择 Edit trust relationship

  15. 更改看上去类似于以下内容的行:

    "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    要看上去如下所示,请将 <example values>(包括 <>)更改为您自己的内容:

    "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B716D3041E>:sub": "system:serviceaccount:<SERVICE_ACCOUNT_NAMESPACE>:<SERVICE_ACCOUNT_NAME>"
    注意

    如果您没有现有服务账户,则需要创建一个。有关更多信息,请参阅 Kubernetes 文档中的为 Pod 配置服务账户。要使服务账户能够使用 Kubernetes 权限,您必须创建 RoleClusterRole,然后将角色绑定到服务账户。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。例如,在部署 AWS VPC CNI 插件时,部署清单将创建服务账户、集群角色和集群角色绑定。您可以在 上查看清单GitHub。

  16. 选择 Update Trust Policy (更新可信策略) 以完成操作。

使用 IAM 创建 AWS CLI 角色

  1. 使用以下命令将 AWS 账户 ID 设置为环境变量。

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
  2. 使用以下命令将您的 OIDC 身份提供商设置为环境变量。将 <example values>(包括 <>)替换为您自己的值。

    重要

    您必须至少使用 AWS CLI 的版本 1.18.190 或 2.1.7,才能从此命令接收适合的输出。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS CLI

    OIDC_PROVIDER=$(aws eks describe-cluster --name <cluster-name> --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  3. 将以下代码块复制到您的计算机,并将 <example values> 替换为您自己的值。

    read -r -d '' TRUST_RELATIONSHIP <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "${OIDC_PROVIDER}:sub": "system:serviceaccount:<my-namespace>:<my-service-account>" } } } ] } EOF echo "${TRUST_RELATIONSHIP}" > trust.json
  4. 运行上一步中修改后的代码块以创建名为 trust.json 的文件。

  5. 运行以下 AWS CLI 命令以创建角色。

    aws iam create-role --role-name <IAM_ROLE_NAME> --assume-role-policy-document file://trust.json --description "<IAM_ROLE_DESCRIPTION>"
  6. 运行以下命令,将 IAM 策略附加到您的角色。

    aws iam attach-role-policy --role-name <IAM_ROLE_NAME> --policy-arn=<IAM_POLICY_ARN>