使用 Amazon VPC CNI plugin for Kubernetes Amazon EKS 附加组件 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon VPC CNI plugin for Kubernetes Amazon EKS 附加组件

Amazon VPC CNI plugin for Kubernetes 附加组件部署在 Amazon EKS 集群中的每个 Amazon EC2 节点上。附加组件会创建弹性网络接口并将其附加到 Amazon EC2 节点。附加组件还会将 VPC 中的私有 IPv4 地址分配给每个 Pod 和服务。

附加组件版本随集群中的每个 Fargate 节点一起部署,但您无需在 Fargate 节点上对其进行更新。其他兼容的 CNI 插件也可用于 Amazon EKS 集群,但这是 Amazon EKS 唯一支持的 CNI 插件。

下表列出了每个 Kubernetes 版本的 Amazon EKS 附加组件类型的最新可用版本。

Kubernetes 版本 1.29 1.28 1.27 1.26 1.25 1.24 1.23
Amazon EKS 类型的 VPC CNI 版本 v1.16.2-eksbuild.1 v1.16.2-eksbuild.1 v1.16.2-eksbuild.1 v1.16.2-eksbuild.1 v1.16.2-eksbuild.1 v1.16.2-eksbuild.1 v1.16.2-eksbuild.1
重要

如果您自行管理此附加组件,则表中的版本可能与可用的自行管理版本不同。有关更新此附加组件的自行管理类型的更多信息,请参阅更新自我管理的附加组件

先决条件
  • 现有 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS

  • 集群的现有 Amazon Identity and Access Management IAM OpenID Connect (OIDC) 提供商。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商

  • 附加有 AmazonEKS_CNI_Policy IAM policy的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户

  • 如果使用是版本 1.7.0 或更高版本的 Amazon VPC CNI plugin for Kubernetes,并且使用自定义 Pod 安全策略,请参阅 删除默认的 Amazon EKS Pod 安全策略容器组(pod)安全策略

  • 重要

    Amazon VPC CNI plugin for Kubernetes 版本 v1.16.0v1.16.1 已删除与 Kubernetes 版本 1.23 以及更早版本的兼容性。VPC CNI 版本 v1.16.2 还原与 Kubernetes 版本 1.23 以及更早版本和 CNI 规范 v0.4.0 的兼容性。

    Amazon VPC CNI plugin for Kubernetes 版本 v1.16.0v1.16.1 实现 CNI 规范版本 v1.0.0。运行 Kubernetes 版本 v1.24 或更高版本的 EKS 集群上支持 CNI 规范 v1.0.0。Kubernetes 版本 v1.23 或更早版本上不支持 VPC CNI 版本 v1.16.0v1.16.1,也不支持 CNI 规范 v1.0.0有关 CNI 规范的更多信息v1.0.0,请参阅容器网络接口 (CNI) 规范

注意事项
  • 版本指定为 major-version.minor-version.patch-version-eksbuild.build-number

  • 检查每个功能的版本兼容性

    每个版本的某些功能都Amazon VPC CNI plugin for Kubernetes需要特定的Kubernetes版本。使用不同的 Amazon EKS 功能时,如果需要特定版本的附加组件,则会在功能文档中注明。除非您出于某个特定原因需要运行早期版本,否则建议您运行最新版本。

创建 Amazon EKS 附加组件

