管理 kube-proxy 附加组件 - Amazon EKS

管理 kube-proxy 附加组件

Kube-proxy 在每个 Amazon EC2 节点上维护网络规则。它能够实现与您的 pods 进行网络通信。Kube-proxy 未部署到 Fargate 节点。有关更多信息,请参阅 Kubernetes文档中的 kube-proxy。每个 Kubernetes 版本都有两种类型的 kube-proxy 容器映像可用:

  • 默认 - 此类型以 Kubernetes 上游社区维护的基于 Debian 的 Docker 映像为基础。

  • 最低 - 此类型基于 Amazon EKS Distro 维护的最低要求基本映像,其中包含最低要求的程序包并且没有 shell。有关更多信息,请参阅 Amazon EKS Distro

每个 Amazon EKS 集群版本的最新可用的 kube-proxy 容器映像版本
Image type 1.23 1.22 1.21 1.20 1.19
kube-proxy(默认类型) v1.23.8-eksbuild.2 v1.22.11-eksbuild.2 v1.21.14-eksbuild.2 v1.20.15-eksbuild.2 v1.19.16-eksbuild.2
kube-proxy(最低要求类型) v1.23.8-minimal-eksbuild.2 v1.22.11-minimal-eksbuild.2 v1.21.14-minimal-eksbuild.2 v1.20.15-minimal-eksbuild.3 v1.19.16-minimal-eksbuild.3

可以使用以下命令查看您的 kube-proxy 容器映像的当前版本。

kubectl get daemonset kube-proxy --namespace kube-system -o=jsonpath='{$.spec.template.spec.containers[:1].image}' | cut -d : -f 2

输出示例如下。

v1.23.8-minimal-eksbuild.2

如果您想更新您的集群上的版本,并且您的集群正在运行 kube-proxy Amazon EKS 附加组件,请参阅 更新 kube-proxy Amazon EKS 附加组件 以对其进行更新。如果您的集群正在运行自行管理的 Amazon EKS 附加组件,请参阅 更新 kube-proxy 自行管理的附加组件 以对其进行更新。

与 Kubernetes 的 kube-proxy 一样,Amazon EKS 也有相同的兼容性和偏斜策略Kube-proxy 必须满足以下要求:

  • 它必须与节点上的 kubelet 具有相同的次要版本。

  • 它不得比集群控制面板的版本新。

  • 它的版本不得比控制面板的版本低两个次要版本。例如,如果您的控制面板正在运行 Kubernetes 1.23,kube-proxy 次要版本不能低于 1.21。

先决条件

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

  • 如果您的集群为 1.21 版本或更高版本,确保您的 Amazon VPC 和 CoreDNS 附加组件为服务账户令牌中列出的最低版本。

添加 kube-proxy Amazon EKS 附加组件

您可以使用 eksctl、AWS Management Console 或 AWS CLI 将 kube-proxy Amazon EKS 附加组件添加到集群。

重要
  • 在添加 kube-proxy Amazon EKS 附加组件之前,请确认您不会自行管理 Amazon EKS 将开始管理的任何设置。要确定 Amazon EKS 管理的设置,请参阅 Amazon EKS 附加组件配置

  • 附加组件的版本号可能与最新可用 kube-proxy 容器映像版本表中的版本不匹配。附加组件的 1.22.x 和更低版本会部署默认映像类型。附加组件的 1.23.x 和更高版本会部署最低映像类型。

eksctl

使用 eksctl 添加 kube-proxyAmazon EKS 附加组件

my-cluster 替换为您集群的名称,然后运行以下命令。Eksctl 添加可用于集群版本的最新版本附加组件。

eksctl create addon --name kube-proxy --cluster my-cluster --force

如果您删除 --force 选项,并且任何 Amazon EKS 附加组件设置与您的现有设置冲突,那么添加 Amazon EKS 附加组件将会失败,而且您会收到一条帮助您解决冲突的错误消息。在指定此选项之前,请确保 Amazon EKS 附加组件不会管理您需要管理的设置,因为这些设置会被此选项覆盖。有关 Amazon EKS 附加组件配置管理的更多信息,请参阅 Amazon EKS 附加组件配置

AWS Management Console

