为您的服务账户创建 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. 在导航面板中,选择策略,然后选择创建策略

  3. 选择 JSON 选项卡。

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

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

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

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

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

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

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

为服务账户创建 IAM 角色

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

Prerequisites

  • 使用现有 集群。如果还没有存储桶,可以使用其中一个Amazon EKS 入门指南。

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

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

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

eksctl

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

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

一个Amazon CloudFormation模板,该模板创建一个 IAM 角色并向其附加此 IAM 策略。该角色与 Kubernetes 服务账户相关联。如果您的集群没有现有的 IAM OIDC 提供商,则创建了一个。如果服务帐户不存在,则将在您提供的命名空间中创建服务帐户。如果服务帐户确实存在,那么它会使用eks.amazonaws.com/role-arn: arn:aws-cn:iam::<your-account-id>:role/<iam-role-name-that-was-created>

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

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

  3. 详细信息部分中,记下OpenID Connect 提供商 URL

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

  5. 在导航面板中,选择角色创建角色

  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. 附加策略部分中,选择具有您希望您的服务账户使用的权限的 IAM 策略。

  10. 选择 Next:。标签

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

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

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

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

  15. 找到类似于以下内容的行:

    "oidc.eks.cn-north-1.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    更改此行,使它与如下一行类似。Replace<EXAMPLED539D4633E53DE1B716D3041E>(包括<>)替换为集群的 OIDC 提供程序 ID,并 <region-code> 替换为集群所在的区域代码。

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

    如果您没有现有服务账户,则需要创建一个账户。有关更多信息,请参阅 。配置窗格的服务帐户在 Kubernetes 文档中。要使服务帐户能够使用 Kubernetes 权限,您必须创建Role,或者ClusterRole,然后将角色绑定到服务帐户。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。当AmazonVPC CNI 插件,例如,部署清单将创建一个服务账户、集群角色和集群角色绑定。您可以查看清单(位于 GitHub 上)。

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

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

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

    重要

    您必须至少使用版本 1.19.75 或 2.2.5Amazon 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-cn: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. 运行以下命令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>