共用方式為


使用 Azure Kubernetes Service 自訂 CoreDNS

Azure Kubernetes Service (AKS) 會針對所有 1.12.x 和更高叢集的叢集 DNS 管理和解析,來使用 CoreDNS 專案。 如需關於 CoreDNS 自訂和 Kubernetes 的詳細資訊,請參閱官方上游文件

AKS 為受控服務,因此您無法修改 CoreDNS 的主要組態 (CoreFile)。 相反地,您會使用 Kubernetes ConfigMap 來覆寫預設設定。 如果要查看預設的 AKS CoreDNS ConfigMaps,請使用kubectl get configmaps --namespace=kube-system coredns -o yaml命令。

本文說明如何使用 ConfigMaps 來進行 AKS 中基本的 CoreDNS 自訂選項。 此方法不同於在其他執行內容中設定 CoreDNS,例如 CoreFile。

注意

先前,kube-dns 用於叢集 DNS 管理和解析,但現在已淘汰。 kube-dns透過 Kubernetes ConfigMap 供應不同的自訂選項。 CoreDNS 與 kube-dns 回溯並不相容。 先前您所使用的任一自訂專案皆須進行更新為 CoreDNS 使用。

開始之前

  • 此文章假設您目前具有 AKS 叢集。 如果您需要 AKS 叢集,則可以使用 Azure CLIAzure PowerShellAzure 入口網站予以建立。
  • 確認您正在執行的 CoreDNS 版本。 版本之間的設定可能會變更。
  • 當建立類似下列範例的組態時,您在資料區段中的名稱必須以 .server.override 結尾。 此命名慣例定義為,在預設 AKS CoreDNS ConfigMap 中,您可以使用 kubectl get configmaps --namespace=kube-system coredns -o yaml 的命令檢視。

外掛程式支援

支援所有內建的 CoreDNS 外掛程式。 不支援附加元件/協力廠商的外掛程式。

重寫 DNS

您可以使用 AKS 自訂 CoreDNS,以執行即時 DNS 名稱重寫。

  1. 建立名為corednsms.yaml的檔案名稱並貼上下列組態。 確保使用您自己的完整網域名稱來取代<domain to be rewritten>

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: |
        <domain to be rewritten>.com:53 {
        log
        errors
        rewrite stop {
          name regex (.*)\.<domain to be rewritten>\.com {1}.default.svc.cluster.local
          answer name (.*)\.default\.svc\.cluster\.local {1}.<domain to be rewritten>.com
        }
        forward . /etc/resolv.conf # you can redirect this to a specific DNS server such as 10.0.0.10, but that server must be able to resolve the rewritten domain name
        }
    

    重要

    如果您重新導向至 DNS 伺服器,例如 CoreDNS 服務 IP,該 DNS 伺服器必須能解析該重寫功能的網域名稱。

  2. 使用 kubectl apply configmap 命令來建立 ConfigMap,並指定 YAML 資訊清單的名稱。

    kubectl apply -f corednsms.yaml
    
  3. 驗證已套用的自訂專案,請使用 kubectl get configmaps 並指定您的 coredns-custom ConfigMap。

    kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
    
  4. 若要重新載入 ConfigMap 並讓 Kubernetes 排程器在不停機的情況下重新啟動 CoreDNS,請使用 kubectl rollout restart 執行滾動重新啟動。

    kubectl -n kube-system rollout restart deployment coredns
    

自訂轉接伺服器

如果需要為網路流量指定轉接伺服器,您可以建立 ConfigMap 以自訂 DNS。

  1. 建立名為corednsms.yaml的檔案名稱並貼上下列組態。 確保 forward 名稱和位址取代為您自己的環境值。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        <domain to be rewritten>.com:53 {
            forward foo.com 1.1.1.1
        }
    
  2. 使用 kubectl apply configmap 命令來建立 ConfigMap,並指定 YAML 資訊清單的名稱。

    kubectl apply -f corednsms.yaml
    
  3. 若要重新載入 ConfigMap 並讓 Kubernetes 排程器在不停機的情況下重新啟動 CoreDNS,請使用 kubectl rollout restart 執行滾動重新啟動。

    kubectl -n kube-system rollout restart deployment coredns
    

使用自訂網域