使用 AWS Management Console 添加 kube-proxy Amazon EKS 附加组件

  1. 访问 https://console.aws.amazon.com/eks/home#/clusters 打开 Amazon EKS 控制台。

  2. 在左侧导航窗格中,选择 Clusters(集群),然后选择要为其配置 kube-proxy Amazon EKS 附加组件的集群的名称。

  3. 选择 Add-ons(附加组件)选项卡。

  4. 选择 Add new(新增)

    1. 对于 Name(名称),请选择 kube-proxy

    2. 选择您想使用的 Version(版本)。选择标记为 Latest(最新)的版本。

    3. 如果您选择 Override existing configuration for this add-on on the cluster(覆盖集群上此附加组件的现有配置),那么 Amazon EKS 附加组件的设置可以覆盖现有附加组件的任何设置。如果您未启用此选项,并且任何 Amazon EKS 附加组件设置与您的现有设置冲突,那么添加 Amazon EKS 附加组件将会失败,而且您会收到一条帮助您解决冲突的错误消息。在选择此选项之前,请确保 Amazon EKS 附加组件不会管理您需要管理的设置。有关 Amazon EKS 附加组件配置管理的更多信息,请参阅 Amazon EKS 附加组件配置

    4. 选择 Add(添加)

AWS CLI

使用 AWS CLI 添加 kube-proxy Amazon EKS 附加组件

  1. 确定可用于您的集群版本的 kube-proxy Amazon EKS 附加组件的最新版本。将 1.23 替换为集群版本。

    aws eks describe-addon-versions --kubernetes-version 1.23 --addon-name kube-proxy --query addons[].addonVersions[].addonVersion | grep 1.23

    输出示例如下。

    "v1.23.8-eksbuild.2", "v1.23.7-eksbuild.1",

    在示例输出中,v1.23.8-eksbuild.2 是最新版本。

  2. 创建附加组件。将 my-cluster 替换为您的集群的名称,将 v1.23.8-eksbuild.2 替换为上一步输出中返回的最新版本。

    aws eks create-addon --cluster-name my-cluster --addon-name kube-proxy --addon-version v1.23.8-eksbuild.2 --resolve-conflicts OVERWRITE

    如果您删除 --resolve-conflicts OVERWRITE 选项,并且任何 Amazon EKS 附加组件设置与您的现有设置冲突,那么创建附加组件将会失败,而且您会收到一条帮助您解决冲突的错误消息。在指定此选项之前,请确保 Amazon EKS 附加组件不会管理您需要管理的设置,因为这些设置会被此选项覆盖。有关 Amazon EKS 附加组件配置管理的更多信息,请参阅 Amazon EKS 附加组件配置

更新 kube-proxy Amazon EKS 附加组件

本程序用于更新 kube-proxy Amazon EKS 附加组件。如果您尚未添加 kube-proxy Amazon EKS 附加组件,请改为按照 更新 kube-proxy 自行管理的附加组件 中的程序操作。当新版本发布之后或您将集群更新到一个新的 Kubernetes 次要版本后,Amazon EKS 不会自动更新集群上的 kube-proxy。要更新现有集群上的 kube-proxy,您必须启动更新,然后 Amazon EKS 会为您更新该附加组件。

重要
  • 在将 kube-proxy 更新为与已更新的集群次要版本相同的次要版本前,请将集群和节点更新到新的 Kubernetes 次要版本。

  • 附加组件的版本号可能与最新可用 kube-proxy 容器映像版本表中的版本不匹配。附加组件的 1.22.x 和更低版本会部署默认映像类型。附加组件的 1.23.x 和更高版本会部署最低映像类型。

eksctl

使用 eksctl 更新 kube-proxy Amazon EKS 附加组件

  1. 检查 kube-proxy Amazon EKS 附加组件的当前版本。将 my-cluster 替换为您的集群名称。

    eksctl get addon --name kube-proxy --cluster my-cluster

    输出示例如下。

    NAME VERSION STATUS ISSUES IAMROLE UPDATE AVAILABLE kube-proxy v1.22.11-eksbuild.2 ACTIVE 0 v1.23.8-eksbuild.2
  2. 将附加组件更新为上一个步骤的输出中的 UPDATE AVAILABLE 下返回的版本。

    eksctl update addon --name kube-proxy --version v1.23.8-eksbuild.2 --cluster my-cluster --force

    如果您删除 --force 选项,并且任何 Amazon EKS 附加组件设置与您的现有设置冲突,那么更新 Amazon EKS 附加组件将会失败,而且您会收到一条帮助您解决冲突的错误消息。在指定此选项之前,请确保 Amazon EKS 附加组件不会管理您需要管理的设置,因为这些设置会被此选项覆盖。有关此设置其他选项的更多信息,请参阅 eksctl 文档中的 Addons(附加组件)。有关 Amazon EKS 附加组件配置管理的更多信息,请参阅 Amazon EKS 附加组件配置

