自动扩缩 CoreDNS - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

自动扩缩 CoreDNS

当您启动具有至少一个节点的 Amazon EKS 集群时,无论集群中部署的节点数量如何,默认情况下都会进行 CoreDNS 映像两个副本的 Deployment。这些 CoreDNS 容器组会为集群中的所有容器组提供名称解析。应用程序会通过名称解析连接到集群中的容器组和服务,并连接到集群外部的服务。随着容器组的名称解析(查询)请求数量增加,CoreDNS 容器组可能会不堪重负,继而减速,并拒绝容器组无法处理的请求。

要处理 CoreDNS 容器组上增加的负载,可以考虑使用 CoreDNS 的自动扩缩系统。Amazon EKS 可以在 CoreDNS 的 EKS 附加组件版本中管理 CoreDNS 部署的自动扩缩。此 CoreDNS 自动扩缩器会持续监控集群状态,包括节点数量和 CPU 核心数量。控制器会根据这些信息,动态调整 EKS 集群中 CoreDNS 部署的副本数量。此功能适用于 CoreDNS v1.9 和 EKS 发行版 1.25 及更高版本。有关与 CoreDNS 自动扩缩兼容的版本的更多信息,请参阅以下章节。

我们建议将此功能与其他 EKS 集群自动扩缩最佳实践结合使用,以提高应用程序的整体可用性和集群可扩展性。

先决条件

要让 Amazon EKS 扩展 CoreDNS 部署,需要满足三个先决条件:

  • 您必须使用 CoreDNS 的 EKS 附加组件版本。

  • 集群必须至少运行最低集群版本和平台版本。

  • 集群必须至少运行最低 CoreDNS EKS 附加组件版本。

最低集群版本

由集群控制面板中的新组件完成 CoreDNS 自动扩缩,该组件由 Amazon EKS 管理。因此,您必须将集群升级到支持的最低平台版本(且其中包含新组件)的 EKS 版本。

新的 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS。集群必须是 1.25 版本或更高版本的 Kubernetes。集群必须运行下表中列出的 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

1.25.16

eks.19

注意

还支持更高 Kubernetes 版本的每个平台版本,例如来自 eks.1 和之后的 Kubernetes 版本 1.30

EKS 附加组件最低版本

Kubernetes 版本 1.29 1.28 1.27 1.26 1.25
v1.11.1-eksbuild.9 v1.10.1-eksbuild.11 v1.10.1-eksbuild.11 v1.9.3-eksbuild.15 v1.9.3-eksbuild.15

