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

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

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

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

创建 IAM 策略

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

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

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

  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/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/*" ] } ] }

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

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "aws-marketplace:RegisterUsage" ], "Effect": "Allow", "Resource": "*" } ] }
  5. 选择 Review policy (审核策略)

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

  7. 记录策略的 Amazon Resource Name (ARN),以便在您稍后创建角色时使用。

为服务账户创建 IAM 角色

为 Kubernetes 服务账户创建 IAM 角色。您可以使用 eksctl、Amazon Web Services Management Console 或 Amazon CLI 来创建角色。

先决条件

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

  • 如果使用 Amazon Web Services Management Console 或 Amazon CLI 创建角色,则您的集群必须拥有现有的 IAM OIDC 提供商。有关更多信息,请参阅 为集群创建 IAM OIDC 提供商

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

您可以使用 eksctl、Amazon Web Services Management Console 或 Amazon CLI 创建 IAM 角色。选择带有要用于创建角色的工具名称的选项卡。

eksctl

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

eksctl create iamserviceaccount \ --name kubernetes_service_account_name \ --namespace kubernetes_service_account_namespace \ --cluster my-cluster \ --attach-policy-arn IAM_policy_ARN \ --approve \ --override-existing-serviceaccounts

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

Amazon Web Services Management Console
  1. 访问 https://console.aws.amazon.com/eks/home#/clusters 打开 Amazon EKS 控制台。

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

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

  4. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  5. 在左侧导航窗格中,选择 Roles (角色)。然后选择 Create role (创建角色)

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

  7. Web identity(Web 身份)部分:

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

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

  8. 选择 Next (下一步)

  9. Filter policies(筛选策略)框中,输入具有您希望服务账户使用的权限的 IAM 策略名称。

  10. 选中要在搜索结果中使用的策略左侧的复选框。

  11. 选择 Next (下一步)

  12. 对于 Role name (角色名称),为角色输入唯一名称,例如 myRole

  13. 对于 Description(说明),输入描述性文本,例如 Amazon EKS - Service account role

  14. 选择 Create role (创建角色)

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

  16. 选择 Trust relationships(信任关系)选项卡,然后选择 Edit trust policy(编辑信任策略)。

  17. 该行看起来类似于以下行:

    "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    将该行更改为类似于以下行。将 EXAMPLED539D4633E53DE1B716D3041E 替换为集群的 OIDC 提供程序 ID,并将 region-code 替换为集群所在的 Amazon Web Services 区域代码。将 aud 替换为 sub,并将 KUBERNETES_SERVICE_ACCOUNT_NAMESPACEKUBERNETES_SERVICE_ACCOUNT_NAME 替换为 Kubernetes 服务账户名称和账户所在的 Kubernetes 命名空间。

    "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:KUBERNETES_SERVICE_ACCOUNT_NAMESPACE:KUBERNETES_SERVICE_ACCOUNT_NAME"
    注意

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

  18. 选择 Update policy(更新策略)以完成操作。

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

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

    重要

    您必须使用至少 1.22.30 或 2.4.9 版本的 Amazon CLI,才能收到此命令的合适输出。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的安装 Amazon 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::${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. 运行以下 Amazon 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