Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何規劃 Amazon EKS 叢集的升級?
我希望在升級 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集時遵循最佳實務。
解決方法
了解升級的效果
Kubernetes 的新版本可能會為您的 Amazon EKS 叢集帶來重大變化。升級叢集後,您無法降級叢集。
如果您升級到較新的 Kubernetes 版本,則不需要執行就地叢集升級。而是可以遷移到新的叢集。如果您遷移到新的叢集,那麼最佳實務是使用叢集備份和還原工具,例如 Velero。如需詳細資訊,請參閱 GitHub 網站上的 Velero。
如需了解目前及先前版本的 Kubernetes,請參閱 Amazon EKS Kubernetes 發行行事曆。
滿足升級要求
若要升級叢集,您必須滿足以下要求:
- 您必須從建立叢集時指定的子網路中,保留最多五個可用的 IP 位址。
- 您叢集的 AWS Identity and Access Management (IAM) 角色和安全群組必須存在於您的 AWS 帳戶中。
- 如果您啟用密碼加密,則叢集 IAM 角色必須具有 AWS Key Management Service (KMS) 金鑰權限。
查看 Amazon EKS 和 Kubernetes 的主要更新
請執行下列動作:
- 查看升級版本的所有記錄的變更,然後記下所需的升級步驟。
- 查看針對 Amazon EKS 受管叢集所特定的要求或程序。
有關 Amazon EKS 叢集平台版本和 Kubernetes 版本重大更新的資訊,請參閱以下文件:
有關 Kubernetes 上游版本和主要更新的資訊,請參閱以下文件:
- Kubernetes 網站上的 Kubernetes 版本說明
- GitHub 網站上的 Kubernetes 變更日誌
了解並檢查已停用的 API
當 Kubernetes 升級 API 時,Kubernetes 也會移除先前的 API。
若要管理已停用的 API,請執行下列操作:
- 若要了解 Kubernetes 如何在較新版本的 Kubernetes 中停用 API,請參閱 Kubernetes 網站上的 Kubernetes 棄用政策。
- 若要檢查叢集中已停用的 API 版本,請使用 Kube No Trouble (kubent) 工具。如需詳細資訊,請參閱 GitHub 網站上的 kube-no-trouble。如果您使用已停用的 API 版本,請在升級 Kubernetes 叢集之前,升級您的工作負載。
- 若要在不同的 API 版本之間轉換 Kubernetes 資訊清單檔案,請使用 kubectl convert 外掛程式。如需詳細資訊,請參閱 Kubernetes 網站上的安裝 kubectl convert 外掛程式。
了解 Kubernetes 升級時預期會發生什麼事
如果您升級叢集,則 Amazon EKS 將使用升級後的 Kubernetes 版本啟動新的 API 伺服器節點,以取代現有節點。Amazon EKS 也會執行一系列內部檢查。如果檢查失敗,Amazon EKS 將會回復基礎架構部署,而您的叢集保持在舊版 Kubernetes 上。回復不會影響正在執行的應用程式,並且您可以恢復叢集。
**注意:**在升級過程中,您可能會遇到輕微的服務中斷。
升級控制平面和資料平面
若要升級叢集,您必須更新控制平面和資料平面。
若要更新平面,請選擇以下其中一個方法:
- 就地叢集升級
- 藍/綠或 Canary 升級
- 受管節點群組升級
就地叢集升級
**重要:**對於就地升級,您只能升級到 Kubernetes 的下一個最新次要版本。如果您的目前叢集版本和目標版本之間存在多個版本,則必須依序升級至每個版本。
對於每個就地 Kubernetes 叢集升級,請完成以下步驟:
- 更新 Kubernetes 資訊清單和已停用的 API。
- 升級叢集控制平面。
- 升級叢集中的節點。
- 更新您的 Kubernetes 附加元件和自訂控制器。
如需詳細資訊,請參閱使用 Amazon EKS 規劃 Kubernetes 升級中的在 Amazon EKS 中規劃和執行 Kubernetes 版本升級一節。另請參閱叢集升級的最佳實務。
藍綠色升級或 Canary 升級
若要完成藍綠或 Canary 升級,請參閱對無狀態 ArgoCD 工作負載的藍綠或 Canary Amazon EKS 叢集遷移。
受管節點群組升級
**重要:**節點的 kubelet 不能晚於 kube-apiserver。另外,kubelet 的版本也不能比 kube-apiserver 落後超過兩個次要版本。例如,如果 kube-apiserver 為 1.24 版本,則 Amazon EKS 僅支援 1.24、1.23 和 1.22 版本的 kubelet。
若要升級受管節點群組,請更新受管節點群組中的節點。
遷移到 Amazon EKS 受管節點群組
如果您使用自我管理的節點群組,則可以將工作負載遷移到 Amazon EKS 受管節點群組,且無需停機。
識別並升級下游相依性
叢集可以包含第三方附加元件和工具,例如輸入控制器、連續交付系統、監控工具和其他工作流程。如果您更新叢集,那麼您還必須更新附加元件和第三方工具。確保您了解附加元件如何與您的叢集協同工作,以及如何更新附加元件。
**注意:**最佳實務是使用受管附加元件,而不是自我管理附加元件。
查看以下常見附加元件和升級文件的範例:
- 確定每個叢集版本要使用的 Amazon Virtual Private Cloud Container Network Interface (Amazon VPC CNI) 附加元件。如需詳細資訊,請參閱使用 Amazon VPC CNI 為 Pod 指派 IP 位址。另請參閱設定 Amazon VPC CNI 外掛程式,以使用服務帳戶的 IAM 角色 (IRSA)。
- 對於自我管理的 kube-proxy 附加元件,請將每個叢集版本更新至最新可用的 kube-proxy 容器映像版本。如需詳細資訊,請參閱管理 Amazon EKS 叢集中的 kube-proxy。
- 對於 CoreDNS,更新至每個叢集版本的最新可用 CoreDNS 容器映像版本。如需詳細資訊,請參閱管理 Amazon EKS 叢集中的 DNS 的 CoreDNS。
- AWS 負載平衡器控制器 2.5.0 或更新版本需要 Kubernetes 1.22 或更新版本。如需詳細資訊,請參閱 GitHub 網站上的 AWS 負載平衡器控制器版本。有關安裝資訊,請參閱使用 AWS 負載平衡器控制器路由網際網路流量。
- Amazon Elastic Block Store (Amazon EBS) CSI 驅動程式版本 1.25.0 或更新版本需要 Kubernetes 版本 1.23 或更新版本。如需詳細資訊,請參閱 GitHub 網站上的 aws-ebs-csi-driver。有關安裝和升級資訊,請參閱步驟 2: 取得 Amazon EBS CSI 驅動程式。
- Amazon Elastic File System (Amazon EFS) CSI 驅動程式版本 1.5.8 或更新版本需要 Kubernetes 版本 1.22 或更新版本。如需詳細資訊,請參閱 GitHub 網站上的 aws-efs-csi-driver。有關安裝和升級資訊,請參閱將彈性檔案系統儲存與 Amazon EFS 結合使用。
升級 Fargate 節點
若要更新 AWS Fargate 節點,請完成以下步驟:
- 刪除您的節點所代表的 Pod。
- 更新您的控制平面。
- 重新部署 Pod。
您現在在 Fargate 上啟動的新 Pod,其 kubelet 版本將與您的叢集版本相符。您的升級不會影響現有的 Fargate Pod。
**注意:**Amazon EKS 必須定期修補 Fargate Pod,以確保這些 Pod 的安全。在更新 Pod 時,Amazon EKS 會盡量將修補作業的影響降到最低。如果 Amazon EKS 無法移除 Pod,則 Amazon EKS 會刪除 Pod。如需將中斷降到最低,請參閱為 AWS Fargate 作業系統修補事件設定動。
升級由 Karpenter 建立的非受管節點
您為 ttlSecondsUntilExpired 設定的值會啟動節點過期機制。當節點達到指定的時間 (以秒為單位) 後,Amazon EKS 將刪除該節點。即使 Amazon EKS 工作負載或應用程式正在使用這些節點,仍會進行刪除。使用 ttlSecondsUntilExpired 將節點替換為新佈建的執行個體,讓您可以升級執行個體。Karpenter 使用最新的 Amazon EKS 最佳化 Amazon Machine Image (AMI) 來取代節點。如需進一步了解 Karpenter 如何中斷節點,請參閱 Karpenter 網站上的中斷。
下列範例顯示了使用 ttlSecondsUntilExpired 取消佈建的節點,然後取代為升級的執行個體:
apiVersion: karpenter.sh/v1alpha5kind: Provisioner metadata: name: default spec: requirements: - key: karpenter.sh/capacity-type # optional, set to on-demand by default, spot if both are listed operator: In values: ["spot"] limits: resources: cpu: 1000 # optional, recommended to limit total provisioned CPUs memory: 1000Gi ttlSecondsAfterEmpty: 30 # optional, but never scales down if not set ttlSecondsUntilExpired: 2592000 # optional, nodes are recycled after 30 days but never expires if not set provider: subnetSelector: karpenter.sh/discovery/CLUSTER_NAME: '*' securityGroupSelector: kubernetes.io/cluster/CLUSTER_NAME: '*'
**注意:**Karpenter 不會自動為 ttlSecondsUntilExpired 值加入抖動。如果您在短時間內建立多個執行個體,則這些執行個體將同時到期。為了防止過多的工作負載中斷,請設定 Pod 中斷預算。如需詳細資訊,請參閱 Kubernetes 網站上的為應用程式指定中斷預算。
- 語言
- 中文 (繁體)
