帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。
升级集群的混合节点
升级混合节点的指南与在 Amazon EC2 中运行的自主管理型 Amazon EKS 节点类似。我们建议您在目标 Kubernetes 版本上创建新的混合节点,从容地将现有应用程序迁移到新 Kubernetes 版本上的混合节点,然后再从集群中移除旧 Kubernetes 版本上的混合节点。在开始升级之前,请务必检查 Amazon EKS 升级最佳实践。Amazon EKS 混合节点功能与 Amazon EKS 集群(包含云节点)具有相同的 eks/latest/userguide/kubernetes-versions.html[Kubernetes version support,type="documentation"],包括标准支持和延期支持。
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 版本的混合节点的过程。这种策略也称为蓝绿迁移。
-
按照 连接混合节点 步骤将新主机作为混合节点连接。运行
nodeadm install
命令时,请使用目标 Kubernetes 版本。 -
启用目标 Kubernetes 版本的新混合节点与旧 Kubernetes 版本的混合节点之间的通信。此配置让容器组可在将工作负载迁移到目标 Kubernetes 版本的混合节点后进行相互通信。
-
确认目标 Kubernetes 版本的混合节点已成功加入集群并处于“就绪”状态。
-
使用以下命令,将要移除的每个节点标记为不可调度。这样可确保新容器组不会在要替换的节点上调度或重新调度。有关更多信息,请参阅 Kubernetes 文档中的 kubectl cordon
。请将 NODE_NAME
替换为旧 Kubernetes 版本混合节点的名称。kubectl cordon
NODE_NAME
您可以使用以下代码段标识并封锁使用特定 Kubernetes 版本(此示例中为版本
1.28
)的所有节点。K8S_VERSION=1.28 for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name') do echo "Cordoning $node" kubectl cordon $node done
-
如果混合节点上当前部署运行的 CoreDNS 副本少于 2 个,请将部署横向扩展到至少 2 个副本。我们建议您在混合节点上运行至少两个 CoreDNS 副本,以确保正常运行期间的恢复能力。
kubectl scale deployments/coredns --replicas=2 -n kube-system
-
使用以下命令清空要从集群中删除的每个使用旧版本 Kubernetes 的混合节点。有关清空节点的更多信息,请参阅 Kubernetes 文档中的安全地清空一个节点
。请将 NODE_NAME
替换为旧 Kubernetes 版本混合节点的名称。kubectl drain
NODE_NAME
--ignore-daemonsets --delete-emptydir-data您可以使用以下代码段标识并清空特定 Kubernetes 版本(此示例中为版本
1.28
)的所有节点。K8S_VERSION=1.28 for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name') do echo "Draining $node" kubectl drain $node --ignore-daemonsets --delete-emptydir-data done
-
您可以使用
nodeadm
停止混合节点构件并将其从主机中移除。您必须使用具有 root/sudo 权限的用户运行nodeadm
。默认情况下,如果节点上还有容器组,则nodeadm uninstall
不会执行。有关更多信息,请参阅 混合节点 nodeadm 参考。nodeadm uninstall
-
停止并卸载混合节点构件后,从集群中移除节点资源。
kubectl delete node
node-name
您可以使用以下代码段标识并删除特定 Kubernetes 版本(此示例中为版本
1.28
)的所有节点。K8S_VERSION=1.28 for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name') do echo "Deleting $node" kubectl delete node $node done
-
运行上述步骤后,您的混合节点上可能会剩下一些构件,具体取决于您选择的 CNI。请参阅为混合节点配置 CNI了解更多信息。
就地升级
就地升级过程是指使用 nodeadm upgrade
升级混合节点的 Kubernetes 版本,而不使用新的物理或虚拟主机和割接迁移策略。nodeadm upgrade
进程会关闭在混合节点上运行的现有较早版本的 Kubernetes 组件,卸载现有较早版本的 Kubernetes 组件,安装新的目标 Kubernetes 组件,然后启动新的目标 Kubernetes 组件。强烈建议一次升级一个节点,以尽可能减少对混合节点上运行的应用程序的影响。此过程的持续时间取决于网络带宽和延迟。
-
使用以下命令将要升级的节点标记为不可调度。这样可确保新容器组不会在要升级的节点上调度或重新调度。有关更多信息,请参阅 Kubernetes 文档中的 kubectl cordon
。请将 NODE_NAME
替换为要升级的混合节点的名称kubectl cordon NODE_NAME
-
使用以下命令清空您要升级的节点。有关清空节点的更多信息,请参阅 Kubernetes 文档中的安全地清空一个节点
。请将 NODE_NAME
替换为要升级的混合节点的名称。kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
-
在要升级的混合节点上运行
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
-
要允许在升级后在节点上调度容器组(pod),请键入以下内容。请将
NODE_NAME
替换为节点的名称。kubectl uncordon NODE_NAME
-
观察混合节点的状态,等待节点关闭并在新的 Kubernetes 版本上重新启动并进入“就绪”状态。
kubectl get nodes -o wide -w