

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 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 混合節點對包含雲端節點的 Amazon EKS 叢集具有相同的 [Kubernetes 版本支援](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)，包括標準支援和延長支援。

Amazon EKS 混合節點遵循與上游 Kubernetes 相同的[節點版本差異政策](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew)。Amazon EKS 混合節點不能使用比 Amazon EKS 控制平面更新的版本，而混合節點最多可能比 Amazon EKS 控制平面次要版本低三個 Kubernetes 次要版本。

如果您沒有備用容量，可在目標 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 版本上的混合節點時，Pod 之間能夠彼此進行通訊。

1. 確認目標 Kubernetes 版本上的混合節點已成功加入叢集，且狀態為就緒。

1. 使用下列命令，將每個您想要移除的節點標記為不可排程。這樣就不會在您要取代的節點上排程或重新排程新的 Pod。如需詳細資訊，請參閱 Kubernetes 文件中的 [kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)。使用舊 Kubernetes 版本上的混合節點的名稱取代 `NODE_NAME`。

   ```
   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 複本少於兩個，請將部署擴增為至少兩個複本。我們建議您在混合節點上執行至少兩個 CoreDNS 複本，以在正常操作期間實現彈性。

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

1. 使用下列命令，耗盡清空您想要從叢集移除的舊 Kubernetes 版本上的每個混合節點。如需耗盡節點的詳細資訊，請參閱 Kubernetes 文件中的[安全地耗盡節點](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)。使用舊 Kubernetes 版本上的混合節點的名稱取代 `NODE_NAME`。

   ```
   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`。根據預設，如果節點上還有剩餘的 Pod，則 `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. 使用下列命令，將您要升級的節點標記為不可排程。這樣就不會在您要升級的節點上排程或重新排程新的 Pod。如需詳細資訊，請參閱 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 和 IAM Roles Anywhere AWS 憑證提供者的升級加以保留。您無法在升級程序期間變更憑證提供者。如需 `nodeConfig.yaml` 的組態值，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。使用您要升級的目標 Kubernetes 版本取代 `K8S_VERSION`。

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

1. 若要允許於升級之後在節點上排程 Pod，請輸入下列內容。使用節點的名稱取代 `NODE_NAME`。

   ```
   kubectl uncordon NODE_NAME
   ```

1. 觀察混合節點的狀態，等待節點關閉，然後以就緒狀態重新啟動新的 Kubernetes 版本。

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