将 IAM 角色与服务账户关联
在 Kubernetes 中,您通过添加以下注释到服务账户,定义 IAM 角色以与集群中的服务账户关联。
如果您已使用 eksctl
创建了 IAM 角色用于您的服务账户,则在您创建角色时就使用您指定的服务账户完成了该操作。
apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::
ACCOUNT_ID
:role/IAM_ROLE_NAME
先决条件
-
现有集群。如果还没有,可以使用 开始使用 Amazon EKS 指南之一创建一个。
-
集群的现有 IAM OIDC 提供商。有关更多信息,请参阅 为集群创建 IAM OIDC 提供商。
-
现有服务账户。如果您没有现有服务账户,请参阅 Kubernetes 文档中的为 Pod 配置服务账户
。 -
具有附加 IAM 策略的现有 IAM 角色。如果没有,请参阅为服务账户创建 IAM 角色和策略。
使用 IAM 角色为服务账户添加注释
-
使用以下命令可通过要用于服务账户的 IAM 角色的 ARN 注释您的服务账户。确保将
example values
替换为您自己的值。kubectl annotate serviceaccount -n
SERVICE_ACCOUNT_NAMESPACE
SERVICE_ACCOUNT_NAME
\ eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID
:role/IAM_ROLE_NAME
注意 如果您目前没有服务账户,则需要创建一个。有关更多信息,请参阅 Kubernetes 文档中的为 Pod 配置服务账户
。要使服务账户能够使用 Kubernetes 权限,则必须创建 Role
或ClusterRole
,然后将角色绑定到服务账户。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。当部署了 Amazon VPC CNI 插件,部署清单会创建服务账户、集群角色和集群角色绑定。您可以在 GitHub 上查看清单 以用作示例。 -
(可选)使用以下命令向服务账户添加附加注释,以使用 Amazon Security Token Service Amazon Web Services 区域端点,而不是全局端点。Amazon 建议使用 Amazon Web Services 区域 Amazon STS 端点而不是全局端点以减少延迟,建立冗余以及提高会话令牌有效性。Amazon Security Token Service 必须在运行容器的 Amazon Web Services 区域处于活动状态,并且您的应用程序应内置冗余功能,以便在该 Amazon Web Services 区域的服务出现故障时选择其他 Amazon Web Services 区域。有关更多信息,请参阅 IAM 用户指南中的在 Amazon Web Services 区域中管理 Amazon STS。
要使用此注释,您的集群和平台版本必须为以下 Kubernetes 和 Amazon EKS 平台版本或更高版本。
Kubernetes 版本 平台版本 1.21 eks.3
1.20 eks.3
1.19 eks.7
1.18 eks.9
kubectl annotate serviceaccount -n
SERVICE_ACCOUNT_NAMESPACE
SERVICE_ACCOUNT_NAME
\eks.amazonaws.com/sts-regional-endpoints=true
-
删除并重新创建任何与服务账户关联的现有 Pod,以应用凭据环境变量。变异 Webhook 不将其应用到已经在运行的 Pod。例如,如果您在上一步中将注释添加到用于 Amazon VPC CNI DaemonSet 的服务账户中,则以下命令将删除现有
aws-node
DaemonSet Pod 并使用服务账户注释部署。您可以将pods
、kube-system
和-l k8s-app=aws-node
替换为设置注释的 Pod(一组容器)信息。kubectl delete
pods
-nkube-system
-l
k8s-app=aws-node
-
确认 Pod 已全部重新启动。
kubectl get
pods
-nkube-system
-l k8s-app=aws-node
-
查看一个 Pod(一组容器)的环境变量并确保存在
AWS_WEB_IDENTITY_TOKEN_FILE
和AWS_ROLE_ARN
环境变量。以下示例命令返回由 Amazon VPC CNI DaemonSet 创建的其中一个 Pod(一组容器)的变量。已在上一步中使用的示例输出中返回名为aws-node-5v6ws
的Pod(一组容器)。kubectl exec -n
kube-system
aws-node-5v6ws
-- env| grep AWS
输出:
... AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token ... AWS_ROLE_ARN=arn:aws:iam::
ACCOUNT_ID
:role/IAM_ROLE_NAME
...如果将注释添加到服务账户,以使用 Amazon Security Token Service Amazon Web Services 区域端点而不是全局端点,请验证之前的输出是否还返回以下行。
AWS_STS_REGIONAL_ENDPOINTS=regional