配置 Kubernetes 服务账户以代入 IAM 角色
本主题介绍如何配置 Kubernetes 服务账户以代入 Amazon Identity and Access Management(IAM)角色。然后,配置为使用服务账户的任何 Pods 都可以访问该角色有权访问的任何 Amazon Web Service。
先决条件
-
现有集群。如果您没有,可以按照 开始使用 Amazon EKS 指南之一创建一个。
-
集群的现有 IAM OpenID Connect(OIDC)提供商。要了解您是否已拥有一个提供商或如何创建一个提供商,请参阅 为集群创建 IAM OIDC 提供商。
-
您的设备或 Amazon CloudShell 上安装并配置了
2.12.3
版或更高版本,或1.27.160
版或更高版本的 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.26
,则可以将kubectl
的1.25
、1.26
或1.27
版本与之配合使用。要安装或升级kubectl
,请参阅 安装或更新 kubectl。 -
包含集群配置的现有
kubectl
config
文件。要创建kubectl
config
文件,请参阅 为 Amazon EKS 集群创建或更新 kubeconfig 文件。
将 IAM 角色与 Kubernetes 服务账户关联。
-
要将现有 IAM policy 关联到您的 IAM 角色,请跳至下一步。
创建一个 IAM policy。您可以创建自己的策略,也可以复制已授予您部分所需权限的 Amazon 托管策略,并根据您的特定要求对其进行自定义。有关更多信息,请参阅 IAM 用户指南 中的创建 IAM policy。
-
创建一个包含 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 policy。
aws iam create-policy --policy-name
my-policy
--policy-document file://my-policy.json
-
-
创建 IAM 角色并将其与 Kubernetes 服务账户关联。您可以使用
eksctl
或 Amazon CLI。 -
确认角色和服务账户配置正确。
-
确认 IAM 角色的信任策略配置正确。
aws iam get-role --role-name
my-role
--query Role.AssumeRolePolicyDocument示例输出如下。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::
111122223333
:oidc-provider/oidc.eks.region-code
.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE
" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code
.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE
:sub": "system:serviceaccount:default:my-service-account
", "oidc.eks.region-code
.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE
:aud": "sts.amazonaws.com" } } } ] } -
确认您在上一步中附加到角色的策略已附加到该角色。
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 v
1
示例输出如下。
{ "Version": "2012-10-17", "Statement": [
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" }
] }如果您在上一步中创建了示例策略,则您的输出与示例相同。如果您创建了其他策略,则与
示例
内容不同。 -
确认使用角色注释 Kubernetes 服务账户。
kubectl describe serviceaccount
my-service-account
-ndefault
示例输出如下。
Name:
my-service-account
Namespace:default
Annotations: eks.amazonaws.com.cn/role-arn: arn:aws:iam::111122223333
:role/my-role
Image pull secrets: <none> Mountable secrets:my-service-account
-token-qqjfl
Tokens:my-service-account
-token-qqjfl
[...]
-
-
(可选)配置服务账户的 Amazon Security Token Service 端点。Amazon 建议使用区域 Amazon STS 端点而不是全局端点。这可以减少延迟,提供内置冗余并提高会话令牌的有效性。