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

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

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

Kubernetes 專用 Amazon VPC CNI 外掛程式是 Amazon EKS 叢集中供 Pod 聯網的聯網外掛程式。外掛程式負責將 VPC IP 位址分派給 Kubernetes Pod,以及設定每個 Pod 上 Pod 所需的聯網。

注意

Kubernetes 專用 Amazon VPC CNI 外掛程式也支援 Amazon EKS Pod 身分識別。如需詳細資訊,請參閱 指派 IAM 角色至 Kubernetes 服務帳戶

外掛程式:

  • 需要 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 角色。建議如本主題所述,將其指派給不同的角色。

  • 部署時,建立並設定為使用名為 aws-node 的 Kubernetes 服務帳戶。服務帳戶綁定到一個名為 aws-node 的 Kubernetes clusterrole,它被指派了所需的 Kubernetes 許可。

注意

除非您封鎖對 IMDS 的存取,否則 Kubernetes 專用 Amazon VPC CNI 外掛程式的 Pod 有權存取指派給 Amazon EKS 節點 IAM 角色的許可。如需詳細資訊,請參閱‬限制存取指派給工作節點的執行個體設定檔‭

步驟 1:建立 Kubernetes 專用 Amazon VPC CNI 外掛程式 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 政策連接至此角色。此命令會建立並部署 AWS CloudFormation 堆疊,該堆疊會建立 IAM 角色、連接指定給其的政策,以及使用所建立 IAM 角色的 ARN 來標註現有的 aws-node Kubernetes 服務帳戶。

      • IPv4

        用您的值取代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 與您的叢集一起使用,其必須滿足幾個要求。如需詳細資訊,請參閱 了解叢集、Pod 與服務的 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 和 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 取代為前一個步驟中傳回的輸出。使用叢集所在的 AWS 區域取代 region-code

      { "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

        111122223333 取代為您的帳戶 ID,以及將 AmazonEKS_CNI_IPv6_Policy 取代為您的 IPv6 策略名稱。如果沒有 IPv6 政策,請參閱 為使用 IPv6 系列的叢集建立 IAM 政策 來建立一個。若要將 IPv6 與您的叢集一起使用,其必須滿足幾個要求。如需詳細資訊,請參閱 了解叢集、Pod 與服務的 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 服務帳戶。以您自己的值取代範例值

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

步驟 2:重新部署 Kubernetes 專用 Amazon VPC CNI 外掛程式 Pod

  1. 刪除並重新建立任何與服務帳戶相關聯的現有 Pod,以套用憑證環境變數。註釋不適用於目前在沒有註釋的情況下執行的 Pod。下列命令會刪除現有的 aws-node DaemonSet Pod,並使用服務帳戶註釋來部署它們。

    kubectl delete Pods -n kube-system -l k8s-app=aws-node
  2. 確認 Pod 全部重新啟動。

    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. 描述其中一個 Pod 並確認 AWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARN 環境變數存在。使用前一個步驟輸出中傳回的其中一個 Pod 名稱取代 cpjw7

    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:從節點 IAM 角色移除 CNI 政策

如果您的 Amazon EKS 節點 IAM 角色目前附有 AmazonEKS_CNI_Policy IAM (IPv4) 政策或 IPv6 政策,而且您已建立個別 IAM 角色、將政策附加至該角色,然後將其指派給 aws-node Kubernetes 服務帳戶,我們建議您使用與叢集 IP 系列相符的 AWS 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 或更高版本的 Kubernetes 專用 Amazon VPC CNI 外掛程式附加元件,則需要建立可以指派給 IAM 角色的 IAM 政策。如果您現有的叢集在建立時未使用 IPv6 系列進行設定,則為了使用 IPv6,必須建立新的叢集。如需搭配使用 IPv6 與叢集的詳細資訊,請參閱 了解叢集、Pod 與服務的 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