

 **協助改進此頁面** 

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

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

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

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

**提示**  
使用 Amazon EKS 自動模式，您無需安裝或升級聯網附加元件。自動模式包括 Pod 聯網和負載平衡功能。  
如需詳細資訊，請參閱[利用 EKS 自動模式自動運作叢集基礎設施](automode.md)。

CoreDNS 是一個靈活、可擴展的 DNS 伺服器，可作為 Kubernetes 集群 DNS。當您啟動具有至少一個節點的 Amazon EKS 叢集時，依預設會部署兩個 CoreDNS 映像複本，而不論叢集中部署的節點數量為何。CoreDNS Pod 為叢集中的所有 Pod 提供名稱解析。如果您的叢集包含 [Fargate Profile](fargate-profile.md)，且該設定檔的命名空間與 CoreDNS `deployment` 的命名空間相符，則可將 CoreDNS Pod 部署至 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.14.2-eksbuild.4 | 
| 1.34 | v1.13.2-eksbuild.7 | 
| 1.33 | v1.13.2-eksbuild.7 | 
| 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` 外掛程式新增至組態，以便在 CoreDNS 中使用 `/ready` 端點才能使用探查。
+ 在 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 Enhancement Proposals (KEP)* 中的 [KEP-2067：重新命名 kubeadm「主要」標籤和污點](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)，其中包含最少套件且沒有 Shell。如需詳細資訊，請參閱 [Amazon EKS Distro](https://distro.eks.amazonaws.com/)。CoreDNS 映像的用量和故障診斷保持不變。