

 **協助改進此頁面** 

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

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

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

# 更新 Amazon VPC CNI (Amazon EKS 附件元件)
<a name="vpc-add-on-update"></a>

更新適用於 Kubernetes 的 Amazon VPC CNI 外掛程式附加元件的 Amazon EKS 類型。如果您尚未將 Amazon EKS 類型的附加元件新增至叢集，您可遵循 [建立 Amazon VPC CNI (Amazon EKS 附加元件)](vpc-add-on-create.md) 來安裝。或遵循 [更新 Amazon VPC CNI (自我管理的附件元件)](vpc-add-on-self-managed-update.md) 來更新其他類型的 VPC CNI 安裝。

1. 查看叢集上目前安裝了哪些附加元件版本。使用您的叢集名稱取代 {{my-cluster}}。

   ```
   aws eks describe-addon --cluster-name my-cluster --addon-name vpc-cni --query "addon.addonVersion" --output text
   ```

   範例輸出如下。

   ```
   v1.20.0-eksbuild.1
   ```

   參照 [Amazon VPC CNI 版本](managing-vpc-cni.md#vpc-cni-latest-available-version) 中的最新版本資料表來比較版本。如果傳回的版本與最新版本資料表中的叢集 Kubernetes 版本相同，則表明您已經在叢集上安裝最新版本，不需要完成此程序的剩餘步驟。若您收到錯誤而非版本編號，則表明叢集上沒有安裝 Amazon EKS 類型的附加元件。您必須先建立附加元件，才能使用此程序進行更新。如需建立 VPC CNI 附加元件的 Amazon EKS 類型，您可遵循 [建立 Amazon VPC CNI (Amazon EKS 附加元件)](vpc-add-on-create.md)。

1. 儲存您目前安裝的附加元件。

   ```
   kubectl get daemonset aws-node -n kube-system -o yaml > aws-k8s-cni-old.yaml
   ```

1. 使用 CLI AWS 更新您的附加元件。如果您想要使用 AWS 管理主控台 或 `eksctl` 來更新附加元件，請參閱 [更新 Amazon EKS 附加元件](updating-an-add-on.md)。將隨後的命令複製到您的裝置。視需要對命令進行下列修改，然後執行修改後的命令。
   + 使用您叢集的名稱取代 {{my-cluster}}。
   + 使用叢集版本的最新版本資料表中列出的最新版本來取代 {{v1.20.0-eksbuild.1}}。
   + 使用帳戶 ID 取代 {{111122223333}}，並且使用所建立現有 IAM 角色的名稱取代 {{AmazonEKSVPCCNIRole}}。如需針對 VPC CNI 建立 IAM 角色，請參閱 [步驟 1：建立 Kubernetes 專用 Amazon VPC CNI 外掛程式 IAM 角色](cni-iam-role.md#cni-iam-role-create-role)。若要指定角色，您的叢集需要具有 IAM OpenID Connect (OIDC) 提供者。若要判定您的叢集是否已經擁有一個提供者，或是要建立一個提供者，請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
   + `--resolve-conflicts PRESERVE` 選項會保留附加元件的現有組態值。如果對於附加元件設定，您已設定自訂值，但未使用此選項，Amazon EKS 會以其預設值覆寫您的值。如果您使用此選項，建議您在更新生產叢集上的附加元件之前，測試非生產叢集上的任何欄位和值變更。如果您將此值變更為 `OVERWRITE`，則所有設定都會變更為 Amazon EKS 預設值。如果您已設定任何設定的自訂值，則可能會使用 Amazon EKS 預設值覆寫這些值。如果您將此值變更為 `none`，Amazon EKS 不會變更任何設定的值，但更新可能會失敗。若更新失敗，您會收到錯誤訊息，以協助您解決衝突。
   + 如果您不更新組態設定，請從命令中移除 `--configuration-values '{{{"env":{"AWS_VPC_K8S_CNI_EXTERNALSNAT":"true"}}}}'`。如果您要更新組態設定，請將 {{"env":{"AWS\_VPC\_K8S\_CNI\_EXTERNALSNAT":"true"}}} 取代為您要設定的設定值。在此範例中，`AWS_VPC_K8S_CNI_EXTERNALSNAT` 環境變數設定為 `true`。您指定的值必須對組態結構描述有效。若您不知道組態結構描述，請執行 `aws eks describe-addon-configuration --addon-name vpc-cni --addon-version {{v1.20.0-eksbuild.1}} `，其中請用要查看組態的附加元件版本編號取代 {{v1.20.0-eksbuild.1}}。結構描述會在輸出中傳回。如果您有任何現有的自訂組態，並且想要全部移除，同時將所有設定的值設定回 Amazon EKS 預設值，請從命令中移除 {{"env":{"AWS\_VPC\_K8S\_CNI\_EXTERNALSNAT":"true"}}}，這樣就會得到空白的 `{}`。如需每個設定的說明，請參閱 GitHub 上的 [CNI 組態變數](https://github.com/aws/amazon-vpc-cni-k8s#cni-configuration-variables)。

     ```
     aws eks update-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.20.3-eksbuild.1 \
         --service-account-role-arn arn:aws: iam::111122223333:role/AmazonEKSVPCCNIRole \
         --resolve-conflicts PRESERVE --configuration-values '{"env":{"AWS_VPC_K8S_CNI_EXTERNALSNAT":"true"}}'
     ```

     更新動作可能需要幾秒鐘的時間才能完成。

1. 確認附加元件版本已更新。使用您叢集的名稱取代 {{my-cluster}}。

   ```
   aws eks describe-addon --cluster-name my-cluster --addon-name vpc-cni
   ```

   更新動作可能需要幾秒鐘的時間才能完成。

   範例輸出如下。

   ```
   {
       "addon": {
           "addonName": "vpc-cni",
           "clusterName": "my-cluster",
           "status": "ACTIVE",
           "addonVersion": "v1.20.3-eksbuild.1",
           "health": {
               "issues": []
           },
           "addonArn": "arn:aws: eks:region:111122223333:addon/my-cluster/vpc-cni/74c33d2f-b4dc-8718-56e7-9fdfa65d14a9",
           "createdAt": "2023-04-12T18:25:19.319000+00:00",
           "modifiedAt": "2023-04-12T18:40:28.683000+00:00",
           "serviceAccountRoleArn": "arn:aws: iam::111122223333:role/AmazonEKSVPCCNIRole",
           "tags": {},
           "configurationValues": "{\"env\":{\"AWS_VPC_K8S_CNI_EXTERNALSNAT\":\"true\"}}"
       }
   }
   ```

## 疑難排解
<a name="_troubleshooting"></a>

從早於 v1.13.2 的版本升級 VPC CNI 時，您必須在更新後取代叢集中的所有節點。v1.13.2 之前的版本使用 iptables-legacy 後端來插入適當功能所需的 iptables 規則，例如來源 NAT (SNAT)。

1.13.2 版是[引進 iptables-wrapper](https://github.com/aws/amazon-vpc-cni-k8s/pull/2402) 的重要版本，可自動偵測適當的 iptables 後端 (iptables-legacy 或 iptables-nft) 以插入鏈結和規則。由於效能限制，此變更符合上游 Kubernetes 決定移離舊版後端。

從 VPC CNI 1.13.2 版之前的版本升級之後需要替換節點，因為將規則引入 iptables-legacy 和 iptables-nft 後端可能會導致來自非主要 ENIs的流量發生意外行為。