您可能會想要設定只能於內部解析的自訂網域。 例如,您可能會想要解析自訂網域 puglife.local,這並不是有效的最上層網域。 如果沒有自訂網域 ConfigMap,AKS 叢集就無法解析該位址。

  1. 建立名為corednsms.yaml 的新檔案名稱並貼上下列組態。 確保使用您自己的環境值,來更新自訂網域和 IP 位址。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      puglife.server: | # you may select any name here, but it must end with the .server file extension
        puglife.local:53 {
            errors
            cache 30
            forward . 192.11.0.1  # this is my test/dev DNS server
        }
    
  2. 使用 kubectl apply configmap 命令來建立 ConfigMap,並指定 YAML 資訊清單的名稱。

    kubectl apply -f corednsms.yaml
    
  3. 若要重新載入 ConfigMap 並讓 Kubernetes 排程器在不停機的情況下重新啟動 CoreDNS,請使用 kubectl rollout restart 執行滾動重新啟動。

    kubectl -n kube-system rollout restart deployment coredns 
    

虛設常式網域

CoreDNS 也能用來設定虛設常式網域。

  1. 建立名為corednsms.yaml的檔案名稱並貼上下列組態。 確保使用您自己的環境值,來更新自訂網域和 IP 位址。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        abc.com:53 {
         errors
         cache 30
         forward . 1.2.3.4
        }
        my.cluster.local:53 {
            errors
            cache 30
            forward . 2.3.4.5
        }
    
    
  2. 使用 kubectl apply configmap 命令來建立 ConfigMap,並指定 YAML 資訊清單的名稱。

    kubectl apply -f corednsms.yaml
    
  3. 若要重新載入 ConfigMap 並讓 Kubernetes 排程器在不停機的情況下重新啟動 CoreDNS,請使用 kubectl rollout restart 執行滾動重新啟動。

    kubectl -n kube-system rollout restart deployment coredns
    

主機外掛程式

由於支援所有內建外掛程式,因此 CoreDNS 主機 外掛程式也為可供自訂/等.

  1. 建立名為corednsms.yaml的檔案名稱並貼上下列組態。 確保使用您自己的環境值,來更新 IP 位址和主機名稱。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        test.override: | # you may select any name here, but it must end with the .override file extension
              hosts { 
                  10.0.0.1 example1.org
                  10.0.0.2 example2.org
                  10.0.0.3 example3.org
                  fallthrough
              }
    
  2. 使用 kubectl apply configmap 命令來建立 ConfigMap,並指定 YAML 資訊清單的名稱。

    kubectl apply -f corednsms.yaml
    
  3. 若要重新載入 ConfigMap 並讓 Kubernetes 排程器在不停機的情況下重新啟動 CoreDNS,請使用 kubectl rollout restart 執行滾動重新啟動。

    kubectl -n kube-system rollout restart deployment coredns
    

無效的搜尋網域完成 internal.cloudapp.net 和 reddog.microsoft.com

Azure DNS 會使用 Azure DNS 在虛擬網路中設定的預設搜尋網域 <vnetId>.<region>.internal.cloudapp.net ,並使用自定義 DNS 伺服器在虛擬網路中設定非功能性存根 reddog.microsoft.com (如需詳細資訊,請參閱 資源名稱解析檔 )。 Kubernetes 會使用 ndots: 5 設定 Pod DNS 設定,以正確支援叢集服務主機名解析。 這兩個組態結合在一起,導致在系統透過網域搜尋清單處理時,永遠不會成功傳送至上游名稱伺服器的搜尋網域完成查詢無效。 這些無效的查詢會導致名稱解析延遲,而且可能會對上游 DNS 伺服器造成額外的負載。

從 v20241025 AKS 版本開始,AKS 會在下列兩種情況下設定 CoreDNS 以回應 NXDOMAIN,以防止這些無效的搜尋網域完成查詢轉送至上游 DNS:

  • 根域或 子域 reddog.microsoft.com的任何查詢。
  • 功能變數名稱中具有七個以上捲標之 子域 internal.cloudapp.net 的任何查詢。
    • 此設定可讓主機名的虛擬機解析仍然成功。 例如,CoreDNS 會將 (6 個標籤) 傳送 aks12345.myvnetid.myregion.internal.cloudapp.net 至 Azure DNS,但拒絕 mcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net (8 個標籤)