创建 Amazon EKS 类型的附加组件。

  1. 查看集群上当前安装的附加组件版本。

    kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

    示例输出如下。

    v1.12.6-eksbuild.2
  2. 查看集群上当前安装的附加组件类型。根据您创建集群时使用的工具,您的集群上目前可能没有安装 Amazon EKS 附加组件类型。将 my-cluster 替换为您集群的名称。

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

    如果返回来的是版本号,则表明您的集群上安装有 Amazon EKS 类型的附加组件,而且此流程中其余的步骤,您也不需要走完。如果返回来的是一个错误,则表明您的集群上没有安装 Amazon EKS 类型的附加组件。要安装,就需完成此流程中其余的步骤。

  3. 保存您当前安装的附加组件的配置。

    kubectl get daemonset aws-node -n kube-system -o yaml > aws-k8s-cni-old.yaml
  4. 使用 Amazon CLI 创建附加组件。如果要使用 Amazon Web Services Management Console 或 eksctl 来创建附加组件,请参阅 创建附加组件 并指定 vpc-cni 为附加组件名称。将以下命令复制到您的设备。根据需要对该命令进行以下修改,然后运行修改后的命令。

    • my-cluster 替换为您的集群名称。

    • v1.16.2-eksbuild.1 替换为您的集群版本的最新版本表中列出的最新版本。

    • 111122223333 替换为您的账户 ID,并将 AmazonEKSVPCCNIRole 替换为您创建的现有 IAM 角色的名称。指定角色需要您的集群具有 IAM OpenID Connect(OIDC)提供程序。要确定您的集群是否具有此提供程序,或者要创建此提供程序,请参阅 为集群创建 IAM OIDC 提供商

    aws eks create-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.16.2-eksbuild.1 \ --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole

    如果您对当前附加组件应用的自定义设置与 Amazon EKS 附加组件的默认设置相冲突,则创建可能会失败。如果创建失败,您会收到一条可以帮助您解决问题的错误信息。或者,您可以将 --resolve-conflicts OVERWRITE 添加到前面的命令中。这样一来,附加组件会覆盖任何现有的自定义设置。创建附加组件后,您可以使用自定义设置对其进行更新。

  5. 确认您的集群的 Kubernetes 版本的附加组件最新版本已添加到您的集群。将 my-cluster 替换为您的集群名称。

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

    附加组件创建可能需要几秒钟才能完成。

    示例输出如下。

    v1.16.2-eksbuild.1
  6. 如果您在创建 Amazon EKS 附加组件之前对原始附加组件进行了自定义设置,则请使用您在上一步中保存的配置,以使用您的自定义设置更新 Amazon EKS 附加组件。

  7. (可选)将 cni-metrics-helper 安装到您的集群。它会抓取弹性网络接口和 IP 地址信息,在集群级别聚合这些信息,并将指标发布到 Amazon CloudWatch。有关更多信息,请参阅 GitHub 上的 cni-metrics-helper

更新 Amazon EKS 附加组件

更新 Amazon EKS 类型的附加组件。如果您尚未将 Amazon EKS 类型的附加组件添加到集群中,则请添加它或查看 更新自我管理的附加组件,而不是完成此过程。

  1. 查看集群上当前安装的附加组件版本。将 my-cluster 替换为您的集群名称。

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

    示例输出如下。

    v1.12.6-eksbuild.2

    如果返回的版本与最新版本表中集群的 Kubernetes 版本的版本相同,则您的集群上已经安装了最新版本,且您无需完成此过程的其余部分。如果您在输出中收到错误信息而不是版本号,则您的集群上没有安装 Amazon EKS 类型的附加组件。您需要先创建附加组件,然后才能使用此过程对其进行更新。

  2. 保存您当前安装的附加组件的配置。

    kubectl get daemonset aws-node -n kube-system -o yaml > aws-k8s-cni-old.yaml
  3. 使用 Amazon CLI 更新您的附加组件。如果您想要使用 Amazon Web Services Management Console 或 eksctl 更新附加组件,则请参阅 更新附加组件。将以下命令复制到您的设备。根据需要对该命令进行以下修改,然后运行修改后的命令。

    • my-cluster 替换为您的集群名称。

    • v1.16.2-eksbuild.1 替换为您的集群版本的最新版本表中列出的最新版本。

    • 111122223333 替换为您的账户 ID,并将 AmazonEKSVPCCNIRole 替换为您创建的现有 IAM 角色的名称。指定角色需要您的集群具有 IAM OpenID Connect(OIDC)提供程序。要确定您的集群是否具有此提供程序,或者要创建此提供程序,请参阅 为集群创建 IAM OIDC 提供商

    • --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.16.2-eksbuild.1,将 v1.16.2-eksbuild.1 替换为您要查看配置的插件的版本号。将在输出中返回架构。如果您有任何现有的自定义配置,想要将其全部删除,并将所有设置的值设置回 Amazon EKS 的默认值,请从命令中删除 "env":{"AWS_VPC_K8S_CNI_EXTERNALSNAT":"true"},这样就可以有空的 {}。有关每项设置的说明,请参阅 GitHub 上的 CNI 配置变量

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

      可能需要几秒钟才能完成更新。

  4. 确认附加组件版本已更新。将 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.16.2-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\"}}" } }

