升级集群的混合节点 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

想为本用户指南做出贡献? 选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

升级集群的混合节点

升级混合节点的指南与在 Amazon EC2 中运行的自主管理型 Amazon EKS 节点类似。建议在目标 Kubernetes 版本上创建新的混合节点,从容地将现有应用程序迁移到新 Kubernetes 版本上的混合节点,然后再从集群中移除旧 Kubernetes 版本上的混合节点。在开始升级之前,请务必检查 Amazon EKS 升级最佳实践。Amazon EKS 混合节点功能支持的 Kubernetes 版本与具有云节点的 Amazon EKS 集群相同,包括标准和扩展支持。

Amazon EKS 混合节点功能使用的节点版本偏斜策略与上游 Kubernetes 相同。Amazon EKS 混合节点功能不能使用比 Amazon EKS 控制面板更高的版本,混合节点的 Kubernetes 次要版本最多可比 Amazon EKS 控制面板早三个次要版本。

如果您没有剩余容量可用来创建具有目标 Kubernetes 版本的新混合节点,以满足割接迁移升级策略的需要,则可以使用 Amazon EKS 混合节点 CLI (nodeadm) 就地升级混合节点的 Kubernetes 版本。

重要

如果您使用 nodeadm 就地升级混合节点,则在关闭旧版本的 Kubernetes 组件以及安装和启动新的 Kubernetes 版本组件的过程中,节点会有停机时间。

先决条件

在升级之前,请确保您已满足以下先决条件。

  • 升级混合节点的目标 Kubernetes 版本必须等于或早于 Amazon EKS 控制面板的版本。

  • 如果您遵循割接迁移升级策略,则在目标 Kubernetes 版本上安装的新混合节点必须满足混合节点的先决条件设置要求。这包括拥有在创建 Amazon EKS 集群期间传递的远程节点网络 CIDR 中的 IP 地址。

  • 无论是割接迁移升级还是就地升级,混合节点必须有权访问所需的域才能拉取混合节点依赖项的新版本。

  • 您必须已在本地计算机或用于与 Amazon EKS Kubernetes API 端点进行交互的实例上安装 kubectl。

  • 您的 CNI 版本必须支持要升级到的 Kubernetes 版本。如果不支持,请在升级混合节点之前先升级 CNI 版本。请参阅为混合节点配置 CNI了解更多信息。

割接迁接升级

割接迁移升级是指首先在新主机上创建具有目标 Kubernetes 版本的新混合节点,从容地将现有应用程序迁移到目标 Kubernetes 版本的新混合节点,然后再从集群中移除旧 Kubernetes 版本的混合节点的过程。

  1. 按照 连接混合节点 步骤将新主机作为混合节点连接。运行 nodeadm install 命令时,请使用目标 Kubernetes 版本。

  2. 启用目标 Kubernetes 版本的新混合节点与旧 Kubernetes 版本的混合节点之间的通信。此配置让容器组可在将工作负载迁移到目标 Kubernetes 版本的混合节点后进行相互通信。

  3. 确认目标 Kubernetes 版本的混合节点已成功加入集群并处于“就绪”状态。

  4. 使用以下命令,对要使用 NoSchedule 删除的每个节点执行 Taint 操作。这样可确保新容器组不会在要替换的节点上调度或重新调度。有关更多信息,请参阅 Kubernetes 文档中的 Taints and Tolerations。请将 NODE_NAME 替换为旧 Kubernetes 版本混合节点的名称。

    kubectl taint nodes NODE_NAME key=value:NoSchedule

    您可以使用以下代码段标识并污染特定 Kubernetes 版本(此示例中为版本 1.28)的所有节点。

    K8S_VERSION=1.28 nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}") for node in ${nodes[@]} do echo "Tainting $node" kubectl taint nodes $node key=value:NoSchedule done
  5. 如果混合节点上当前部署运行的 CoreDNS 副本少于 2 个,请将部署横向扩展到至少 2 个副本。建议在混合节点上运行至少两个 CoreDNS 副本,以确保正常运行期间的韧性。

    kubectl scale deployments/coredns --replicas=2 -n kube-system
  6. 使用以下命令清空要从集群中删除的每个使用旧版本 Kubernetes 的混合节点。有关清空节点的更多信息,请参阅 Kubernetes 文档中的安全地清空一个节点。请将 NODE_NAME 替换为旧 Kubernetes 版本混合节点的名称。

    kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data

    您可以使用以下代码段标识并清空特定 Kubernetes 版本(此示例中为版本 1.28)的所有节点。

    K8S_VERSION=1.28 nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}") for node in ${nodes[@]} do echo "Draining $node" kubectl drain $node --ignore-daemonsets --delete-emptydir-data done
  7. 您可以使用 nodeadm 停止混合节点构件并将其从主机中移除。您必须使用具有 root/sudo 权限的用户运行 nodeadm。默认情况下,如果节点上还有容器组,则 nodeadm uninstall 不会执行。有关更多信息,请参阅混合节点 nodeadm 参考

    nodeadm uninstall
  8. 停止并卸载混合节点构件后,从集群中移除节点资源。

    kubectl delete node node-name

    您可以使用以下代码段标识并删除特定 Kubernetes 版本(此示例中为版本 1.28)的所有节点。

    K8S_VERSION=1.28 nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}") for node in ${nodes[@]} do echo "Deleting $node" kubectl delete node $node done
  9. 运行上述步骤后,您的混合节点上可能会剩下一些构件,具体取决于您选择的 CNI。请参阅为混合节点配置 CNI了解更多信息。

就地升级

就地升级过程是指使用 nodeadm upgrade 升级混合节点的 Kubernetes 版本,而不使用新的物理或虚拟主机和割接迁移策略。nodeadm upgrade 进程会关闭在混合节点上运行的现有较早版本的 Kubernetes 组件,卸载现有较早版本的 Kubernetes 组件,安装新的目标 Kubernetes 组件,然后启动新的目标 Kubernetes 组件。强烈建议一次升级一个节点,以尽可能减少对混合节点上运行的应用程序的影响。此过程的持续时间取决于网络带宽和延迟。

  1. 使用以下命令污染您要使用 NoSchedule 升级的节点。这样可确保新容器组不会在要升级的节点上调度或重新调度。有关更多信息,请参阅 Kubernetes 文档中的 Taints and Tolerations。请将 NODE_NAME 替换为要升级的混合节点的名称

    kubectl taint nodes NODE_NAME key=value:NoSchedule
  2. 使用以下命令清空您要升级的节点。有关清空节点的更多信息,请参阅 Kubernetes 文档中的安全地清空一个节点。请将 NODE_NAME 替换为要升级的混合节点的名称。

    kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
  3. 在要升级的混合节点上运行 nodeadm upgrade。您必须使用具有 root/sudo 权限的用户运行 nodeadm。无论是使用 Amazon SSM 还是 Amazon IAM Roles Anywhere 凭证提供者,节点名称都会通过升级保留。在升级过程中,您无法更改凭证提供者。有关 nodeConfig.yaml 的配置值,请参阅 混合节点 nodeadm 参考。请将 K8S_VERSION 替换为要升级到的目标 Kubernetes 版本。

    nodeadm upgrade K8S_VERSION -c file://nodeConfig.yaml
  4. 观察混合节点的状态,等待节点关闭并在新的 Kubernetes 版本上重新启动并进入“就绪”状态。

    kubectl get nodes -o -w