設定 Amazon VPC CNI 外掛程式以使用 IRSA - Amazon EKS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定 Amazon VPC CNI 外掛程式以使用 IRSA

適用於 Kubernetes 的 Amazon VPC CNI是適用於 的網路外掛程式 Pod Amazon EKS 叢集中的網路。外掛程式負責將 VPC IP 地址指派給 Kubernetes 節點並設定必要的聯網 Pods 在每個節點上。外掛程式:

  • 需要 AWS Identity and Access Management (IAM) 許可。如果您的叢集使用 IPv4 系列,許可會在 ` AmazonEKS_CNI_Policy` AWS 受管政策中指定。如果您的叢集使用 IPv6 系列,則必須將許可新增至您建立的 IAM 政策;如需指示,請參閱 為使用 IPv6 系列之叢集建立 IAM 政策。您可以將政策連接至 Amazon EKS 節點 IAM 角色,或連接至單獨的 IAM 角色。如需將政策連接至 Amazon EKS 節點 IAM 角色的指示,請參閱 Amazon EKS 節點 IAM 角色。建議如本主題所述,將其指派給不同的角色。

  • 建立 並設定為使用 Kubernetes 部署aws-node時名為 的服務帳戶。服務帳戶繫結至 Kubernetes clusterrole 名為 aws-node,其獲指派必要的 Kubernetes 許可。

注意

所以此 Pods 適用於 Amazon VPC CNI plugin for Kubernetes 具有指派給 Amazon EKS 節點 IAM 角色的許可,除非您封鎖對 IMDS 的存取。如需詳細資訊,請參閱‬限制存取指派給工作節點的執行個體設定檔‭

  • 現有的 Amazon EKS 叢集。若要部署叢集,請參閱 Amazon EKS 入門

  • 現有的 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) 叢集的供應商。若要判定您是否已經擁有一個,或是要建立一個,請參閱 建立 IAM OIDC 叢集的 提供者

步驟 1:建立 Amazon VPC CNI plugin for Kubernetes IAM 角色

  1. 確定您叢集的 IP 系列。

    aws eks describe-cluster --name my-cluster | grep ipFamily

    範例輸出如下。

    "ipFamily": "ipv4"

    輸出可能會傳回 ipv6

  2. 建立 IAM 角色。您可以使用 eksctlkubectl和 AWS CLI 來建立 IAM 角色。

    eksctl
    • 建立 IAM 角色,並使用符合叢集 IP 系列的命令,將 IAM 政策連接至該角色。命令會建立和部署建立 IAM 角色的 AWS CloudFormation 堆疊、連接您為其指定的政策,並註釋現有的 aws-node Kubernetes 具有所建立 ARN 角色的 IAM 的服務帳戶。

      • IPv4

        Replace (取代) 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

        Replace (取代) my-cluster 使用您自己的值。Replace (取代) 111122223333 使用您的帳戶 ID 並取代 AmazonEKS_CNI_IPv6_Policy 您的IPv6政策名稱。如果您沒有IPv6政策,請參閱 為使用 IPv6 系列之叢集建立 IAM 政策 以建立政策。若要將 IPv6 與您的叢集一起使用,其必須滿足幾個要求。如需詳細資訊,請參閱了解叢集的 IPv6 地址、pods、 和服務

        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 和 the AWS 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/id/EXAMPLED539D4633E53DE1B71EXAMPLE

      如果未傳回輸出,則必須為叢集建立 IAM OIDC提供者

    2. 將下列內容複製到名為 的檔案 vpc-cni-trust-policy.json。 取代 111122223333 使用您的帳戶 ID 和 EXAMPLED539D4633E53DE1B71EXAMPLE 在上一個步驟中傳回的輸出。Replace (取代) region-code 叢集所在的 AWS 區域。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws: iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/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 政策連接至角色。執行與叢集的 IP 系列相符的命令。

      • IPv4

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

        Replace (取代) 111122223333 使用您的帳戶 ID 和 AmazonEKS_CNI_IPv6_Policy 您的IPv6政策名稱。如果您沒有IPv6政策,請參閱 為使用 IPv6 系列之叢集建立 IAM 政策 以建立政策。若要將 IPv6 與您的叢集一起使用,其必須滿足幾個要求。如需詳細資訊,請參閱了解叢集的 IPv6 地址、pods、 和服務

        aws iam attach-role-policy \ --policy-arn arn:aws: iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name AmazonEKSVPCCNIRole
    5. 執行下列命令,使用您先前建立的 ARN 角色的 IAM 註釋aws-node服務帳戶。取代 example values 使用您自己的值。

      kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws: iam::111122223333:role/AmazonEKSVPCCNIRole
  3. (選用) 設定 所使用的 AWS Security Token Service 端點類型 Kubernetes 服務帳戶。如需詳細資訊,請參閱設定服務帳戶 AWS 的安全權杖服務端點

步驟 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 環境變數是否存在。Replace (取代) 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 使用 AWS 區域端點,則上一個輸出也會傳回以下行。

    AWS_STS_REGIONAL_ENDPOINTS=regional

步驟 3:從節點 CNI 角色移除 IAM 政策

如果您的 Amazon EKS 節點 IAM 角色目前具有 IAM AmazonEKS_CNI_Policy (IPv4) 政策或連接至該政策的 IPv6 政策,且您已建立單獨的 IAM 角色、改為將政策連接至該角色,並將其指派給 aws-node Kubernetes 服務帳戶,建議您使用符合叢集 IP 系列的 AWS CLI 命令,從節點角色中移除政策。Replace (取代) AmazonEKSNodeRole 節點角色的名稱。

  • IPv4

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

    Replace (取代) 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 與叢集的詳細資訊,請參閱 了解叢集的 IPv6 地址、pods、 和服務

  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