将 IAM 角色与服务账户关联 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

将 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

先决条件

使用 IAM 角色为服务账户添加注释

  1. 使用以下命令可通过要用于服务账户的 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 权限,则必须创建 RoleClusterRole,然后将角色绑定到服务账户。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权。当部署了 Amazon VPC CNI 插件,部署清单会创建服务账户、集群角色和集群角色绑定。您可以在 GitHub 上查看清单以用作示例。

  2. (可选)使用以下命令向服务账户添加附加注释,以使用 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
  3. 删除并重新创建任何与服务账户关联的现有 Pod,以应用凭据环境变量。变异 Webhook 不将其应用到已经在运行的 Pod。例如,如果您在上一步中将注释添加到用于 Amazon VPC CNI DaemonSet 的服务账户中,则以下命令将删除现有 aws-node DaemonSet Pod 并使用服务账户注释部署。您可以将 podskube-system-l k8s-app=aws-node 替换为设置注释的 Pod(一组容器)信息。

    kubectl delete pods -n kube-system -l k8s-app=aws-node
  4. 确认 Pod 已全部重新启动。

    kubectl get pods -n kube-system -l k8s-app=aws-node
  5. 查看一个 Pod(一组容器)的环境变量并确保存在 AWS_WEB_IDENTITY_TOKEN_FILEAWS_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