配置 VPC CNI 插件以便为服务账户使用 IAM 角色 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 VPC CNI 插件以便为服务账户使用 IAM 角色

这些区域有:适用于 Kubernetes 的 Amazon VPC CNI 插件是在 Amazon EKS 集群中用于 Pod 联网的联网插件。CNI 插件负责向 Kubernetes 节点分配 VPC IP 地址并为每个节点上的 Pod 配置所需网络。插件:

  • 需要 AWS 托管策略提供的 IAM 权限AmazonEKS_CNI_Policy,以代表您调用 AWS API。

  • 创建并配置为使用名为aws-node当它被部署时。服务帐户绑定到库贝内特人clusterrole命名aws-node,它被分配了所需的 Kubernetes 权限。

注意

无论您是否将 VPC CNI 插件配置为对服务账户使用 IAM 角色,这些窗格都可以访问分配给亚马逊 EKS 节点 IAM 角色,除非您阻止对 IMDS 的访问。有关更多信息,请参阅 限制对 IMDS 和 Amazon EC2 实例配置文件证书的访问

您可以使用eksctl或 AWS 管理控制台来创建您的 CNI 插件 IAM 角色。

eksctl
  1. 创建 IAM 角色并附加AmazonEKS_CNI_Policy托管 IAM 策略,并使用以下命令。Replace <cluster_name> (包括 <>),并使用您自己的值。此命令将为您的集群创建一个 IAM OIDC 提供程序(如果该提供程序不存在)。然后,它会部署一个创建 IAM 角色的 AWS CloudFormation 堆栈,附加AmazonEKS_CNI_PolicyAWS 管理策略,并注释现有aws-node服务账户与 IAM 角色的 ARN 相结合。

    eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster <cluster_name> \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --approve \ --override-existing-serviceaccounts
  2. 描述 Pod 之一并确保 AWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARN 环境变量存在。

    kubectl exec -n kube-system aws-node-<9rgzw> env | grep AWS

    输出:

    AWS_VPC_K8S_CNI_LOGLEVEL=DEBUG AWS_ROLE_ARN=arn:aws:iam::<111122223333>:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-<V66K5I6JLDGK> AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS Management Console

Prerequisite

您的集群必须有一个适用于您的集群的现有 IAM OIDC 提供商。要确定是否已创建或创建一个,请参阅为您的集群创建 IAM OIDC 提供商

使用 AWS 管理控制台创建您的 CNI 插件 IAM 角色

  1. 在导航面板中,选择角色创建角色

  2. Select type of trusted entity (选择受信任实体的类型) 部分中,选择 Web identity (Web 身份)

  3. Choose a web identity provider (选择 Web 身份提供商) 部分中:

    1. 对于 Identity provider (身份提供商),选择您集群的 URL。

    2. 对于 Audience (受众),请选择 sts.amazonaws.com

  4. 选择后续:权限。

  5. 附加策略部分中,选择AmazonEKS_CNI_Policy策略,以便用于服务账户。

  6. 选择后续:标签

  7. Add tags (optional) (添加标签(可选)) 屏幕上,您可以为账户添加标签。选择后续:审核

  8. 适用于角色名称中,为您的角色输入一个名称,例如 亚马逊尼克斯尼角色,然后选择创建角色

  9. 创建角色后,在控制台中选择角色以将其打开进行编辑。

  10. 选择 Trust relationships 选项卡,然后选择 Edit trust relationship

  11. 查找类似于以下内容的行:

    "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    将该行更改为类似于以下行。Replace <EXAMPLED539D4633E53DE1B716D3041E> (包括 <>)替换为集群的 OIDC 提供商 ID,并将 <region-code> 使用您的集群所在的区域代码。

    "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B716D3041E>:sub": "system:serviceaccount:kube-system:aws-node"
  12. 选择 Update Trust Policy (更新可信策略) 以完成操作。

添加注释aws-node具有 IAM 角色的 Kubernetes 服务账户

  1. 如果您将亚马逊 EKS 附加组件与 1.18 或更高版本的亚马逊 EKS 集群结合使用,具有平台版本eks.3或更高版本,请参阅配置 Amazon EKS 附加组件,而不是完成此过程。如果您没有使用亚马逊 VPC CNI 亚马逊 EKS 加载项,请使用以下命令注释aws-node服务账户与您之前创建的 IAM 角色的 ARN 一起使用。务必将您自己的值替换为<example values>与您的豆荚一起使用。

    kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AmazonEKSCNIRole>
  2. 删除并重新创建任何与服务账户关联的现有 Pod,以应用凭据环境变量。变异 Webhook 不将其应用到已经在运行的 Pod。以下命令删除现有的 aws-node DaemonSet Pod 并使用服务账户注释部署这些 Pod。

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

    kubectl get pods -n kube-system -l k8s-app=aws-node
  4. 描述 Pod 之一并确保 AWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARN 环境变量存在。

    kubectl exec -n kube-system aws-node-<9rgzw> env | grep AWS

    输出:

    AWS_VPC_K8S_CNI_LOGLEVEL=DEBUG AWS_ROLE_ARN=arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME> AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token

从节点 IAM 角色中删除 CNI 策略

如果您的亚马逊 EKS 节点 IAM 角色当前具有AmazonEKS_CNI_PolicyIAM 策略附加到它,并且您已创建了一个单独的 IAM 角色,将该策略附加到该策略,然后将其分配给aws-nodeKubernetes 服务帐户,那么我们建议您从节点角色中删除策略。

  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在左侧导航窗格中,选择 Roles (角色),然后搜索您的节点实例角色。

  3. 选择Permissions (权限)选项卡,然后选择X的右侧AmazonEKS_CNI_Policy

  4. 选择 Detach (分离) 以完成操作。