此區塊會在叢集 Corefile 的預設伺服器區塊中實作。 如有需要,您可以為已啟用轉寄外掛程式的適當網域建立自定義伺服器區塊,以停用此拒絕設定:

  1. 建立名為corednsms.yaml的檔案名稱並貼上下列組態。 確保使用您自己的環境值,來更新 IP 位址和主機名稱。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        override-block.server:
           internal.cloudapp.net:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
           reddog.microsoft.com:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
    
  2. 使用 kubectl apply configmap 命令來建立 ConfigMap,並指定 YAML 資訊清單的名稱。

    kubectl apply -f corednsms.yaml
    
  3. 若要重新載入 ConfigMap 並讓 Kubernetes 排程器在不停機的情況下重新啟動 CoreDNS,請使用 kubectl rollout restart 執行滾動重新啟動。

    kubectl -n kube-system rollout restart deployment coredns
    

疑難排解

如需一般 CoreDNS 疑難排解步驟,例如,檢查端點或解析,請參閱 偵錯 DNS 解析

設定 CoreDNS Pod 縮放

AKS 叢集中 DNS 流量激增是常見情況,因為 AKS 為工作負載提供彈性。 這些流量高峰可能會導致 CoreDNS Pod 的記憶體使用量增加。 在某些情況下,增加的記憶體使用量可能會導致 Out of memory 問題。 為了預先佔據此問題,AKS 叢集會自動縮放 CoreDNS Pod,以減少每個 Pod 的記憶體使用量。 此自動縮放邏輯的預設設定會儲存在 coredns-autoscaler ConfigMap 中。 不過,您可能會發現 CoreDNS Pod 的預設自動縮放不一定足夠,無法防止 CoreDNS Pod 發生 Out of memory 問題。 在此情況下,您可以直接修改 coredns-autoscaler ConfigMap。 請注意,儘增加 CoreDNS Pod 數目而不解決 Out of memory 問題的根本原因,只能提供暫時修正。 如果 CoreDNS Pod 執行所在的節點沒有足夠的記憶體可用,則增加 CoreDNS Pod 數目將無濟於事。 您可能需要進一步調查並實施適當的解決方案,例如最佳化資源使用量、調整資源要求和限制,或將更多記憶體新增至節點。

CoreDNS 會針對 Pod 自動縮放使用 水平叢集比例自動縮放。 您可以編輯 coredns-autoscaler ConfigMap,以設定 CoreDNS Pod 數目的縮放邏輯。 coredns-autoscaler ConfigMap 目前支援兩個不同的 ConfigMap 索引鍵值: linearladder 對應至兩種支援的控制項模式。 linear 控制器會在相當於 max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )的 [min,max] 範圍內產生數個複本。 ladder 控制器會藉由諮詢兩個不同的步驟函數來計算複本數目,一個用於核心調整,另一個用於節點調整,產生兩個複本值的最大值。 如需有關控制項模式和 ConfigMap 格式的詳細資訊,請參閱 上游文件

重要

建議每個叢集至少 2 個 CoreDNS Pod 複本。 設定 1 個 CoreDNS Pod 複本可能會導致作業期間失敗,該作業需要清空節點,例如叢集升級作業。

若要擷取 coredns-autoscaler ConfigMap,您可以執行 kubectl get configmap coredns-autoscaler -n kube-system -o yaml 命令傳回下列內容:

apiVersion: v1
data:
  ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}'
kind: ConfigMap
metadata:
  name: coredns-autoscaler
  namespace: kube-system
  resourceVersion: "..."
  creationTimestamp: "..."

啟用 DNS 查詢記錄

  1. 將下列設定新增至 coredns-custom ConfigMap:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      log.override: | # you may select any name here, but it must end with the .override file extension
            log
    
  2. 套用設定變更並強制 CoreDNS 使用下列命令重新載入 ConfigMap:

    # Apply configuration changes
    kubectl apply -f corednsms.yaml
    
    # Force CoreDNS to reload the ConfigMap
    kubectl -n kube-system rollout restart deployment coredns
    
  3. 使用 kubectl logs 命令檢視 CoreDNS 偵錯記錄。

    kubectl logs --namespace kube-system -l k8s-app=kube-dns
    

下一步

本文顯示一些 CoreDNS 自訂的案例。 如需 CoreDNS 專案的相關資訊,請參閱 CoreDNS 上游專案分頁

如需深入瞭解核心網路概念,請參閱 AKS 中應用程式的網路概念