Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
帮助改进此页面
想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。
为 Kubernetes 服务账户分配 IAM 角色
本主题介绍如何配置 Kubernetes 服务账户,以使用 EKS 容器组身份分派 Amazon Identity and Access Management(IAM)角色。然后,配置为使用服务账户的任何 Pods 都可以访问该角色有权访问的任何 Amazon Web Services 服务。
要创建 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
检查您的当前版本。软件包管理器(如 yum
、apt-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.30
,则可以将 kubectl
的 1.29
、1.30
或 1.31
版本与之配合使用。要安装或升级 kubectl
,请参阅 设置 kubectl 和 eksctl。
-
包含集群配置的现有 kubectl
config
文件。要创建 kubectl
config
文件,请参阅 通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群。
创建 EKS 容器组身份关联
- Amazon Web Services Management Console
-
从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters。
-
在左侧导航窗格中,选择集群,然后为您要配置 EKS 容器组身份代理插件的集群选择集群名称。
-
选择访问选项卡。
-
在容器组身份关联中,选择创建。
-
对于 IAM 角色,选择具有工作负载所需权限的 IAM 角色。
该列表仅包含具有以下信任策略的角色,该策略允许 EKS 容器组身份使用这些角色。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
-
对于 Kubernetes 命名空间,选择包含服务账户和工作负载的 Kubernetes 命名空间。或者,您可以按名称指定集群中不存在的命名空间。
-
对于 Kubernetes 服务账户,选择要使用的 Kubernetes 服务账户。Kubernetes 工作负载清单必须指定此服务账户。或者,您可以按名称指定集群中不存在的服务账户。
-
(可选)对于标签,选择添加标签以在键值对中添加元数据。这些标签将应用于关联,并可在 IAM 策略中使用。
您可以重复此步骤以添加多个标签。
-
选择创建。
- Amazon CLI
-
-
要将现有 IAM 策略关联到您的 IAM 角色,请跳至下一步。
创建一个 IAM 策略。您可以创建自己的策略,也可以复制已授予您部分所需权限的 Amazon 托管策略,并根据您的特定要求对其进行自定义。有关更多信息,请参阅《IAM 用户指南》中的创建 IAM 策略。
-
创建一个包含 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
-
创建 IAM 策略。
aws iam create-policy --policy-name my-policy
--policy-document file://my-policy.json
-
创建 IAM 角色并将其与 Kubernetes 服务账户关联。
-
如果您有要分派 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
-
运行以下命令为 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
-
创建角色。将 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
"
-
将 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 容器组身份不在服务账户上使用注释。
-
运行以下命令以创建关联。将 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 容器组身份关联才能正常工作。
>确认配置
确认角色和服务账户配置正确。
-
确认 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"
]
}
]
}
-
确认您在上一步中附加到角色的策略已附加到该角色。
aws iam list-attached-role-policies --role-name my-role
--query AttachedPolicies[].PolicyArn --output text
示例输出如下。
arn:aws:iam::111122223333
:policy/my-policy
-
设置一个变量以存储要使用策略的 Amazon 资源名称(ARN)。将 my-policy
替换为要确认其权限的策略的名称。
export policy_arn=arn:aws:iam::111122223333
:policy/my-policy
-
查看该策略的默认版本。
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
",
[...]
}
}
-
查看策略内容以确保该策略包括您的 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 以使用服务账户访问 Amazon 服务