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

使用 CoreDNS Amazon EKS 附加组件

CoreDNS 是一个灵活、可扩展的 DNS 服务器,可用作 Kubernetes 集群 DNS。当您启动具有至少一个节点的 Amazon EKS 集群时,无论集群中部署的节点数量如何,预设情况下都会部署 CoreDNS 镜像的两个副本。这些 CoreDNS Pods 为集群中的所有 Pods 提供名称解析。如果您的集群包含命名空间与 CoreDNS deployment 的命名空间相匹配的 Amazon Fargate 配置文件 时,则可以将 CoreDNS Pods 容器部署到 Fargate 节点。有关 CoreDNS 的更多信息,请参阅 Kubernetes 文档中的使用 CoreDNS 进行服务发现

下表列出了每个 Kubernetes 版本的 Amazon EKS 附加组件类型的最新版本。

Kubernetes 版本 1.29 1.28 1.27 1.26 1.25 1.24 1.23
v1.11.1-eksbuild.6 v1.10.1-eksbuild.7 v1.10.1-eksbuild.7 v1.9.3-eksbuild.11 v1.9.3-eksbuild.11 v1.9.3-eksbuild.11 v1.8.7-eksbuild.10
重要

如果您自行管理此附加组件,则表中的版本可能与可用的自行管理版本不同。有关更新此附加组件的自行管理类型的更多信息,请参阅更新自我管理的附加组件

重要的 CoreDNS 升级注意事项

  • 为了提高 CoreDNS Deployment 的稳定性和可用性,版本 v1.9.3-eksbuild.5 及更高版本和 v1.10.1-eksbuild.2 使用 PodDisruptionBudget 进行部署。如果您已部署现有 PodDisruptionBudget,则升级到这些版本可能会失败。如果升级失败,则完成以下任务之一应可解决问题:

    • 升级 Amazon EKS 附加组件时,选择覆盖现有设置作为冲突解决选项。如果您对 Deployment 进行了其他自定义设置,请务必在升级之前备份您的设置,以便在升级后可以重新应用其他自定义设置。

    • 删除现有的 PodDisruptionBudget,然后再次尝试升级。

  • 在 EKS 附加组件版本 v1.9.3-eksbuild.3 及更高版本和 v1.10.1-eksbuild.6 及更高版本中,CoreDNS Deployment 将 readinessProbe 设置为使用 /ready 端点。此端点已在 CoreDNS 的 Corefile 配置文件中启用。

    如果您使用自定义 Corefile,则必须将 ready 插件添加到该配置,以便 /ready 端点在 CoreDNS 中处于活动状态,供探测器使用。

  • 在 EKS 附加组件版本 v1.9.3-eksbuild.7 及更高版本 和 v1.10.1-eksbuild.4 及更高版本中,您可以更改 PodDisruptionBudget。您可以使用以下示例中的字段编辑附加组件并在可选配置设置中更改这些设置。此示例显示默认 PodDisruptionBudget

    { "podDisruptionBudget": { "enabled": true, "maxUnavailable": 1 } }

    您可以设置 maxUnavailableminAvailable,但不能在一个 PodDisruptionBudget 中同时设置两者。有关 PodDisruptionBudgets 的更多信息,请参阅 Kubernetes 文档中的指定 PodDisruptionBudget

    请注意,如果将 enabled 设置为 false,则不会删除 PodDisruptionBudget。将此字段设置为 false 后,必须删除 PodDisruptionBudget 对象。同样,如果您在升级到带有 PodDisruptionBudget 的版本后编辑附加组件,以使用该附加组件的旧版本(降级附加组件),则不会删除 PodDisruptionBudget。要删除 PodDisruptionBudget,您可以运行以下命令:

    kubectl delete poddisruptionbudget coredns -n kube-system
  • 在 EKS 插件版本 v1.10.1-eksbuild.5 及更高版本中,将默认容差从 node-role.kubernetes.io/master:NoSchedule 更改为 node-role.kubernetes.io/control-plane:NoSchedule 以符合 KEP 2067。有关 KEP 2067 的更多信息,请参阅 GitHub 上的《Kubernetes 增强建议(KEP)》中的 KEP-2067:重命名 kubeadm“master”标签和污点

    在 EKS 插件版本 v1.8.7-eksbuild.8 及更高版本和 v1.9.3-eksbuild.9 及更高版本中,两个公差都设置为与每个 Kubernetes 版本兼容。

  • 在 EKS 附加组件版本 v1.9.3-eksbuild.11v1.10.1-eksbuild.7 以及更高版本中,CoreDNSDeployment 为 topologySpreadConstraints 设置一个默认值。如果多个可用性区域内都有节点,则该默认值可确保 CoreDNS Pods 分布在可用性区域内。您可以设置一个用于代替默认值的自定义值。默认值如下所示:

    topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: k8s-app: kube-dns

