

 **協助改進此頁面** 

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

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

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

# 更新 an AWS CloudFormation 節點堆疊
<a name="update-stack"></a>

本主題說明如何使用新的 AMI 更新現有的 AWS CloudFormation 自我管理節點堆疊。您可以使用此程序在叢集更新後將節點更新至新版本的 Kubernetes。否則，您可以針對現有 Kubernetes 版本更新至最新的 Amazon EKS 最佳化 AMI。

**重要**  
本主題涵蓋自我管理節點的節點更新。若要了解[透過受管節點群組來簡化節點生命週期](managed-node-groups.md)的相關詳細資訊，請參閱 [更新叢集的受管節點群組](update-managed-node-group.md)。

最新的預設 Amazon EKS node AWS CloudFormation 範本已設定為在移除舊執行個體之前，在叢集中啟動具有新 AMI 的執行個體，一次一個。此組態可確保您在滾動更新期間，都能掌握叢集中 Auto Scaling 群組所需的作用中執行個體計數。

**注意**  
不支援對使用 `eksctl` 建立的節點群組使用這個方法。如果透過 `eksctl` 建立叢集或節點群組，則請參閱 [將應用程式移轉至新的節點群組](migrate-stack.md)。

1. 判斷叢集的 DNS 供應商。

   ```
   kubectl get deployments -l k8s-app=kube-dns -n kube-system
   ```

   範例輸出如下。此叢集針對 DNS 解析度使用 CoreDNS，但您的叢集可能會傳回 `kube-dns`。根據您使用的 `kubectl` 版本，輸出可能會有所不同。

   ```
   NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   coredns   1         1         1            1           31m
   ```

1. 如果您目前的部署執行少於 2 個複本，請將部署擴增為 2 個複本。如果您先前的命令輸出傳回該項目，請以 `kube-dns` 取代 *coredns*。

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

