本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为服务账户创建 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 的付费容器映像的策略。
-
通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/
。 -
在导航面板中,选择 Policies (策略),然后选择 Create policy (创建策略)。
-
选择 JSON 选项卡。
-
在 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": "*" } ] }
-
选择查看策略。
-
输入您策略的名称和描述,然后选择 Create policy (创建角色)。
-
记录策略的 Amazon 资源名称 (ARN) 以便在您稍后创建角色时使用。
为服务账户创建 IAM 角色
为您的服务账户创建 IAM 角色。您可以使用 eksctl、AWS 管理控制台 或 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 管理控制台 角色
-
Open the Amazon EKS console at https://console.amazonaws.cn/eks/home#/clusters
. -
选择集群的名称,然后选择 Configuration (配置) 选项卡。
-
在 Details (详细信息) 部分中,记下 OpenID Connect provider URL (OpenID Connect 提供商 URL) 的值。
-
通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/
。 -
在导航窗格中,依次选择 Roles (角色) 和 Create Role (创建角色)。
-
在 Select type of trusted entity (选择受信任实体的类型) 部分中,选择 Web identity (Web 身份)。
-
在 Choose a web identity provider (选择 Web 身份提供商) 部分中:
-
对于 Identity provider (身份提供商),选择您集群的 URL。
-
对于 Audience (受众),请选择
sts.amazonaws.com
。
-
-
选择 Next: Permissions (下一步:权限)。
-
在 Attach Policy (附加策略) 部分中,选择 IAM 策略,该策略具有您希望服务账户使用的权限。
-
选择下一步: 标签。
-
在 Add tags (optional) (添加标签(可选)) 屏幕上,您可以为账户添加标签。选择下一步:审核。
-
对于 Role Name (角色名称),为您的角色输入名称 然后选择 Create Role (创建角色)。
-
创建角色后,在控制台中选择角色以将其打开进行编辑。
-
选择 Trust relationships 选项卡,然后选择 Edit trust relationship。
-
更改看上去类似于以下内容的行:
"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 权限,您必须创建 Role
或ClusterRole
,然后将角色绑定到服务账户。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。例如,在部署 AWS VPC CNI 插件时,部署清单将创建服务账户、集群角色和集群角色绑定。您可以在 上查看 清单GitHub。 -
选择 Update Trust Policy (更新可信策略) 以完成操作。
使用 IAM 创建 AWS CLI 角色
-
使用以下命令将 AWS 账户 ID 设置为环境变量。
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
-
使用以下命令将您的 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:\/\///")
-
将以下代码块复制到您的计算机,并将
<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
-
运行上一步中修改后的代码块以创建名为
trust.json
的文件。 -
运行以下 AWS CLI 命令以创建角色。
aws iam create-role --role-name <IAM_ROLE_NAME> --assume-role-policy-document file://trust.json --description "<IAM_ROLE_DESCRIPTION>"
-
运行以下命令,将 IAM 策略附加到您的角色。
aws iam attach-role-policy --role-name <IAM_ROLE_NAME> --policy-arn=<IAM_POLICY_ARN>