CoreDNS v1.11 升级注意事项

  • 在 EKS 附加组件版本 v1.11.1-eksbuild.4 以及更高版本中,容器映像基于 Amazon EKS Distro 维护的最小基本映像,其中包含最少的软件包且没有外壳。有关更多信息,请参阅 Amazon EKS Distro。CoreDNS 映像的使用和故障排查保持不变。

创建 Amazon EKS 附加组件

创建 Amazon EKS 类型的附加组件。Check

先决条件
  1. 查看集群上当前安装的附加组件版本。

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

    示例输出如下。

    v1.10.1-eksbuild.7
  2. 查看集群上当前安装的附加组件类型。根据您创建集群时使用的工具,您的集群上目前可能没有安装 Amazon EKS 附加组件类型。将 my-cluster 替换为您集群的名称。

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

    如果返回来的是版本号,则表明您的集群上安装有 Amazon EKS 类型的附加组件,而且此流程中其余的步骤,您也不需要走完。如果返回来的是一个错误,则表明您的集群上没有安装 Amazon EKS 类型的附加组件。要安装,就需完成此流程中其余的步骤。

  3. 保存您当前安装的附加组件的配置。

    kubectl get deployment coredns -n kube-system -o yaml > aws-k8s-coredns-old.yaml
  4. 使用 Amazon CLI 创建附加组件。如果要使用 Amazon Web Services Management Console 或 eksctl 来创建附加组件,请参阅 创建附加组件 并指定 coredns 为附加组件名称。将以下命令复制到您的设备。根据需要对该命令进行以下修改,然后运行修改后的命令。

    • my-cluster 替换为您的集群名称。

    • v1.11.1-eksbuild.6 替换为集群版本的最新版本(在最新版本表中列出)。

    aws eks create-addon --cluster-name my-cluster --addon-name coredns --addon-version v1.11.1-eksbuild.6

    如果您对当前附加组件应用的自定义设置与 Amazon EKS 附加组件的默认设置相冲突,则创建可能会失败。如果创建失败,您会收到一条可以帮助您解决问题的错误信息。或者,您可以将 --resolve-conflicts OVERWRITE 添加到前面的命令中。这样一来,附加组件会覆盖任何现有的自定义设置。创建附加组件后,您可以使用自定义设置对其进行更新。

  5. 确认您的集群的 Kubernetes 版本的附加组件最新版本已添加到您的集群。将 my-cluster 替换为您的集群名称。

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

    附加组件创建可能需要几秒钟才能完成。

    示例输出如下。

    v1.11.1-eksbuild.6
  6. 如果您在创建 Amazon EKS 附加组件之前对原始附加组件进行了自定义设置,则请使用您在上一步中保存的配置,以使用您的自定义设置更新 Amazon EKS 附加组件。

更新 Amazon EKS 附加组件

更新 Amazon EKS 类型的附加组件。如果您尚未将 Amazon EKS 类型的附加组件添加到集群中,则请添加它或查看 更新自我管理的附加组件,而不是完成此过程。

  1. 查看集群上当前安装的附加组件版本。将 my-cluster 替换为您的集群名称。

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

    示例输出如下。

    v1.10.1-eksbuild.7

    如果返回的版本与最新版本表中集群的 Kubernetes 版本的版本相同,则您的集群上已经安装了最新版本,且您无需完成此过程的其余部分。如果您在输出中收到错误信息而不是版本号,则您的集群上没有安装 Amazon EKS 类型的附加组件。您需要先创建附加组件,然后才能使用此过程对其进行更新。

  2. 保存您当前安装的附加组件的配置。

    kubectl get deployment coredns -n kube-system -o yaml > aws-k8s-coredns-old.yaml
  3. 使用 Amazon CLI 更新您的附加组件。如果您想要使用 Amazon Web Services Management Console 或 eksctl 更新附加组件,则请参阅 更新附加组件。将以下命令复制到您的设备。根据需要对该命令进行以下修改,然后运行修改后的命令。

    • my-cluster 替换为您的集群名称。

    • v1.11.1-eksbuild.6 替换为集群版本的最新版本(在最新版本表中列出)。

    • --resolve-conflicts PRESERVE 选项保留附加组件的现有配置值。如果您为附加组件设置设定了自定义值,但未使用此选项,则 Amazon EKS 会使用其默认值覆盖您的值。如果您使用此选项,那么我们建议您在更新生产集群上的附加组件之前,先测试非生产集群上所有更改的字段和值。如果您将该值改为 OVERWRITE,则所有设置都将更改为 Amazon EKS 的默认值。如果您为任何设置设定了自定义值,这些值可能会被 Amazon EKS 的默认值覆盖。如果您将该值改为 none,Amazon EKS 不会更改任何设置的值,但更新可能会失败。如果更新失败,您会收到一条帮助您解决冲突的错误消息。

    • 如果您没有更新配置设置,则请从命令中移除 --configuration-values '{"replicaCount":3}'。如果您要更新配置设置,请将 "replicaCount":3 替换为要设置的设置。在此示例中,CoreDNS 的副本数设置为 3。您指定的值必须对配置架构有效。如果您不知道配置架构,请运行 aws eks describe-addon-configuration --addon-name coredns --addon-version v1.11.1-eksbuild.6,将 v1.11.1-eksbuild.6 替换为您要查看配置的插件的版本号。将在输出中返回架构。如果您有任何现有自定义配置,想要将其全部删除,并将所有设置的值设置回 Amazon EKS 默认值,请从命令中删除 "replicaCount":3,这样就可以有空的 {}。有关 CoreDNS 设置的更多信息,请参阅 Kubernetes 文档中的自定义 DNS 服务

      aws eks update-addon --cluster-name my-cluster --addon-name coredns --addon-version v1.11.1-eksbuild.6 \ --resolve-conflicts PRESERVE --configuration-values '{"replicaCount":3}'

      可能需要几秒钟才能完成更新。

  4. 确认附加组件版本已更新。将 my-cluster 替换为您的集群名称。

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

    可能需要几秒钟才能完成更新。

    示例输出如下。

    { "addon": { "addonName": "coredns", "clusterName": "my-cluster", "status": "ACTIVE", "addonVersion": "v1.11.1-eksbuild.6", "health": { "issues": [] }, "addonArn": "arn:aws:eks:region:111122223333:addon/my-cluster/coredns/d2c34f06-1111-2222-1eb0-24f64ce37fa4", "createdAt": "2023-03-01T16:41:32.442000+00:00", "modifiedAt": "2023-03-01T18:16:54.332000+00:00", "tags": {}, "configurationValues": "{\"replicaCount\":3}" } }

