

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 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 类型的附加组件。您需要先创建附加组件，然后才能使用此过程对其进行更新。要创建 Amazon EKS 类型的 VPC CNI 附加组件，可按照[创建 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. 使用 AWS CLI 更新您的附加组件。如果您想要使用 AWS 管理控制台 或 `eksctl` 更新附加组件，则请参阅 [更新 Amazon EKS 附加组件](updating-an-add-on.md)。将以下命令复制到您的设备。根据需要对该命令进行以下修改，然后运行修改后的命令。
   + 将 *my-cluster* 替换为您的集群的名称。
   + 将 *v1.20.0-eksbuild.1* 替换为适合您的集群版本的最新版本表中列出的最新版本。
   + 将 *111122223333* 替换为您的账户 ID，并将 *AmazonEKSVPCCNIRole* 替换为您创建的现有 IAM 角色的名称。要为 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":\$1"AWS\$1VPC\$1K8S\$1CNI\$1EXTERNALSNAT":"true"\$1* 替换为您想要设置的设置。在此示例中，`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":\$1"AWS\$1VPC\$1K8S\$1CNI\$1EXTERNALSNAT":"true"\$1*，这样就可以有空的 `{}`。有关每项设置的说明，请参阅 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）。

v1.13.2 版本是一个重要版本，它[引入了 iptables-wrapper](https://github.com/aws/amazon-vpc-cni-k8s/pull/2402)，该功能能够自动检测出适合的 iptables 后端（iptables-legacy 或 iptables-nft），以便插入链和规则。这一变更与上游 Kubernetes 的决策相一致，即由于性能限制，决定放弃遗留的后端。

从早于 v1.13.2 版本的 VPC CNI 版本升级后需要更换节点，因为在 iptables-legacy 和 iptables-nft 后端中引入规则可能会导致来自非主要 ENI 的流量出现意外行为。