

 **協助改進此頁面** 

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

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

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

# 為高 DNS 流量擴展 CoreDNS Pod
<a name="coredns-autoscaling"></a>

當您啟動具有至少一個節點的 Amazon EKS 叢集時，依預設會部署包括兩個 CoreDNS 映像複本的 Deployment，而不論叢集中部署的節點數量為何。CoreDNS Pod 為叢集中的所有 Pod 提供名稱解析。應用程式使用名稱解析來連線至叢集中的 Pod 和服務，並連線至叢集外部的服務。隨著來自 Pod 的名稱解析請求 (查詢) 數量增加，CoreDNS Pod 可能會變得不堪重負和速度變慢，並拒絕 Pod 無法處理的請求。

為應對 CoreDNS Pod 增加的負載，請考慮為 CoreDNS 設定自動擴展系統。Amazon EKS 可在 CoreDNS 的 EKS 附加元件版本中管理 CoreDNS 部署的自動擴展。此 CoreDNS 自動擴展器持續監控叢集狀態，包括節點數和 CPU 核心數。根據該資訊，控制器會動態調整 EKS 叢集中 CoreDNS 部署的複本數量。此功能適用於 CoreDNS `v1.9` 及更新版本。有關哪些版本與 CoreDNS 自動擴展相容的更多資訊，請參閱下一節。

該系統會根據叢集中的節點和 CPU 核心數目，使用動態公式自動管理 CoreDNS 複本，計算方式為 (numberOfNodes 除以 16) 和 (numberOfCPUCores 除以 256) 的最大值。它會評估 10 分鐘尖峰時段的需求，在需要時立即向上擴展以處理增加的 DNS 查詢負載，同時每 3 分鐘縮減複本規模 33%，以維持系統穩定性並避免中斷。

