使用 CoreDNS Amazon EKS 附加元件 - Amazon EKS

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

使用 CoreDNS Amazon EKS 附加元件

CoreDNS 是一個靈活、可擴展的 DNS 伺服器,可用來做為 Kubernetes 叢集 DNS。當您啟動具有至少一個節點的 Amazon EKS 叢集時,依預設會部署兩個 CoreDNS 映像複本,而不論叢集中部署的節點數量為何。CoreDNS Pods 為叢集中的所有 Pods 提供名稱解析。如果您的叢集包含使用命名空間與 CoreDNS deployment 的命名空間相匹配的 AWS 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.2PodDisruptionBudget 一起部署。如果您已部署現有 PodDisruptionBudget,則可能無法升級至上述版本。如果升級失敗,完成下列其中一項任務即可解決問題:

    • 升級 Amazon EKS 附加元件時,選擇將覆寫現有設定作為衝突解決方案選項。如果您已對 Deployment 制定自訂設定,則務必在升級前備份設定,以便在升級後重新套用其他自訂設定。

    • 移除現有的 PodDisruptionBudget,然後再次嘗試升級。

  • 在 EKS 附加元件版本以v1.9.3-eksbuild.3及更新版本v1.10.1-eksbuild.6和更新版本中,將CoreDNSDeployment設定readinessProbe為使用/ready端點。此端點已在的Corefile組態檔案中啟用CoreDNS。

    如果您使用 CustomCorefile,則必須將ready外掛程式新增至組態,以便在CoreDNS中使用該/ready端點才能使用探查。

  • 在 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:NoSchedulenode-role.kubernetes.io/control-plane:NoSchedule為符合 KEP 2067。如需 KEP 2067 的詳細資訊,請參閱 GitHub 上 Kubernetes Enhancement Proposals (KEP) 中的 KEP-2067:重新命名 kubeadm「主要」標籤和污點

    在 EKS 附加版本以v1.8.7-eksbuild.8及更新版本v1.9.3-eksbuild.9和更新版本中,兩個容許設置為與每個Kubernetes版本兼容。

  • 在 EKS 附加元件版本v1.9.3-eksbuild.11v1.10.1-eksbuild.7和更新版本中,會CoreDNSDeployment設定的預設值。topologySpreadConstraints如果有多個可用區域中CoreDNSPods的節點可用,預設值可確保分散到可用區域。您可以設定將使用的自訂值,而非預設值。預設值如下:

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

CoreDNSv 1.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. 使用 AWS CLI 建立附加元件。如果您想要使用 AWS Management Console 或eksctl建立附加元件,請參閱建立附加元件並指定coredns附加元件名稱。將隨後的命令複製到您的裝置。視需要對命令進行下列修改,然後執行修改後的命令。

    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. 使用 AWS CLI 更新您的附加元件。如果您想要使用 AWS 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 還要舊,則需要修改 CoreDNS 的 ConfigMap,以使用正向附加元件,而不是代理附加元件。

    1. 使用下列命令開啟 ConfigMap。

      kubectl edit configmap coredns -n kube-system
    2. 使用 forward 取代為下列行中的 proxy:儲存檔案,然後退出編輯器。

      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

    範例輸出如下。

    602401143452.dkr.ecr.region-code.amazonaws.com/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. 使用上一步中傳回的輸出值取代 602401143452region-code 來更新 CoreDNS 附加元件。v1.11.1-eksbuild.6 取代為 Kubernetes 版本的最新版本資料表中列出的 CoreDNS 版本。

    kubectl set image deployment.apps/coredns -n kube-system coredns=602401143452.dkr.ecr.region-code.amazonaws.com/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