

 **協助改進此頁面** 

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

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

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

# 設定 Amazon VPC CNI 外掛程式以使用 IRSA
<a name="cni-iam-role"></a>

[Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)是 Amazon EKS 叢集中供 Pod 聯網的聯網外掛程式。外掛程式負責將 VPC IP 位址分派給 Kubernetes Pod，以及設定每個 Pod 上 Pod 所需的聯網。

**注意**  
Kubernetes 專用 Amazon VPC CNI 外掛程式也支援 Amazon EKS Pod 身分識別。如需詳細資訊，請參閱[指派 IAM 角色至 Kubernetes 服務帳戶](pod-id-association.md)。

外掛程式：
+ 需要 AWS Identity and Access Management (IAM) 許可。如果您的叢集使用 `IPv4` 系列，則會在 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html) AWS 受管政策中指定許可。如果您的叢集使用 `IPv6` 系列，則必須將許可新增至您建立的 IAM 政策；如需說明，請參閱 [為使用 `IPv6` 系列的叢集建立 IAM 政策](#cni-iam-role-create-ipv6-policy)。您可附加政策至 Amazon EKS 節點 IAM 角色，或附加至單獨 IAM 角色。有關將政策附加到 Amazon EKS 節點 IAM 角色的說明，請參閱 [Amazon EKS 節點 IAM 角色](create-node-role.md)。建議如本主題所述，將其指派給不同的角色。
+ 部署時，建立並設定為使用名為 `aws-node` 的 Kubernetes 服務帳戶。服務帳戶綁定到一個名為 `aws-node` 的 Kubernetes `clusterrole`，它被指派了所需的 Kubernetes 許可。

**注意**  
除非您封鎖對 IMDS 的存取，否則 Kubernetes 專用 Amazon VPC CNI 外掛程式的 Pod 有權存取指派給 [Amazon EKS 節點 IAM 角色](create-node-role.md)的許可。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。
+ 需要現有的 Amazon EKS 叢集。若要部署叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。
+ 需要您叢集的現有 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) 供應商。若要判定您是否已經擁有一個，或是要建立一個，請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。

## 步驟 1：建立 Kubernetes 專用 Amazon VPC CNI 外掛程式 IAM 角色
<a name="cni-iam-role-create-role"></a>

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

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

   範例輸出如下。

   ```
   "ipFamily": "ipv4"
   ```

   輸出可能會傳回 `ipv6`。

1. 建立 IAM 角色。您可以使用 `eksctl`或 `kubectl`和 AWS CLI 來建立 IAM 角色。  
eksctl  
   + 建立 IAM 角色，並使用與您叢集 IP 系列相符的命令將 IAM 政策連接至此角色。命令會建立和部署建立 IAM 角色的 AWS CloudFormation 堆疊、連接您指定的政策，並使用所建立 `aws-node` IAM 角色的 ARN 來註釋現有的 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\$1CNI\$1IPv6\$1Policy* 取代為您的 `IPv6` 策略名稱。如果沒有 `IPv6` 政策，請參閱 [為使用 `IPv6` 系列的叢集建立 IAM 政策](#cni-iam-role-create-ipv6-policy) 來建立一個。若要將 `IPv6` 與您的叢集一起使用，其必須滿足幾個要求。如需詳細資訊，請參閱[了解叢集、Pod 與服務的 IPv6 位址](cni-ipv6.md)。

       ```
       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 提供商](enable-iam-roles-for-service-accounts.md)。

   1. 將下列內容複製到名為 *vpc-cni-trust-policy.json* 的檔案。將 *111122223333* 取代為您的帳戶 ID，以及將 *EXAMPLED539D4633E53DE1B71EXAMPLE* 取代為前一個步驟中傳回的輸出。將 *region-code* 取代為您的叢集所在的 AWS 區域。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node"
                      }
                  }
              }
          ]
      }
      ```

   1. 建立角色。您可以將 *AmazonEKSVPCCNIRole* 取代為選擇的任何名稱。

      ```
      aws iam create-role \
        --role-name AmazonEKSVPCCNIRole \
        --assume-role-policy-document file://"vpc-cni-trust-policy.json"
      ```

   1. 將所需的 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\$1CNI\$1IPv6\$1Policy* 取代為您的 `IPv6` 策略名稱。如果沒有 `IPv6` 政策，請參閱 [為使用 `IPv6` 系列的叢集建立 IAM 政策](#cni-iam-role-create-ipv6-policy) 來建立一個。若要將 `IPv6` 與您的叢集一起使用，其必須滿足幾個要求。如需詳細資訊，請參閱[了解叢集、Pod 與服務的 IPv6 位址](cni-ipv6.md)。

        ```
        aws iam attach-role-policy \
          --policy-arn arn:aws: iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \
          --role-name AmazonEKSVPCCNIRole
        ```

   1. 執行下列命令以使用您之前建立之 IAM 角色的 ARN 來標註 `aws-node` 服務帳戶。以您自己的值取代範例值。

      ```
      kubectl annotate serviceaccount \
          -n kube-system aws-node \
          eks.amazonaws.com/role-arn=arn:aws: iam::111122223333:role/AmazonEKSVPCCNIRole
      ```

1. （選用） 設定 Kubernetes 服務帳戶所使用的 AWS Security Token Service 端點類型。如需詳細資訊，請參閱[為服務帳戶設定 AWS Security Token Service 端點](configure-sts-endpoint.md)。

## 步驟 2：重新部署 Kubernetes 專用 Amazon VPC CNI 外掛程式 Pod
<a name="cni-iam-role-redeploy-pods"></a>

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

   ```
   kubectl delete Pods -n kube-system -l k8s-app=aws-node
   ```

1. 確認 Pod 全部重新啟動。

   ```
   kubectl get pods -n kube-system -l k8s-app=aws-node
   ```

1. 描述其中一個 Pod 並確認 `AWS_WEB_IDENTITY_TOKEN_FILE` 和 `AWS_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 政策
<a name="remove-cni-policy-node-iam-role"></a>

如果您的 [Amazon EKS 節點 IAM 角色](create-node-role.md)目前已連接 `AmazonEKS_CNI_Policy` IAM (`IPv4`) 政策或 [IPv6 政策](#cni-iam-role-create-ipv6-policy)，且您已建立個別的 IAM 角色、改為連接政策，並將其指派給 Kubernetes `aws-node` 服務帳戶，則建議您使用符合叢集 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\$1CNI\$1IPv6\$1Policy* 取代為您的 `IPv6` 策略名稱。

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

## 為使用 `IPv6` 系列的叢集建立 IAM 政策
<a name="cni-iam-role-create-ipv6-policy"></a>

如果您建立了使用 `IPv6` 系列的叢集，並且該叢集設定了版本 `1.10.1` 或更高版本的 Kubernetes 專用 Amazon VPC CNI 外掛程式附加元件，則需要建立可以指派給 IAM 角色的 IAM 政策。如果您現有的叢集在建立時未使用 `IPv6` 系列進行設定，則為了使用 `IPv6`，必須建立新的叢集。如需搭配使用 `IPv6` 與叢集的詳細資訊，請參閱 [了解叢集、Pod 與服務的 IPv6 位址](cni-ipv6.md)。

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/*"
               ]
           }
       ]
   }
   ```

1. 建立 IAM 政策。

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