1. (選用) 如果您使用的是 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，請將部署縮減為零 (0) 個複本以避免衝突的擴展動作。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
   ```

1.  確定目前節點群組的執行個體類型和所需執行個體計數。您稍後更新群組的 AWS CloudFormation 範本時，會輸入這些值。

   1. 前往 https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

   1. 在左側導覽窗格中，選擇 **Launch Configurations** (啟動組態)，並記下現有節點啟動組態的執行個體類型。

   1. 在左側導覽窗格中，選擇 **Auto Scaling Groups** (Auto Scaling 群組)，並注意現有節點 Auto Scaling 群組的 **Desired** (所需) 執行個體計數。

1. 開啟 [AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)。

1. 選取您的節點群組堆疊，然後選擇 **Update** (更新)。

1. 選取 **Replace current template (取代目前的範本)**，然後選取 **Amazon S3 URL**。

1. 對於 **Amazon S3 URL**，請將下列 URL 貼到文字區域，以確保您使用的是最新版本的 node AWS CloudFormation 範本。然後選擇 **Next** (下一步)：

   ```
   https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
   ```

1. 在 **Specify stack details (指定堆疊詳細資訊)** 頁面上，填寫下列參數，然後選擇 **Next (下一步)**：
   +  **NodeAutoScalingGroupDesiredCapacity**：輸入在[先前步驟](#existing-worker-settings-step)中記錄的所需執行個體計數。或者，在堆疊更新時，輸入欲擴展的所需節點數量。
   +  **NodeAutoScalingGroupMaxSize**：輸入節點 Auto Scaling 群組可以擴增的最大節點數。此值必須至少超過所需容量一個節點。這樣才能夠在更新期間執行節點滾動更新，而不必減少節點計數。
   +  **NodeInstanceType**：選擇在[先前步驟](#existing-worker-settings-step)中記錄的執行個體類型。或者，為節點選擇不同的執行個體類型。選擇不同的執行個體類型之前，請檢閱[選擇最佳 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。每個 Amazon EC2 執行個體類型都支援最大數量的彈性網路介面 (網路介面)，且每個網路介面支援最大數量的 IP 地址。由於為每個工作節點和 Pod 指派了自己的 IP 位址，因此請務必選擇支援要在每個 Amazon EC2 節點上執行之最大 Pod 數量的執行個體類型。如需執行個體類型支援的網路介面和 IP 地址數量清單，請參閱[每種執行個體類型每個網路介面的 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)。例如，`m5.large` 執行個體類型最多支援工作節點和 Pod 的 30 個 IP 位址。
**注意**  
最新版本的 [Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)支援的執行個體類型會顯示在 GitHub 上的 [vpc\$1ip\$1resource\$1limit.go](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)。您可能需要更新適用於 Kubernetes 的 Amazon VPC CNI 版本，才能使用最新支援的執行個體類型。如需詳細資訊，請參閱[使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。
**重要**  
有些執行個體類型可能無法在所有 AWS 區域中使用。
   +  **NodeImageIdSSMParam** – 您要更新的 AMI ID 的 Amazon EC2 Systems Manager 參數。以下值對 Kubernetes `1.35` 版使用最新的 Amazon EKS 最佳化 AMI。

     ```
     /aws/service/eks/optimized-ami/1.35/amazon-linux-2/recommended/image_id
     ```

     您可以使用相同的[平台版本](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)取代 *1.35*。或者比控制平面上執行的 Kubernetes 版本早一個版本號的版本。建議您將節點保持在與控制平面相同的版本。您亦可使用不同的 AMI 類型來取代 *amazon-linux-2*。如需詳細資訊，請參閱[擷取建議的 Amazon Linux AMI ID](retrieve-ami-id.md)。
**注意**  
使用 Amazon EC2 Systems Manager 參數可讓您在未來更新節點，而無需查詢和指定 AMI ID。如果您的 AWS CloudFormation 堆疊使用此值，任何堆疊更新一律會針對您指定的 Kubernetes 版本啟動最新的建議 Amazon EKS 最佳化 AMI。即使沒有變更範本中的任何值，情況也會如此。
   +  **NodeImageId**：若要使用您自己的自訂 AMI，請輸入要使用的 AMI 的 ID。
**重要**  
此值會覆寫 **NodeImageIdSSMParam** 指定的任何值。如果您想要使用 **NodeImageIdSSMParam** 值，請確定 **NodeImageId** 的值為空白。
   +  **DisableIMDSv1**：在預設情況下，每個節點都支援執行個體中繼資料服務版本 1 (IMDSv1) 和 IMDSv2。不過，您可以停用 IMDSv1。如果不想要任何節點，或節點群組中排定的任何 Pod 使用 IMDSv1，則請選取 **true** (是)。如需 IMDS 的詳細資訊，請參閱[設定執行個體中繼資料服務](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。如果您已為服務帳戶實作 IAM 角色，請直接將必要的許可指派給需要存取 AWS 服務的所有 Pod。如此一來，叢集中沒有任何 Pod 因為其他原因需要存取 IMDS，例如擷取目前的 AWS 區域。然後，您也可以針對不使用主機聯網的 Pod 停用對 IMDSv2 的存取。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

1. (選用) 在 **Options (選項)** 頁面上，為堆疊資源加上標籤。選擇**下一步**。

1. 在 **Review** (檢閱) 頁面上檢閱您的資訊，確認該堆疊可建立 IAM 資源，然後選擇 **Update stack** (更新堆疊)。
**注意**  
叢集中每個節點的更新，都需要幾分鐘的時間。請等待所有節點更新完成再執行後續步驟。

1. 如果您叢集的 DNS 供應商為 `kube-dns`，請將 `kube-dns` 部署縮減至 1 個複本。

   ```
   kubectl scale deployments/kube-dns --replicas=1 -n kube-system
   ```

1. (選用) 如果您使用的是 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，請將部署縮減回您想要的複本數量。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
   ```

1. (選用) 確認您使用的是最新版本的 [Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)。您可能需要更新適用於 Kubernetes 的 Amazon VPC CNI 版本，才能使用最新支援的執行個體類型。如需詳細資訊，請參閱[使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。