

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

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

# 將現有叢集更新至全新 Kubernetes 版本
<a name="update-cluster"></a>

**提示**  
 [註冊](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即將舉行的 Amazon EKS 研討會。

Amazon EKS 中提供新的 Kubernetes 版本時，您可以將 Amazon EKS 叢集更新至最新版本。

**重要**  
一旦升級叢集，您就無法降級至先前的版本。建議您先檢閱[了解 EKS 上的 Kubernetes 版本生命週期](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)中的資訊，以及本主題中的更新步驟，再更新至全新 Kubernetes 版本。

新的 Kubernetes 版本有時會加入重大變更。新的 Kubernetes 版本加入了重大變更，因此推薦您在生產叢集執行更新之前，先針對新的 Kubernetes 版本測試您應用程式的行為。若要達成此目標，您可以在移至新的 Kubernetes 版本之前，先建置持續的整合工作流程來測試應用程式行為。

更新程序包括 Amazon EKS 啟動新的 API 伺服器節點，並使用更新的 Kubernetes 版本取代現有的節點。Amazon EKS 會針對這些新節點的網路流量執行標準的基礎結構和整備運作狀態檢查，以確認新節點如同預期順利運作。然而，一旦開始叢集升級，您就無法暫停或停止升級。如果檢查有失敗，Amazon EKS 會還原基礎設施部署，之前的 Kubernetes 版本仍然保留您的叢集。執行中的應用程式不會受到影響，您的叢集絕對不會處於非確定性或無法恢復狀態。Amazon EKS 會定期備份所有受管叢集，並且具備在必要時復原叢集的機制。我們會持續評估和改善 Kubernetes 基礎結構管理程序。

若要更新叢集，Amazon EKS 最多需要五個來自子網的可用 IP 地址，子網是在您建立叢集時指定的。Amazon EKS 會在您指定的任何子網中建立新的叢集彈性網路介面（網路介面）。網路介面可能會在與您現有網路介面所在的子網不同的子網中建立，因此請確認您的安全群組規則針對您建立叢集時指定的任何子網，允許[所需的叢集通訊](sec-group-reqs.md) 如果您建立叢集時指定的任何子網皆不存在、沒有足夠的可用 IP 位址，或者沒有允許必要的叢集通訊的安全群組規則，則更新可能會失敗。

為了確保叢集的 API 伺服器端點一律可供存取，Amazon EKS 提供了高可用性的 Kubernetes 控制平面，並在更新作業期間執行 API 伺服器執行個體的滾動式更新。為了說明更改支援您的 Kubernetes API 伺服器端點的 API 伺服器執行個體之 IP 位址，您必須確保您的 API 伺服器用戶端會有效管理重新連線。最新版本的 `kubectl` 和 Kubernetes 用戶端[程式庫](https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#programmatic-access-to-the-api)已正式獲得支援，可透明地執行此重新連線程序。

**注意**  
如需了解叢集更新的相關內容，請參閱《EKS 最佳實務指南》中的[叢集升級最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/cluster-upgrades.html)。此資源可協助您規劃升級，以及了解升級叢集的策略。

## Amazon EKS 自動模式的考量事項
<a name="_considerations_for_amazon_eks_auto_mode"></a>
+ Amazon EKS 自動模式的運算功能可控制節點的 Kubernetes 版本。在升級控制平面之後，EKS 自動模式將開始逐步更新受管節點。EKS 自動模式遵守 Pod 中斷預算。
+ 您無須手動升級 Amazon EKS 自動模式的功能，包括運算自動擴展、區塊儲存，以及負載平衡功能。

## 摘要
<a name="update-cluster-summary"></a>

請參閱如下所示 Amazon EKS 叢集升級程序的高階摘要：

1. 確保叢集處於支援升級的狀態。這包括檢查叢集內部署資源所用的 Kubernetes API，從而確認叢集無任何運作狀態問題。在評估叢集的升級準備度時，您應使用 Amazon EKS 升級洞察。

1. 將控制平面升級至下一個次要版本 （例如，從 1.34 升級至 1.35)。

1. 升級資料平面中的節點，以便與控制平面的節點相符。

1. 升級叢集上執行的任何其他應用程式 (例如 `cluster-autoscaler`)。

1. 升級 Amazon EKS 提供的附加元件，例如，預設包含的附加元件：
   +  [Amazon VPC CNI 建議的版本](managing-vpc-cni.md) 
   +  [CoreDNS 建議的版本](managing-coredns.md) 
   +  [`kube-proxy` 建議的版本](managing-kube-proxy.md) 

1. 升級與叢集通訊的任何用戶端 (例如 `kubectl`)。

## 步驟 1：準備升級
<a name="update-existing-cluster"></a>

將叢集控制平面的 Kubernetes 版本與節點的 Kubernetes 版本進行比較。
+ 取得叢集控制平面的 Kubernetes 版本。

  ```
  kubectl version
  ```
+ 取得節點的 Kubernetes 版本。此命令會傳回所有自我管理和受管 Amazon EC2、Fargate，以及混合式節點。每個 Fargate Pod 會被列為其自己的節點。

  ```
  kubectl get nodes
  ```

在將控制平面更新為新的 Kubernetes 版本之前，您叢集中的受管節點和 Fargate 節點的 Kubernetes 次要版本，必須要與控制平面目前版本的版本相同。例如，如果您的控制平面正在執行版本 ，`1.29`且其中一個節點正在執行版本 `1.28`，則您必須先將節點更新為版本 ，`1.29`才能將控制平面更新為 1.30。我們也推薦您在更新控制平面之前，先將自我管理節點與混合式節點更新為與控制平面相同的版本。如需詳細資訊，請參閱[更新叢集的受管節點群組](update-managed-node-group.md)、[更新您的叢集的自我管理節點](update-workers.md)及[升級叢集的混合節點](hybrid-nodes-upgrade.md)。若 Fargate 節點的次要版本低於控制平面版本，請先刪除該節點表示的 Pod。接著更新您的控制平面。重新部署後，任何剩餘的 Pod 都將更新為新版本。

## 步驟 2：檢閱升級考量
<a name="_step_2_review_upgrade_considerations"></a>

Amazon EKS 叢集洞察會針對影響問題的潛在 Kubernetes 版本升級清單來自動掃描叢集，例如棄用 Kubernetes API。Amazon EKS 會依據 Kubernetes 專案中的變更評估，來定期更新要執行的洞察檢查清單。隨著 Amazon EKS 服務及新版本推出變更，Amazon EKS 亦會更新洞察檢查清單。如需詳細資訊，請參閱[利用叢集洞見為 Kubernetes 版本升級做好準備，並為錯誤組態進行故障診斷](cluster-insights.md)。

請檢閱 Kubernetes 文件中的[棄用 API 移轉指南](https://kubernetes.io/docs/reference/using-api/deprecation-guide/)。

### 請檢閱升級洞察
<a name="_review_upgrade_insights"></a>

使用 Amazon EKS 升級洞察來辨識問題。如需詳細資訊，請參閱[檢視升級洞察 (主控台)](view-cluster-insights.md#view-upgrade-insights-console)。

### 詳細考量
<a name="_detailed_considerations"></a>
+ 由於 Amazon EKS 執行高可用性的控制平面，因此您一次只能更新一個次要版本。如需此要求的詳細資訊，請參閱 [Kubernetes Version and Version Skew Support Policy](https://kubernetes.io/docs/setup/version-skew-policy/#kube-apiserver) (Kubernetes 版本和 版本差異支援政策)。假設您目前的叢集版本是版本 `1.28`，並且您想要將其更新為版本 `1.30`。您必須先將您的版本 `1.28` 叢集更新為版本 `1.29`，再將版本 `1.29` 叢集更新為版本 `1.30`。
+ 請檢閱節點上 Kubernetes `kube-apiserver` 和 `kubelet` 之間的版本差異。
  + 從 Kubernetes `1.28` 版開始，`kubelet` 最多可能比 `kube-apiserver` 低三個次要版本。請參閱 [Kubernetes upstream version skew policy](https://kubernetes.io/releases/version-skew-policy/#kubelet) 一節。
  + 如果受管節點和 Fargate 節點上的 `kubelet` 為 Kubernetes `1.25` 版或更高版本，則您可以將叢集的版本更新到最多超前三個版本，而無需更新 `kubelet` 版。例如，如果 `kubelet` 的版本是 `1.25`，在保持 `kubelet` 的版本為 `1.25` 的情況下，您可以將您的 Amazon EKS 叢集版本從 `1.25` 更新為 `1.26`、`1.27` 或 `1.28`
+ 作為最佳實務，在開始更新之前，請確認節點上的 `kubelet` 與控制平面的 Kubernetes 版本相同。
+ 如果您的叢集設定的適用於 Kubernetes 的 Amazon VPC CNI 外掛程式版本比 `1.8.0` 還舊，則建議您將外掛程式更新至最新版本，然後再更新您的叢集。若要更新外掛程式，請參閱 [使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。
+ 您可以備份 Amazon EKS 叢集，以便在升級程序失敗時還原 Amazon EKS 叢集狀態和持久性儲存。請參閱 [使用 Backup AWS 備份 EKS 叢集](integration-backup.md) 

## 步驟 3：更新叢集控制平面
<a name="update-cluster-control-plane"></a>

**重要**  
Amazon EKS 已臨時復原一項功能，若發生特定叢集洞察問題，會要求您使用 `--force` 標誌來升級叢集。如需詳細資訊，請參閱 [GitHub 上對更新叢集版本強制執行升級洞察的臨時復原](https://github.com/aws/containers-roadmap/issues/2570)。  
Amazon EKS 在「上次重新整理時間」後 24 小時內，將會重新整理叢集洞察。您可將解決問題的時間與叢集洞察的「上次重新整理時間」作比較。  
另外，解決啟用 API 之後，更新洞察狀態可能需要最多 30 天。在滾動的 30 天時段內，升級洞察始終會尋找棄用的 API。

您可透過以下方式來提交升級 EKS 控制平面版本的請求：
+  [eksctl](#step3-eksctl) 
+  [AWS 主控台](#step3-console) 
+  [AWS CLI](#step3-cli) 

### 更新叢集 - eksctl
<a name="step3-eksctl"></a>

此程序需要 `eksctl` 版本 `0.215.0` 或更新版本。您可使用以下命令檢查您的版本：

```
eksctl version
```

如需有關安裝和更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的 [Installation](https://eksctl.io/installation) 一節。

更新 Amazon EKS 控制平面的 Kubernetes 版本。使用您的叢集名稱取代 `<cluster-name>`。使用您要更新叢集的 Amazon EKS 支援版本號碼取代 `<version-number>`。若要獲取支援的版本編號清單，請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。

```
eksctl upgrade cluster --name <cluster-name> --version <version-number> --approve
```

此更新需要幾分鐘的時間來完成。

繼續進行[步驟 4：更新叢集元件](#step4)。

### 更新叢集 - AWS 主控台
<a name="step3-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 針對您想要升級的叢集，選擇**立即升級**。

1. 選取叢集要更新的版本，然後選擇**更新**。

1. 此更新需要幾分鐘的時間來完成。繼續進行[步驟 4：更新叢集元件](#step4)。

### 更新叢集 - AWS CLI
<a name="step3-cli"></a>

1. 確認已安裝 AWS CLI 且您已登入。如需詳細資訊，請參閱[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 使用以下 CLI 命令更新您的 Amazon EKS AWS 叢集。取代您想要升級的叢集的 `<cluster-name>` 及 `<region-code>`。使用您要更新叢集的 Amazon EKS 支援版本號碼取代 `<version-number>`。若要獲取支援的版本編號清單，請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。

   ```
   aws eks update-cluster-version --name <cluster-name> \
     --kubernetes-version <verion-number> --region <region-code>
   ```

   範例輸出如下。

   ```
   {
       "update": {
           "id": "<update-id>",
           "status": "InProgress",
           "type": "VersionUpdate",
           "params": [
               {
                   "type": "Version",
                   "value": "<version-number>"
               },
               {
                   "type": "PlatformVersion",
                   "value": "eks.1"
               }
           ],
   [...]
           "errors": []
       }
   ```

1. 此更新需要幾分鐘的時間來完成。使用下列命令來監控叢集更新的狀態。除了使用相同的 `<cluster-name>` 及 `<region-code>`，還需使用上一個命令傳回的 `<update-id>`。

   ```
   aws eks describe-update --name <cluster-name> \
      --region <region-code> --update-id <update-id>
   ```

   顯示 `Successful` 狀態時，即表示更新已完成。

1. 繼續進行[步驟 4：更新叢集元件](#step4)。

## 步驟 4：更新叢集元件
<a name="step4"></a>

1. 叢集更新完成之後，請將您的節點更新至與已更新叢集相同的 Kubernetes 最低版本。如需詳細資訊，請參閱[更新您的叢集的自我管理節點](update-workers.md)、[更新叢集的受管節點群組](update-managed-node-group.md)及[升級叢集的混合節點](hybrid-nodes-upgrade.md)。在 Fargate 上啟動的任何新 Pod 都會有符合您叢集版本的 `kubelet` 版本。現有的 Fargate Pod 不會變更。

1. (選用) 如果您在更新叢集之前已將 Kubernetes Cluster Autoscaler 部署至叢集，則請將 Cluster Autoscaler 更新為符合您最後更新之 Kubernetes 主要和次要版本的最新版本。

   1. 在網頁瀏覽器中開啟 Cluster Autoscaler [版本](https://github.com/kubernetes/autoscaler/releases)頁面，並尋找符合叢集 Kubernetes 主要和次要版本的最新 Cluster Autoscaler 版本。例如，如果叢集的 Kubernetes 版本是 `1.30`，請尋找開頭為 `1.30` 的 Cluster Autoscaler 最新版本。記錄該版本的語意版本編號 (例如，`1.30.n`)，以在下一步中使用。

   1. 使用下列命令，將 Cluster Autoscaler 映像標籤設定為您在前一個步驟中記錄的版本。如有必要，請使用您自己的值取代 `X.XX.X`。

      ```
      kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=registry.k8s.io/autoscaling/cluster-autoscaler:vX.XX.X
      ```

1. (僅限含 GPU 節點的叢集) 如果您的叢集擁有含 GPU 支援的節點群組 (例如，`p3.2xlarge`)，則必須在叢集上更新 [Kubernetes 專用 NVIDIA 裝置外掛程式](https://github.com/NVIDIA/k8s-device-plugin) DaemonSet。請先以您想要的 [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) 版本來取代 `<vX.X.X>`，再執行下列命令。

   ```
   kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/<vX.X.X>/deployments/static/nvidia-device-plugin.yml
   ```

1. 更新適用於 Kubernetes、CoreDNS 及 `kube-proxy` 附加元件的 Amazon VPC CNI 外掛程式。建議您將附加元件更新為[服務帳戶字符](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)中列出的最低版本。
   + 如果您正在使用 Amazon EKS 附加元件，請在 Amazon EKS 主控台中選取 **Clusters** (叢集)，然後在左導覽窗格中選取您已更新的叢集名稱。通知會顯示在主控台。它們會通知您每個有可用更新的附加元件有新的可用版本。若要更新附加元件，請選擇 **Add-ons** (附加元件) 標籤。在具有可用更新之附加元件的其中一個方塊中，選取 **Update now** (立即更新)，選取可用的版本，然後選取 **Update** (更新)。
   + 或者，您可以使用 AWS CLI 或 `eksctl` 來更新附加元件。如需詳細資訊，請參閱[更新 Amazon EKS 附加元件](updating-an-add-on.md)。

1. 如有必要，請更新您的 `kubectl` 版本。您所使用的 `kubectl` 版本，必須與 Amazon EKS 叢集控制平面的版本差距在一個版本以內。

## 升級適用於 Amazon EKS 叢集的 Kubernetes 版本
<a name="downgrade-cluster"></a>

您無法對 Amazon EKS 叢集的 Kubernetes 降級。取而代之的是，在之前的 Amazon EKS 版本上建立新的叢集，然後移轉工作負載。