協助改善此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
升級叢集的混合節點
升級混合節點的指引類似於在 Amazon EC2 中執行的自我管理 Amazon EKS 節點。我們建議您在目標 Kubernetes 版本上建立新的混合節點、將現有應用程式正常遷移到新 Kubernetes 版本上的混合節點,以及從叢集中移除舊 Kubernetes 版本上的混合節點。開始升級之前,請務必檢閱升級的 Amazon EKS 最佳實務。對於具有雲端節點的 Amazon EKS 叢集,Amazon EKS 混合節點具有相同的 eks/latest/userguide/kubernetes-versions.html【Kubernetes 版本支援,type="documentation"】,包括標準和延伸支援。
Amazon EKS 混合節點遵循與上游 Kubernetes 相同的節點版本扭曲政策
如果您沒有為切換遷移升級策略在目標 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 版本上的混合節點時,讓 Pod 彼此通訊。
-
確認目標 Kubernetes 版本上的混合節點已成功加入叢集,且狀態為就緒。
-
使用下列命令,將您要移除的每個節點標記為不可排程。如此一來,新 Pod 就不會排程或重新排程在您要取代的節點上。如需詳細資訊,請參閱 Kubernetes 文件中的 kubectl 封鎖。
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 複本,請將部署擴展到至少兩個複本。我們建議您在混合節點上執行至少兩個 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
停止和移除混合節點成品。您必須nodeadm
使用具有根/sudo 權限的使用者執行 。根據預設,如果節點上剩餘 Pod,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 元件。強烈建議您一次升級一個節點,將對混合節點上執行之應用程式的影響降至最低。此程序的持續時間取決於您的網路頻寬和延遲。
-
使用以下命令將您要升級的節點標記為不可排程。這樣新 Pod 就不會在您升級的節點上排程或重新排程。如需詳細資訊,請參閱 Kubernetes 文件中的 kubectl 封鎖。
NODE_NAME
以您要升級的混合節點名稱取代kubectl cordon NODE_NAME
-
使用以下命令耗盡您要升級的節點。如需耗盡節點的詳細資訊,請參閱 Kubernetes 文件中的安全地耗盡節點
。 NODE_NAME
以您要升級的混合節點名稱取代 。kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
-
在您升級的混合節點
nodeadm upgrade
上執行 。您必須nodeadm
使用具有根/sudo 權限的使用者執行 。節點的名稱會透過 AWS SSM 和 IAM Roles Anywhere AWS 憑證提供者的升級來保留。您無法在升級程序期間變更登入資料提供者。如需 的組態值混合節點nodeadm參考,請參閱nodeConfig.yaml
。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