

 **帮助改进此页面** 

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

# 在 Amazon EKS 集群中管理 DNS 的 CoreDNS
<a name="managing-coredns"></a>

**提示**  
使用 Amazon EKS 自动模式时，您无需安装或升级联网附加组件。自动模式包含容器组联网和负载均衡功能。  
有关更多信息，请参阅 [使用 EKS 自动模式实现集群基础设施自动化](automode.md)。

CoreDNS 是一个灵活、可扩展的 DNS 服务器，可用作 Kubernetes 集群 DNS。当您启动具有至少一个节点的 Amazon EKS 集群时，无论集群中部署的节点数量如何，预设情况下都会部署 CoreDNS 镜像的两个副本。CoreDNS Pod 为集群中的所有 Pod 提供名称解析。如果您的集群包含命名空间与 CoreDNS `deployment` 的命名空间相匹配的 [Fargate 配置文件](fargate-profile.md)，则可以将 CoreDNS 容器组部署到 Fargate 节点。有关 CoreDNS 的更多信息，请参阅 Kubernetes 文档中的[使用 CoreDNS 进行服务发现](https://kubernetes.io/docs/tasks/administer-cluster/coredns/)。

## CoreDNS 版本
<a name="coredns-versions"></a>

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


| Kubernetes 版本 | CoreDNS 版本 | 
| --- | --- | 
|  1.35  |  v1.13.2-eksbuild.4  | 
|  1.34  |  v1.13.2-eksbuild.4  | 
|  1.33  |  v1.13.2-eksbuild.4  | 
|  1.32  |  v1.11.4-eksbuild.33  | 
|  1.31  |  v1.11.4-eksbuild.33  | 
|  1.30  |  v1.11.4-eksbuild.33  | 

**重要**  
如果您自行管理此附加组件，则表中的版本可能与可用的自行管理版本不同。有关更新此附加组件的自行管理类型的更多信息，请参阅[更新 CoreDNS Amazon EKS 自主管理型附加组件](coredns-add-on-self-managed-update.md)。

## 重要的 CoreDNS 升级注意事项
<a name="coredns-upgrade"></a>
+ CoreDNS 更新利用 PodDisruptionBudget 来帮助在更新过程中维持 DNS 服务的可用性。
+ 为了提高 CoreDNS 部署的稳定性和可用性，`v1.9.3-eksbuild.6` 版本及更高版本和 `v1.10.1-eksbuild.3` 使用 `PodDisruptionBudget` 进行部署。如果您已部署现有 `PodDisruptionBudget`，则升级到这些版本可能会失败。如果升级失败，则完成以下任务之一应可解决问题：
  + 升级 Amazon EKS 附加组件时，选择覆盖现有设置作为冲突解决选项。如果您对部署进行了其他自定义设置，请务必在升级之前备份您的设置，以便在升级后可以重新应用其他自定义设置。
  + 删除现有的 `PodDisruptionBudget`，然后再次尝试升级。
+ 在 EKS 附加组件 `v1.9.3-eksbuild.3` 及更高版本和 `v1.10.1-eksbuild.6` 及更高版本中，CoreDNS 部署将 `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
          }
  }
  ```

  您可以设置 `maxUnavailable` 或 `minAvailable`，但不能在一个 `PodDisruptionBudget` 中同时设置两者。有关 `PodDisruptionBudgets` 的更多信息，请参阅《Kubernetes 文档》**中的[指定 PodDisruptionBudget](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-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: Rename the kubeadm "master" label and taint](https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/kubeadm/2067-rename-master-label-taint#renaming-the-node-rolekubernetesiomaster-node-taint)。

  在 EKS 附加组件 `v1.8.7-eksbuild.8` 及更高版本和 `v1.9.3-eksbuild.9` 及更高版本中，两个公差都设置为与每个 Kubernetes 版本兼容。
+ 在 EKS 附加组件 `v1.9.3-eksbuild.11` 和 `v1.10.1-eksbuild.7` 及更高版本中，CoreDNS 部署为 `topologySpreadConstraints` 设置一个默认值。如果多个可用性区域内都有节点，则该默认值可确保 CoreDNS 容器组（pod）分布在可用性区域内。您可以设置一个用于代替默认值的自定义值。默认值如下所示：

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

### CoreDNS `v1.11` 升级注意事项
<a name="coredns-upgrade-1"></a>
+ 在 EKS 附加组件版本 `v1.11.1-eksbuild.4` 以及更高版本中，容器映像基于 Amazon EKS Distro 维护的[最小基本映像](https://gallery.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base)，其中包含最少的软件包且没有外壳。有关更多信息，请参阅 [Amazon EKS Distro](https://distro.eks.amazonaws.com/)。CoreDNS 映像的使用和问题排查保持不变。