AWS Management Console

使用 AWS Management Console 更新 kube-proxy Amazon EKS 附加组件

  1. 访问 https://console.aws.amazon.com/eks/home#/clusters 打开 Amazon EKS 控制台。

  2. 在左侧导航窗格中,选择 Clusters(集群),然后选择要为其更新 kube-proxy Amazon EKS 附加组件的集群的名称。

  3. 选择 Add-ons(附加组件)选项卡。

  4. 选择 kube-proxy 框右上角中的框,然后选择 Edit(编辑)

    1. 选择标记为 Latest(最新)的 Version(版本)。

    2. 对于 Conflict resolution method(冲突解决方法),选择其中一个选项。有关 Amazon EKS 附加组件配置管理的更多信息,请参阅 Amazon EKS 附加组件配置

    3. 选择 Update(更新)

AWS CLI

使用 AWS CLI 更新 kube-proxy Amazon EKS 附加组件

  1. 检查 kube-proxy Amazon EKS 附加组件的当前版本。将 my-cluster 替换为您的集群名称。

    aws eks describe-addon --cluster-name my-cluster --addon-name kube-proxy --query "addon.addonVersion" --output text

    输出示例如下。

    v1.22.11-eksbuild.2
  2. 确定可用于您的集群版本的 kube-proxy Amazon EKS 附加组件的最新版本。将 1.23 替换为集群版本。

    aws eks describe-addon-versions --addon-name kube-proxy --kubernetes-version 1.23 \ --query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" --output text

    输出示例如下。

    v1.23.8-eksbuild.2 False v1.23.7-eksbuild.1 True

    下方使用 True 的版本是创建附加组件时部署的默认版本。创建附加组件时部署的版本可能并非最新可用版本。在之前的输出中,相较于创建附加组件时部署的版本,有更新的版本可用。

  3. 将附加组件更新为最新版本。将 my-cluster 替换为您的集群的名称,将 v1.23.8-eksbuild.2 替换为上一步输出中返回的最新版本。

    aws eks update-addon --cluster-name my-cluster --addon-name kube-proxy --addon-version v1.23.8-eksbuild.2 --resolve-conflicts PRESERVE

    PRESERVE(保留)选项将保留您为附加组件设置的任何自定义设置。有关此设置的其他选项的更多信息,请参阅《Amazon EKS 命令行参考》中的更新附加组件。有关 Amazon EKS 附加组件配置管理的更多信息,请参阅 Amazon EKS 附加组件配置

删除 kube-proxy Amazon EKS 附加组件

移除 Amazon EKS 附加组件时,您有两种选择:

  • 在集群上保留附加组件软件 - 此选项移除了 Amazon EKS 对任何设置和功能的管理,使 Amazon EKS 能够在您启动更新后向您发出更新通知并自动更新 Amazon EKS 附加组件,但会将附加组件软件保留在您的集群上。此选项使附加组件成为自我管理的附加组件,而不是 Amazon EKS 附加组件。附加组件没有停机时间。

  • 从集群中完全删除附加组件:只有在集群中没有资源依赖于附加组件提供的功能时,才应从集群中移除 Amazon EKS 附加组件。删除 Amazon EKS 附加组件后,如有需要,您可以再次添加它。

如果附加组件有与其关联的 IAM 账户,则不会移除该 IAM 账户。

您可以使用 eksctl、AWS Management Console 或 AWS CLI 将 kube-proxy Amazon EKS 附加组件从集群中删除。

eksctl

使用 eksctl 删除 kube-proxy Amazon EKS 附加组件

my-cluster 替换为集群名称,然后运行以下命令。移除 --preserve 会从您的集群中移除附加组件软件。

eksctl delete addon --cluster my-cluster --name kube-proxy --preserve
AWS Management Console

