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

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

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

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

  • 需要 IAM 权限,由AWS管理的策略AmazonEKS_CNI_Policy,对进行调用AWS代表您使用 API。

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

注意

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

您可以使用eksctl或AWS Management Console创建您的 CNI 插件 IAM 角色。

eksctl
  1. 创建 IAM 角色并附加AmazonEKS_CNI_Policy托管 IAM 策略,并使用以下命令。Replace<cluster_name>(包括<>)与您自己的值。此命令将为您的集群创建一个 IAM OIDC 提供程序(如果该提供程序不存在)。然后,它将部署一个AWS CloudFormation堆栈中创建 IAM 角色,附加AmazonEKS_CNI_Policy AWS托管策略添加到它,并注释现有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 提供商

要创建您的 CNI 插件 IAM 角色,请使用AWS Management Console

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

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

  6. 选择 Next:。标签

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

  8. 适用于角色名称中,为您的角色输入一个名称,例如AmazonEKSCNIRole,然后选择创建角色

  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 集群结合使用,请参阅更新 Amazon VPC CNI 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

    输出:

从节点 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 (分离) 以完成操作。