

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 扩展 CoreDNS 容器以获得高 DNS 流量
<a name="coredns-autoscaling"></a>

启动具有至少一个节点的 Amazon EKS 集群时，无论集群中部署的节点数是多少，默认情况下都会部署 CoreDNS 映像的两个副本。CoreDNS 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 集群自动扩缩最佳实践](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. 在**配置值**中输入 JSON 键 `"autoscaling":`，以及键为 `"enabled":` 且值为 `true` 的嵌套 JSON 对象的值。生成的文本必须是有效的 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）中使用新配置。更改集群中的节点数量和 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 部署的副本数量。