使用 AWS Management Console 删除 kube-proxy Amazon EKS 附加组件

  1. 访问 https://console.aws.amazon.com/eks/home#/clusters 打开 Amazon EKS 控制台。

  2. 在左侧导航窗格中,选择 Clusters(集群),然后选择要删除其 kube-proxy Amazon EKS 附加组件的集群的名称。

  3. 选择 Add-ons(附加组件)选项卡。

  4. 选择 kube-proxy 框的右上角的复选框,然后选择 Remove(删除)。键入 kube-proxy,然后选择 Remove(删除)

AWS CLI

使用 AWS CLI 删除 kube-proxy Amazon EKS 附加组件

my-cluster 替换为集群名称,然后运行以下命令。移除 --preserve 会从您的集群中移除附加组件软件。

aws eks delete-addon --cluster-name my-cluster --addon-name kube-proxy --preserve

更新 kube-proxy 自行管理的附加组件

如果您有一个集群,但尚未向其添加 kube-proxy Amazon EKS 附加组件,请完成以下步骤来更新自行管理式附加组件。如果您已添加了 kube-proxy Amazon EKS 附加组件,请改为按照 更新 kube-proxy Amazon EKS 附加组件 中的程序操作。

重要
  • 在将 kube-proxy 更新为与已更新的集群次要版本相同的次要版本前,请将集群和节点更新到新的 Kubernetes 次要版本。

  • 如果您部署了 1.22.x 和更低版本的集群,则随您的集群一起部署默认映像类型。如果您部署了 1.23.x 和更高版本的集群,则部署最低映像类型。

要使用 kubectl 更新 kube-proxy 自行管理的附加组件

  1. 检查 kube-proxy 部署的当前版本。

    kubectl get daemonset kube-proxy --namespace kube-system -o=jsonpath='{$.spec.template.spec.containers[:1].image}'

    输出示例如下。

    602401143452.dkr.ecr.region-code.amazonaws.com/eks/kube-proxy:v1.22.11-eksbuild.2
  2. 通过将 602401143452region-code 替换为输出的值,更新 kube-proxy 附加组件。1.22.11-eksbuild.2 替换为每个 Amazon EKS 集群版本的最新可用 kube-proxy 容器映像版本表中列出的 kube-proxy 版本。您可以指定默认最低要求映像类型的版本号。

    kubectl set image daemonset.apps/kube-proxy -n kube-system kube-proxy=602401143452.dkr.ecr.region-code.amazonaws.com/eks/kube-proxy:v1.23.8-eksbuild.2
  3. 如果您在同一集群中使用 x86Arm 节点,而且您的集群是在 2020 年 8 月 17 日之前部署的。那么请使用以下命令编辑您的 kube-proxy 清单以将多个硬件架构的节点选择器纳入其中。您只需执行此操作一次。将选择器添加到清单中之后,您无需在每次更新时都进行添加。如果您的集群是在 2020 年 8 月 17 日或之后部署的,则 kube-proxy 已经具有多架构功能。

    kubectl edit -n kube-system daemonset/kube-proxy

    将以下节点选择器添加到编辑器中的文件中,然后保存文件。有关在编辑器的何处纳入此文本的示例,请参阅 GitHub 上的 CNI 清单文件。这使 Kubernetes 能够根据节点的硬件架构提取正确的硬件镜像。

    - key: "kubernetes.io/arch" operator: In values: - amd64 - arm64
  4. 如果您的集群最初是使用 Kubernetes 版本 1.14 或更高版本创建的,则可以跳过此步骤,因为 kube-proxy 已经包含此 Affinity Rule。如果您的 Amazon EKS 集群最初是使用 Kubernetes 版本 1.13 或更早版本创建的,并打算使用 Fargate 节点,请编辑 kube-proxy 清单以将 NodeAffinity 规则纳入其中,以防从 Fargate 节点上调度 kube-proxy pods。您只需执行此编辑一次。将 Affinity Rule 添加到清单之后,您无需在每次升级集群时都进行添加。编辑您的 kube-proxy DaemonSet

    kubectl edit -n kube-system daemonset/kube-proxy

    将以下 Affinity Rule 添加到编辑器中文件中的 DaemonSet spec 部分,然后保存文件。有关在编辑器的何处纳入此文本的示例,请参阅 GitHub 上的 CNI 清单文件。

    - key: eks.amazonaws.com/compute-type operator: NotIn values: - fargate