在 Amazon Web Services Management Console 中配置 CoreDNS 自动扩缩

  1. 确保集群版本为最低版本或更高版本。

    Amazon EKS 会自动在同一 Kubernetes 版本的平台版本之间升级集群,您无法自行启动此过程。不过,您可以将集群升级到下一个 Kubernetes 版本,而后,集群将升级到该 K8s 版本和最新平台版本。例如,如果您从 1.25 升级为 1.26,集群将升级为 1.26.15 eks.18

    新的 Kubernetes 版本有时会引入重大更改。因此,我们建议您先使用新的 Kubernetes 版本的单个集群来测试应用程序的行为,然后再更新生产集群。

    要将集群升级到新的 Kubernetes 版本,请按照 更新 Amazon EKS 集群 Kubernetes 版本 中的步骤操作。

  2. 确保您具有 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 类型的附加组件。完成剩余的 创建 Amazon EKS 附加组件 步骤,将自行管理的版本替换为 Amazon EKS 附加组件。

  3. 确保 CoreDNS 的 EKS 附加组件版本为 EKS 附加组件最低版本或更高版本。

    查看集群上当前安装的附加组件版本。您可以在 Amazon Web Services Management Console 中查看或运行以下命令:

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

    示例输出如下。

    v1.10.1-eksbuild.11

    将此版本与上一节中的 EKS 附加组件最低版本进行比较。如果需要,请按照以下 更新 Amazon EKS 附加组件 步骤将 EKS 附加组件升级为更高版本。

  4. 将自动扩缩配置添加到 EKS 附加组件的可选配置设置中。

    1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

    2. 在左侧导航窗格中,选择 Clusters(集群),然后选择要为其配置附加组件的集群的名称。

    3. 选择附加组件选项卡。

    4. 选择 CoreDNS 附加组件框右上角的框,然后选择编辑

    5. 配置 CoreDNS 页面上:

      1. 选择您想使用的 Version(版本)。我们建议您保留与上一步相同的版本,并通过单独的操作更新版本和配置。

      2. 展开可选配置设置

      3. 配置值中输入 JSON 键 "autoscaling":,以及键为 "enabled": 且值为 true 的嵌套 JSON 对象的值。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据,请用大括号 {} 将键和值括起来。以下示例显示了已启用的自动扩缩:

        { "autoScaling": { "enabled": true } }
      4. (可选)您可以提供自动扩缩所能扩展的 CoreDNS 容器组数量的最小值和最大值。

        以下示例显示了已启用的自动扩缩以及所有带值的可选键。我们建议 CoreDNS 容器组的最小数量始终大于 2,以便为集群中的 DNS 服务提供弹性。

        { "autoScaling": { "enabled": true, "minReplicas": 2, "maxReplicas": 10 } }
    6. 要通过替换 CoreDNS 容器组来应用新配置,请选择保存更改

      Amazon EKS 通过推出适用于 CoreDNS 的 Kubernetes 部署,将更改应用到 EKS 附加组件。可在 Amazon Web Services Management Console 中的附加组件更新历史记录中跟踪推出状态和 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 容器组上运行 kubectl logs,进而查看 CoreDNS 的日志。

  5. 如果更新历史记录中的新条目状态为成功,则表示推出已完成,并且附加组件正在所有 CoreDNS 容器组中使用新配置。更改集群中的节点数量和 CPU 核心数量时,Amazon EKS 会扩展 CoreDNS 部署的副本数量。

在 Amazon Command Line Interface 中配置 CoreDNS 自动扩缩

  1. 确保集群版本为最低版本或更高版本。

    Amazon EKS 会自动在同一 Kubernetes 版本的平台版本之间升级集群,您无法自行启动此过程。不过,您可以将集群升级到下一个 Kubernetes 版本,而后,集群将升级到该 K8s 版本和最新平台版本。例如,如果您从 1.25 升级为 1.26,集群将升级为 1.26.15 eks.18

    新的 Kubernetes 版本有时会引入重大更改。因此,我们建议您先使用新的 Kubernetes 版本的单个集群来测试应用程序的行为,然后再更新生产集群。

    要将集群升级到新的 Kubernetes 版本,请按照 更新 Amazon EKS 集群 Kubernetes 版本 中的步骤操作。

  2. 确保您具有 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 类型的附加组件。完成剩余的 创建 Amazon EKS 附加组件 步骤,将自行管理的版本替换为 Amazon EKS 附加组件。

  3. 确保 CoreDNS 的 EKS 附加组件版本为 EKS 附加组件最低版本或更高版本。

    查看集群上当前安装的附加组件版本。您可以在 Amazon Web Services Management Console 中查看或运行以下命令:

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

    示例输出如下。

    v1.10.1-eksbuild.11

    将此版本与上一节中的 EKS 附加组件最低版本进行比较。如果需要,请按照以下 更新 Amazon EKS 附加组件 步骤将 EKS 附加组件升级为更高版本。

  4. 将自动扩缩配置添加到 EKS 附加组件的可选配置设置中。

    运行以下 Amazon 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 附加组件。可在 Amazon Web Services Management Console 中的附加组件更新历史记录中跟踪推出状态和 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 容器组上运行 kubectl logs,进而查看 CoreDNS 的日志。

  5. (可选)您可以提供自动扩缩所能扩展的 CoreDNS 容器组数量的最小值和最大值。

    以下示例显示了已启用的自动扩缩以及所有带值的可选键。我们建议 CoreDNS 容器组的最小数量始终大于 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}'
  6. 运行以下命令,检查附加组件的更新状态:

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

    如果您看到此行:"status": "ACTIVE",则表示部署已完成,并且附加组件正在所有 CoreDNS 容器组中使用新配置。更改集群中的节点数量和 CPU 核心数量时,Amazon EKS 会扩展 CoreDNS 部署的副本数量。