我們建議您將此功能與其他 [EKS Cluster Autoscaling 最佳實務](https://aws.github.io/aws-eks-best-practices/cluster-autoscaling/)結合使用，以改善整體應用程式可用性和叢集可擴展性。

## 先決條件
<a name="coredns-autoscaling-prereqs"></a>

要讓 Amazon EKS 擴展您的 CoreDNS 部署，有三個先決條件：
+ 必須使用 CoreDNS 的 *EKS 附加元件*版本。
+ 叢集必須執行至少最低要求的叢集版本和平台版本。
+ 叢集必須執行至少最低要求的 CoreDNS EKS 附加元件版本。

### 最低叢集版本
<a name="coredns-autoscaling-cluster-version"></a>

CoreDNS 的自動擴展由叢集控制平面中的新元件負責，該元件由 Amazon EKS 管理。因此，您必須將叢集升級至支援具有新元件的最低平台版本的 EKS 版本。

新的 Amazon EKS 叢集。若要部署叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。叢集必須執行下表所列的其中一種 Kubernetes 版本和平台版本或更高版本。請注意，也支援比上列任何 Kubernetes 與平台版本更新的版本。您可使用叢集名稱取代下列命令的 *my-cluster*，然後執行修改的命令來檢查目前 Kubernetes 版本：

```
aws eks describe-cluster --name my-cluster --query cluster.version --output text
```


| Kubernetes 版本 | 平台版本 | 
| --- | --- | 
|  未列示  |  全部平台版本  | 
|   `1.29.3`   |   `eks.7`   | 
|   `1.28.8`   |   `eks.13`   | 
|   `1.27.12`   |   `eks.17`   | 
|   `1.26.15`   |   `eks.18`   | 

**注意**  
也支援更高 Kubernetes 版本的每個平台版本，例如從 `eks.1` 開始的 Kubernetes 版本 `1.30`。

### 最低 EKS 附加元件版本
<a name="coredns-autoscaling-coredns-version"></a>


| Kubernetes 版本 | 1.29 | 1.28 | 
| --- | --- | --- | 
|  |   `v1.11.1-eksbuild.9`   |   `v1.10.1-eksbuild.11`   | 

#### 在 AWS 管理主控台 中設定 CoreDNS 自動調整
<a name="coredns-autoscaling-console"></a>

1. 確保您的叢集達到或高於最低叢集版本。

   Amazon EKS 會自動在同一 Kubernetes 版本的不同平台版本之間升級叢集，您無法自行啟動此程序。相反，您可以將叢集升級到下一個 Kubernetes 版本，叢集將升級到該 K8s 版本和最新的平台版本。

   新的 Kubernetes 版本有時會加入重大變更。因此，我們推薦您在更新生產叢集之前，使用新 Kubernetes 版本的單獨叢集測試應用程式的行為。

   要將叢集升級至新的 Kubernetes 版本，請遵循[將現有叢集更新至全新 Kubernetes 版本](update-cluster.md)中的程序。

1. 確保您擁有 CoreDNS 的 EKS 附加元件，而不是自我管理的 CoreDNS 部署。

   視您用來建立叢集的工具而定，您的叢集上目前可能沒有安裝 Amazon EKS 附加元件類型。要查看叢集上安裝的附加元件類型，可執行以下命令。使用您叢集的名稱取代 `my-cluster`。

   ```
   aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text
   ```

   如果傳回版本編號，則表明已在叢集上安裝附加元件的 Amazon EKS 類型，並且您可以繼續後續步驟。如果傳回錯誤，則表明沒有在叢集上安裝 Amazon EKS 類型的附加元件。完成程序[建立 CoreDNS Amazon EKS 附加元件](coredns-add-on-create.md)的其餘步驟，以用 Amazon EKS 附加元件取代自我管理版本。

1. 確保 CoreDNS 的 EKS 附加元件版本等於或高於最低 EKS 附加元件版本。

   查看叢集上目前安裝了哪些附加元件版本。您可以在 AWS 管理主控台 中檢查或執行以下命令：

   ```
   kubectl describe deployment coredns --namespace kube-system | grep coredns: | cut -d : -f 3
   ```

   範例輸出如下。

   ```
   v1.10.1-eksbuild.13
   ```

   將此版本與上一節中的最低要求 EKS 附加元件版本進行比較。如有需要，請遵循程序[更新 CoreDNS Amazon EKS 附加元件](coredns-add-on-update.md)將 EKS 附加元件升級到更高版本。

1. 可將自動調整規模組態新增至 EKS 附加元件的**選用組態設定**。

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

   1. 在左側導覽窗格中，選取 **Clusters** (叢集)，然後選取您要為其設定附加元件之叢集的名稱。

   1. 選擇**附加元件**索引標籤。

   1. 選取 CoreDNS 附加元件方塊右上方的方塊，然後選擇**編輯**。

   1. 在**設定 CoreDNS** 頁面上：

      1. 選取您要使用的**版本**。建議您保留與上一步驟相同的版本，並執行單獨的動作來更新版本與組態。

      1. 展開**選用組態設定**。

      1. 請輸入**組態值**中包含索引鍵 `"enabled":` 和值 `true` 的巢狀 JSON 物件的 JSON 索引鍵 `"autoscaling":` 和值。產生的文字必須是有效的 JSON 物件。如果此金鑰和值是文字方塊中唯一的資料，請以大括號 `{ }` 括住該金鑰和值。以下範例顯示已啟用自動擴展：

         ```
         {
           "autoScaling": {
             "enabled": true
           }
         }
         ```

      1. (選用) 您可以提供自動擴展可以將 CoreDNS Pod 數量擴展到的最小值和最大值。

         以下範例顯示已啟用自動擴展，並且所有選用鍵都有值。我們建議 CoreDNS Pod 的最小數量始終大於 2，以提供叢集中 DNS 服務的彈性。

         ```
         {
           "autoScaling": {
             "enabled": true,
             "minReplicas": 2,
             "maxReplicas": 10
           }
         }
         ```

   1. 要透過取代 CoreDNS Pod 來套用新組態，請選擇**儲存變更**。

      Amazon EKS 藉由*推展*適用於 CoreDNS 的 Kubernetes 部署，來套用變更至 EKS 附加元件。您可在 AWS 管理主控台 的附加元件**更新歷程記錄**中，以及透過 `kubectl rollout status deployment/coredns --namespace kube-system` 來追蹤推展狀態。

       `kubectl rollout` 具有下列命令：

      ```
      kubectl rollout
      
      history  -- View rollout history
      pause    -- Mark the provided resource as paused
      restart  -- Restart a resource
      resume   -- Resume a paused resource
      status   -- Show the status of the rollout
      undo     -- Undo a previous rollout
      ```

      若推展時間太長，Amazon EKS 會復原推展，並且類型為**附加元件更新**及狀態為**失敗**的訊息，則會新增至附加元件的**更新歷程記錄**。要調查任何問題，請從推展的歷史記錄開始，並在 CoreDNS Pod 上執行 `kubectl logs`，以查看 CoreDNS 的日誌。

1. 若**更新歷程記錄**中新項目的狀態為**成功**，則表示推展已完成，並且在所有 CoreDNS Pod 身分識別代理程式 Pod 中，附加元件均會使用新的組態。當您變更叢集中節點的節點和 CPU 核心數時，Amazon EKS 會擴展 CoreDNS 部署的複本數量。

#### 在 AWS 命令列介面中設定 CoreDNS 自動調整規模
<a name="coredns-autoscaling-cli"></a>

1. 確保您的叢集達到或高於最低叢集版本。

   Amazon EKS 會自動在同一 Kubernetes 版本的不同平台版本之間升級叢集，您無法自行啟動此程序。相反，您可以將叢集升級到下一個 Kubernetes 版本，叢集將升級到該 K8s 版本和最新的平台版本。

   新的 Kubernetes 版本有時會加入重大變更。因此，我們推薦您在更新生產叢集之前，使用新 Kubernetes 版本的單獨叢集測試應用程式的行為。

   要將叢集升級至新的 Kubernetes 版本，請遵循[將現有叢集更新至全新 Kubernetes 版本](update-cluster.md)中的程序。

1. 確保您擁有 CoreDNS 的 EKS 附加元件，而不是自我管理的 CoreDNS 部署。

   視您用來建立叢集的工具而定，您的叢集上目前可能沒有安裝 Amazon EKS 附加元件類型。要查看叢集上安裝的附加元件類型，可執行以下命令。使用您叢集的名稱取代 `my-cluster`。

   ```
   aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text
   ```

   如果傳回版本編號，則表明已在叢集上安裝附加元件的 Amazon EKS 類型。如果傳回錯誤，則表明沒有在叢集上安裝 Amazon EKS 類型的附加元件。完成程序[建立 CoreDNS Amazon EKS 附加元件](coredns-add-on-create.md)的其餘步驟，以用 Amazon EKS 附加元件取代自我管理版本。

1. 確保 CoreDNS 的 EKS 附加元件版本等於或高於最低 EKS 附加元件版本。

   查看叢集上目前安裝了哪些附加元件版本。您可以在 AWS 管理主控台 中檢查或執行以下命令：

   ```
   kubectl describe deployment coredns --namespace kube-system | grep coredns: | cut -d : -f 3
   ```

   範例輸出如下。

   ```
   v1.10.1-eksbuild.13
   ```

   將此版本與上一節中的最低要求 EKS 附加元件版本進行比較。如有需要，請遵循程序[更新 CoreDNS Amazon EKS 附加元件](coredns-add-on-update.md)將 EKS 附加元件升級到更高版本。

1. 可將自動調整規模組態新增至 EKS 附加元件的**選用組態設定**。

   執行下列 AWS CLI 命令。將 `my-cluster` 取代為您的叢集名稱，並將 IAM 角色 ARN 取代為您正在使用的角色。

   ```
   aws eks update-addon --cluster-name my-cluster --addon-name coredns \
       --resolve-conflicts PRESERVE --configuration-values '{"autoScaling":{"enabled":true}}'
   ```

   Amazon EKS 藉由*推展*適用於 CoreDNS 的 Kubernetes 部署，來套用變更至 EKS 附加元件。您可在 AWS 管理主控台 的附加元件**更新歷程記錄**中，以及透過 `kubectl rollout status deployment/coredns --namespace kube-system` 來追蹤推展狀態。

    `kubectl rollout` 具有下列命令：

   ```
   kubectl rollout
   
   history  -- View rollout history
   pause    -- Mark the provided resource as paused
   restart  -- Restart a resource
   resume   -- Resume a paused resource
   status   -- Show the status of the rollout
   undo     -- Undo a previous rollout
   ```

   若推展時間太長，Amazon EKS 會復原推展，並且類型為**附加元件更新**及狀態為**失敗**的訊息，則會新增至附加元件的**更新歷程記錄**。要調查任何問題，請從推展的歷史記錄開始，並在 CoreDNS Pod 上執行 `kubectl logs`，以查看 CoreDNS 的日誌。

1. (選用) 您可以提供自動擴展可以將 CoreDNS Pod 數量擴展到的最小值和最大值。

   以下範例顯示已啟用自動擴展，並且所有選用鍵都有值。我們建議 CoreDNS Pod 的最小數量始終大於 2，以提供叢集中 DNS 服務的彈性。

   ```
   aws eks update-addon --cluster-name my-cluster --addon-name coredns \
       --resolve-conflicts PRESERVE --configuration-values '{"autoScaling":{"enabled":true,"minReplicas":2,"maxReplicas":10}}'
   ```

1. 透過執行以下命令檢查附加元件更新的狀態：

   ```
   aws eks describe-addon --cluster-name my-cluster --addon-name coredns
   ```

   如果您看到此行：`"status": "ACTIVE"`，則表示推展已完成，且附加元件在所有 CoreDNS Pod 中使用新組態。當您變更叢集中節點的節點和 CPU 核心數時，Amazon EKS 會擴展 CoreDNS 部署的複本數量。