配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户(IRSA) - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户(IRSA)

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

  • 需要 Amazon Identity and Access Management(IAM)权限。 权限在 AmazonEKS_CNI_Policy Amazon 托管策略中指定。您可以将该策略附加到 Amazon EKS 节点 IAM 角色或单独 IAM 角色。我们建议您按照本主题中的详细说明,将其分配给一个单独的角色。

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

注意

Amazon VPC CNI plugin for Kubernetes 的 Pods 有权访问分配给 Amazon EKS 节点 IAM 角色的权限,除非您阻止对 IMDS 的访问。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问

先决条件
  • 现有 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS

  • 集群的现有 Amazon Identity and Access Management IAM OpenID Connect (OIDC) 提供商。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商

步骤 1:创建 Amazon VPC CNI plugin for Kubernetes IAM 角色

创建 IAM 角色
  1. 创建 IAM 角色。您可以使用 eksctlkubectl 和 Amazon CLI 以创建 IAM 角色。

    eksctl

    使用与您的集群的 IP 系列匹配的命令创建 IAM 角色并将 IAM 策略附加到该角色。此命令创建并部署一个创建 IAM 角色的 Amazon CloudFormation 堆栈,向其附加您指定的策略,并使用所创建 IAM 角色的 ARN 对现有 aws-node Kubernetes 服务账户添加注释。

    • my-cluster 替换为您自己的值。

      eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --override-existing-serviceaccounts \ --approve
    • IPv6

      my-cluster 替换为您自己的值。将 111122223333 替换为您的账户 ID,并将 AmazonEKS_CNI_IPv6_Policy 替换为您的 IPv6 策略名称。如果没有 IPv6 策略,请参阅 为使用 IPv6 系列的集群创建 IAM 策略 创建一个。要将 IPv6 用于您的集群,它必须满足多项要求。有关更多信息,请参阅 集群、Pods 和 services 的 IPv6 地址

      eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --override-existing-serviceaccounts \ --approve
    kubectl and the Amazon CLI
    1. 查看集群的 OIDC 提供商 URL。

      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text

      示例输出如下。

      https://oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE

      如果没有返回输出,则您必须为集群创建 IAM OIDC 提供程序

    2. 将以下内容复制到名为 vpc-cni-trust-policy.json 的文件中。将 111122223333 替换为您的账户 ID,并将 EXAMPLED539D4633E53DE1B71EXAMPLE 替换为上一步骤中返回的输出。region-code 替换为集群所在的 Amazon Web Services 区域。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node" } } } ] }
    3. 创建角色。您可以将 AmazonEKSVPCCNIRole 替换为您选择的任何名称。

      aws iam create-role \ --role-name AmazonEKSVPCCNIRole \ --assume-role-policy-document file://"vpc-cni-trust-policy.json"
    4. 将所需的 IAM 策略附加到角色。

      • IPv4

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name AmazonEKSVPCCNIRole
      • IPv6

        111122223333 替换为您的账户 ID,并将 AmazonEKS_CNI_IPv6_Policy 替换为您的 IPv6 策略名称。如果没有 IPv6 策略,请参阅 为使用 IPv6 系列的集群创建 IAM 策略 创建一个。要将 IPv6 用于您的集群,它必须满足多项要求。有关更多信息,请参阅 集群、Pods 和 services 的 IPv6 地址

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name AmazonEKSVPCCNIRole
    5. 运行以下命令以使用您以前创建的 IAM 角色的 ARN 对 aws-node 服务账户添加注释。将 example values 替换为您自己的值。

      kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
  2. (可选)配置您的 Kubernetes 服务账户使用的 Amazon Security Token Service 端点类型。有关更多信息,请参阅 配置服务账户的 Amazon Security Token Service 端点

步骤 2:重新部署 Amazon VPC CNI plugin for KubernetesPods

  1. 删除并重新创建任何与服务账户关联的现有 Pods,以应用凭证环境变量。注释未应用于目前在没有注释的情况下运行的 Pods。以下命令删除现有的 aws-node DaemonSet Pods 并使用服务账户注释部署它们。

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

    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. 描述 Pods 之一并确保 AWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARN 环境变量存在。将 cpjw7 替换为上一步输出中返回的其中一个 Pods 的名称。

    kubectl describe pod -n kube-system aws-node-cpjw7 | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'

    示例输出如下。

    AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
          AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
          AWS_ROLE_ARN:                           arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
          AWS_WEB_IDENTITY_TOKEN_FILE:            /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    由于 Pod 包含两个容器,因此会返回两组重复的结果。两个容器具有相同的值。

    如果您的 Pod 正在使用Amazon Web Services 区域端点,之前的输出中也将返回以下行。

    AWS_STS_REGIONAL_ENDPOINTS=regional

步骤 3:从节点 IAM 角色中删除 CNI 策略

如果您的 Amazon EKS 节点 IAM 角色当前附加有 AmazonEKS_CNI_Policy IAMpolicy,而且您已另行创建了一个 IAM 角色,并已将该策略附加到该 IAM 角色并将其分配给了 aws-node Kubernetes 服务账户,那么我们建议您使用与您的集群的 IP 系列匹配的 Amazon CLI 命令从节点角色中删除该策略。将 AmazonEKSNodeRole 替换为您的节点角色的名称。

  • IPv4

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  • IPv6

    111122223333 替换为您的账户 ID,并将 AmazonEKS_CNI_IPv6_Policy 替换为您的 IPv6 策略名称。

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy

为使用 IPv6 系列的集群创建 IAM 策略

如果您创建了使用 IPv6 系列的集群,并且集群配置了 1.10.1 版或更高版本的 Amazon VPC CNI plugin for Kubernetes 附加组件,则需要创建一个 IAM 策略,您可以将其分配给 IAM 角色。如果您现有的集群在创建时没有使用 IPv6 系列进行配置,则必须创建一个新集群才能使用 IPv6。有关集群使用 IPv6 的详细信息,请参阅 集群、Pods 和 services 的 IPv6 地址

  1. 复制以下文本并将其保存到名为 vpc-cni-ipv6-policy.json 的文件。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] }
  2. 创建 IAM 策略。

    aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json