更新自我管理的附加组件

重要

建议您向集群添加 Amazon EKS 类型的附加组件,而不是自行管理类型的附加组件。如果不熟悉这些类型之间的区别,请参阅 Amazon EKS 附加组件。有关向集群中添加 Amazon EKS 附加组件的更多信息,请参阅 创建附加组件。如果您无法使用 Amazon EKS 附加组件,我们鼓励您向容器路线图 GitHub 存储库提交有关您为什么无法使用的问题。

  1. 确认已在您的集群上安装 Amazon EKS 类型的附加组件。将 my-cluster 替换为您集群的名称。

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

    如果返回错误消息,则表明您的集群上安装有 Amazon EKS 类型的附加组件。要自行管理附加组件,请完成此过程中的剩余步骤以更新附加组件。如果返回版本号,则表明集群上安装有 Amazon EKS 类型的附加组件。要对其进行更新,请使用 更新附加组件 中的过程,而不是此过程。如果不熟悉这些附加组件类型之间的区别,请参阅 Amazon EKS 附加组件

  2. 查看集群上当前安装的容器映像版本。

    kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

    示例输出如下。

    v1.12.6-eksbuild.2

    输出可能不包含版本号。

  3. 备份当前设置,以便在更新版本后可以配置相同设置。

    kubectl get daemonset aws-node -n kube-system -o yaml > aws-k8s-cni-old.yaml
  4. 要查看可用版本并熟悉要更新到的版本中的更改,请参阅 GitHub 上的 releases。请注意,我们建议更新到最新可用版本表中列出的相同 major.minor.patch 版本,即使 GitHub 上提供了更新版本。表中列出的构建版本并未在 GitHub 上列出的自行管理版本中指定。通过完成以下选项之一中的任务来更新您的版本:

    • 如果您的附加组件没有任何自定义设置,请在 GitHub 上针对要更新到的版本运行 To apply this release: 标题下的命令。

    • 如果有自定义设置,请使用以下命令下载清单文件。将 https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/v1.16.2/config/master/aws-k8s-cni.yaml 更改为您要更新到的 GitHub 上的版本的 URL。

      curl -O https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/v1.16.2/config/master/aws-k8s-cni.yaml

      如有必要,使用您在上一步中创建的备份中的自定义设置修改清单,然后将修改后的清单应用到集群。如果节点无法访问从中提取映像的私有 Amazon EKS Amazon ECR 存储库(参阅清单中以 image: 开头的行),则您必须下载映像,将其复制到自己的存储库,然后修改清单以从存储库中提取映像。有关更多信息,请参阅 将容器镜像从一个存储库复制到另一个存储库

      kubectl apply -f aws-k8s-cni.yaml
      
  5. 确认新版本现已安装在集群上。

    kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

    示例输出如下。

    v1.16.2
  6. (可选)将 cni-metrics-helper 安装到您的集群。它会抓取弹性网络接口和 IP 地址信息,在集群级别聚合这些信息,并将指标发布到 Amazon CloudWatch。有关更多信息,请参阅 GitHub 上的 cni-metrics-helper