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

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

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

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

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

  • 创建并配置为在部署时使用名为 aws-node 的服务账户。服务账户绑定到名为 clusterrole 的 Kubernetes aws-node,该账户分配了所需的 Kubernetes 权限。

注意

无论您是否将 VPC CNI 插件配置为使用服务账户的 IAM 角色,Pod 也有权访问分配给 Amazon EKS 节点 IAM 角色 的权限,除非您阻止访问 IMDS。有关更多信息,请参阅 限制对 IMDS 和 Amazon EC2 实例配置文件凭证的访问.

[eksctl]

  1. 使用以下命令创建 IAM 角色并附加 AmazonEKS_CNI_Policy 托管的 IAM 策略。将 <cluster_name> 替换为您自己的值。此命令为集群创建一个 IAM OIDC 提供商(如果尚不存在)。然后,它部署一个 AWS CloudFormation 堆栈,该堆栈创建一个 IAM 角色,将 AmazonEKS_CNI_Policy AWS 托管策略附加到该角色,并使用 aws-node 角色的 ARN 注释现有 IAM 服务账户。

    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 管理控制台]

Prerequisite

您的集群必须具有现有 IAM OIDC 提供商。要确定您是否已执行此操作或已经创建一个,请参阅为集群创建 IAM OIDC 提供商

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

  1. 在导航窗格中,依次选择 Roles (角色)Create Role (创建角色)

  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. 选择 Next: Permissions (下一步:权限)

  5. Attach Policy (附加策略) 部分中,选择 用于您的服务账户的 AmazonEKS_CNI_Policy 策略。

  6. 选择下一步: 标签

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

  8. 对于 Role Name (角色名称),为您的角色输入名称,例如 AmazonEKSCNIRole、 然后选择 Create Role (创建角色)

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

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

  11. 更改看上去类似于以下内容的行:

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

    要看上去如下所示,请将 <example values>(包括 <>)更改为您自己的内容:

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

使用 aws-node 角色注释 IAM Kubernetes 服务账户

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

    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 策略

如果您的 Amazon EKS 节点 IAM 角色当前附加了 AmazonEKS_CNI_Policy IAM 策略,并且您创建了单独的 IAM 角色,将策略附加到该角色,并将其分配给 aws-node Kubernetes 服务账户,则建议您从节点角色中删除策略。

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/.

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

  3. 为节点实例角色选择 Permissions (权限) 选项卡,然后选择 右侧的 XAmazonEKS_CNI_Policy

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