更新自我管理的附加组件

重要

建议您向集群添加 Amazon EKS 类型的附加组件,而不是自行管理类型的附加组件。如果不熟悉这些类型之间的区别,请参阅 Amazon EKS 附加组件。有关向集群中添加 Amazon EKS 附加组件的更多信息,请参阅 创建附加组件。如果您无法使用 Amazon EKS 附加组件,我们鼓励您向容器路线图 GitHub 存储库提交有关您为什么无法使用的问题。

  1. 确认已在集群上安装自行管理类型的附加组件。将 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 附加组件

  2. 查看集群上当前安装的容器映像版本。

    kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3

    示例输出如下。

    v1.8.7-eksbuild.2
  3. 如果您的当前 CoreDNS 版本是 v1.5.0 或更高版本,但早于 CoreDNS 版本表中列出的版本,请跳过此步骤。如果您的当前版本低于 1.5.0,则需要修改 ConfigMap,以使 CoreDNS 使用转发附加组件,而不是代理附加组件。

    1. 使用以下命令打开 configmap。

      kubectl edit configmap coredns -n kube-system
    2. 将以下行中的 proxy 替换为 forward。保存文件,然后退出编辑器。

      proxy . /etc/resolv.conf
  4. 如果您最初在 Kubernetes 1.17 或更低版本上部署了集群,那么您可能需要从 CoreDNS 清单中删除已停用的行。

    重要

    在更新到 CoreDNS 版本 1.7.0 之前,您必须完成此步骤,但是即使您要更新到早期版本,我们也建议您完成此步骤。

    1. 检查您的 CoreDNS 清单是否包含该行。

      kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream

      如果未返回任何输出,则说明您的清单没有此类行,您可以跳到下一步更新 CoreDNS。如果返回了输出,则需要删除该行。

    2. 使用以下命令编辑 ConfigMap,删除文件中包含词语 upstream 的该行。不要更改文件中的任何其他内容。删除该行后,保存更改。

      kubectl edit configmap coredns -n kube-system -o yaml
  5. 检索您当前的 CoreDNS 映像版本:

    kubectl describe deployment coredns -n kube-system | grep Image

    示例输出如下。

    918309763551.dkr.ecr.region-code.amazonaws.com.cn/eks/coredns:v1.8.7-eksbuild.2
  6. 如果您要更新到 CoreDNS 1.8.3 或更高版本,则需要将 endpointslices 权限添加到 system:coredns Kubernetes clusterrole

    kubectl edit clusterrole system:coredns -n kube-system

    在文件中的 rules 部分的现有权限行下添加以下行。

    [...] - apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - list - watch [...]
  7. 通过将 918309763551 和 region-code 替换为上一步中返回的输出值来更新 CoreDNS 附件组件。v1.11.1-eksbuild.6 替换为您的 Kubernetes 版本的最新版本表中列出的 CoreDNS 版本。

    kubectl set image deployment.apps/coredns -n kube-system coredns=918309763551.dkr.ecr.region-code.amazonaws.com.cn/eks/coredns:v1.11.1-eksbuild.6

    示例输出如下。

    deployment.apps/coredns image updated
  8. 再次检查容器映像版本,确认它已更新到您在上一步中指定的版本。

    kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3

    示例输出如下。

    v1.11.1-eksbuild.6