

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 升级集群的混合节点
<a name="hybrid-nodes-upgrade"></a>

升级混合节点的指南与在 Amazon EC2 中运行的自主管理型 Amazon EKS 节点类似。我们建议您在目标 Kubernetes 版本上创建新的混合节点，从容地将现有应用程序迁移到新 Kubernetes 版本上的混合节点，然后再从集群中移除旧 Kubernetes 版本上的混合节点。在开始升级之前，请务必检查 [Amazon EKS 升级最佳实践](https://docs.aws.amazon.com/eks/latest/best-practices/cluster-upgrades.html)。Amazon EKS 混合节点功能[支持的 Kubernetes 版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)与具有云节点的 Amazon EKS 集群相同，包括标准和扩展支持。

Amazon EKS 混合节点功能使用的节点[版本偏斜策略](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew)与上游 Kubernetes 相同。Amazon EKS 混合节点功能不能使用比 Amazon EKS 控制面板更高的版本，混合节点的 Kubernetes 次要版本最多可比 Amazon EKS 控制面板早三个次要版本。

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

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

## 先决条件
<a name="_prerequisites"></a>

在升级之前，请确保您已满足以下先决条件。
+ 升级混合节点的目标 Kubernetes 版本必须等于或早于 Amazon EKS 控制面板的版本。
+ 如果您遵循割接迁移升级策略，则在目标 Kubernetes 版本上安装的新混合节点必须满足[混合节点的先决条件设置](hybrid-nodes-prereqs.md)要求。这包括拥有在创建 Amazon EKS 集群期间传递的远程节点网络 CIDR 中的 IP 地址。
+ 无论是割接迁移升级还是就地升级，混合节点必须有权访问[所需的域](hybrid-nodes-networking.md#hybrid-nodes-networking-on-prem)才能拉取混合节点依赖项的新版本。
+ 您必须已在本地计算机或用于与 Amazon EKS Kubernetes API 端点进行交互的实例上安装 kubectl。
+ 您的 CNI 版本必须支持要升级到的 Kubernetes 版本。如果不支持，请在升级混合节点之前先升级 CNI 版本。请参阅[为混合节点配置 CNI](hybrid-nodes-cni.md)了解更多信息。

## 割接迁移（蓝绿迁移）升级
<a name="hybrid-nodes-upgrade-cutover"></a>

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

1. 按照 [连接混合节点](hybrid-nodes-join.md) 步骤将新主机作为混合节点连接。运行 `nodeadm install` 命令时，请使用目标 Kubernetes 版本。

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

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

1. 使用以下命令，将要移除的每个节点标记为不可调度。这样可确保新容器组不会在要替换的节点上调度或重新调度。有关更多信息，请参阅 Kubernetes 文档中的 [kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/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
   ```

1. 如果混合节点上当前部署运行的 CoreDNS 副本少于 2 个，请将部署横向扩展到至少 2 个副本。我们建议您在混合节点上运行至少两个 CoreDNS 副本，以确保正常运行期间的恢复能力。

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. 使用以下命令清空要从集群中删除的每个使用旧版本 Kubernetes 的混合节点。有关清空节点的更多信息，请参阅 Kubernetes 文档中的[安全地清空一个节点](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)。请将 `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
   ```

1. 您可以使用 `nodeadm` 停止混合节点构件并将其从主机中移除。您必须使用具有 root/sudo 权限的用户运行 `nodeadm`。默认情况下，如果节点上还有容器组，则 `nodeadm uninstall` 不会执行。有关更多信息，请参阅 [混合节点 `nodeadm` 参考](hybrid-nodes-nodeadm.md)。

   ```
   nodeadm uninstall
   ```

1. 停止并卸载混合节点构件后，从集群中移除节点资源。

   ```
   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
   ```

1. 运行上述步骤后，您的混合节点上可能会剩下一些构件，具体取决于您选择的 CNI。请参阅[为混合节点配置 CNI](hybrid-nodes-cni.md)了解更多信息。

## 就地升级
<a name="hybrid-nodes-upgrade-inplace"></a>

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

1. 使用以下命令将要升级的节点标记为不可调度。这样可确保新容器组不会在要升级的节点上调度或重新调度。有关更多信息，请参阅 Kubernetes 文档中的 [kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)。请将 `NODE_NAME` 替换为要升级的混合节点的名称

   ```
   kubectl cordon NODE_NAME
   ```

1. 使用以下命令清空您要升级的节点。有关清空节点的更多信息，请参阅 Kubernetes 文档中的[安全地清空一个节点](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)。请将 `NODE_NAME` 替换为要升级的混合节点的名称。

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

1. 在要升级的混合节点上运行 `nodeadm upgrade`。您必须使用具有 root/sudo 权限的用户运行 `nodeadm`。无论是使用 AWS SSM 还是 AWS IAM Roles Anywhere 凭证提供者，节点名称都会通过升级保留。在升级过程中，您无法更改凭证提供者。有关 `nodeConfig.yaml` 的配置值，请参阅 [混合节点 `nodeadm` 参考](hybrid-nodes-nodeadm.md)。请将 `K8S_VERSION` 替换为要升级到的目标 Kubernetes 版本。

   ```
   nodeadm upgrade K8S_VERSION -c file://nodeConfig.yaml
   ```

1. 要允许在升级后在节点上调度容器组（pod），请键入以下内容。请将 `NODE_NAME` 替换为节点的名称。

   ```
   kubectl uncordon NODE_NAME
   ```

1. 观察混合节点的状态，等待节点关闭并在新的 Kubernetes 版本上重新启动并进入“就绪”状态。

   ```
   kubectl get nodes -o wide -w
   ```