自訂 DNS 服務

本頁說明如何組態您的 DNS Pod,並自訂叢集中的 DNS 解析程序。

開始之前

您需要有一個 Kubernetes 叢集,且 kubectl 命令列工具必須已組態為可與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用下列 Kubernetes playground 之一

您的叢集必須正在執行 CoreDNS 附加元件。

您的 Kubernetes 伺服器版本必須為 v1.12 或更新版本。若要檢查版本,請輸入 kubectl version

簡介

DNS 是一個內建的 Kubernetes 服務,使用附加元件管理器 叢集附加元件 自動啟動。

如果您以 Deployment 方式執行 CoreDNS,它通常會以具有靜態 IP 位址的 Kubernetes 服務公開。kubelet 使用 --cluster-dns=<dns-service-ip> 旗標將 DNS 解析器資訊傳遞給每個容器。

DNS 名稱也需要網域。您可以使用旗標 --cluster-domain=<default-local-domain> 在 kubelet 中設定本機網域。

DNS 伺服器支援正向查詢 (A 和 AAAA 記錄)、連接埠查詢 (SRV 記錄)、反向 IP 位址查詢 (PTR 記錄) 等。如需更多資訊,請參閱 服務和 Pod 的 DNS

如果 Pod 的 dnsPolicy 設定為 default,它會從執行 Pod 的節點繼承名稱解析組態。Pod 的 DNS 解析行為應與節點相同。但請參閱 已知問題

如果您不想要這樣,或者您想要為 Pod 設定不同的 DNS 組態,您可以使用 kubelet 的 --resolv-conf 標flag。將此標flag設定為 "" 以防止 Pod 繼承 DNS。將其設定為有效的檔案路徑,以指定 /etc/resolv.conf 以外的檔案用於 DNS 繼承。

CoreDNS

CoreDNS 是一個通用的權威 DNS 伺服器,可以作為叢集 DNS,並符合 DNS 規格

CoreDNS ConfigMap 選項

CoreDNS 是一個模組化和可插拔的 DNS 伺服器,外掛程式會新增新的功能。CoreDNS 伺服器可以透過維護 Corefile 進行組態設定,Corefile 是 CoreDNS 的組態檔。作為叢集管理員,您可以修改 CoreDNS Corefile 的 ConfigMap,以變更該叢集的 DNS 服務探索行為。

在 Kubernetes 中,CoreDNS 安裝時具有以下預設 Corefile 組態

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health {
            lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
            ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }    

Corefile 組態包含以下 CoreDNS 的 外掛程式

  • errors:錯誤會記錄到 stdout。
  • health:CoreDNS 的健康狀態會報告到 https://127.0.0.1:8080/health。在這個擴充語法中,lameduck 會使程序不健康,然後等待 5 秒才關閉程序。
  • ready:當所有能夠發出就緒訊號的外掛程式都完成時,埠 8181 上的 HTTP 端點將傳回 200 OK。
  • kubernetes:CoreDNS 將根據服務和 Pod 的 IP 回應 DNS 查詢。您可以在 CoreDNS 網站上找到關於此外掛程式的 更多詳細資訊
    • ttl 允許您為回應設定自訂 TTL。預設值為 5 秒。允許的最小 TTL 為 0 秒,最大值上限為 3600 秒。將 TTL 設定為 0 將阻止記錄被快取。
    • 提供 pods insecure 選項是為了向後相容 kube-dns
    • 您可以使用 pods verified 選項,只有在同一個命名空間中存在具有相符 IP 的 Pod 時,才會傳回 A 記錄。
    • 如果您不使用 Pod 記錄,則可以使用 pods disabled 選項。
  • prometheus:CoreDNS 的指標在 https://127.0.0.1:9153/metricsPrometheus 格式(也稱為 OpenMetrics)提供。
  • forward:任何不在 Kubernetes 叢集網域內的查詢都會轉發到預定義的解析器 (/etc/resolv.conf)。
  • cache:這會啟用前端快取。
  • loop:偵測簡單的轉發迴圈,如果找到迴圈,則停止 CoreDNS 程序。
  • reload:允許自動重新載入已變更的 Corefile。在您編輯 ConfigMap 組態後,請等待兩分鐘讓變更生效。
  • loadbalance:這是一個循環式 DNS 負載平衡器,可隨機化答案中 A、AAAA 和 MX 記錄的順序。

您可以透過修改 ConfigMap 來修改預設的 CoreDNS 行為。

使用 CoreDNS 組態 Stub-domain 和上游名稱伺服器

CoreDNS 能夠使用 forward 外掛程式 來組態設定 Stub-domain 和上游名稱伺服器。

範例

如果叢集運營商有一個 Consul 網域伺服器位於 "10.150.0.1",並且所有 Consul 名稱都具有尾碼 ".consul.local"。若要在 CoreDNS 中組態設定它,叢集管理員在 CoreDNS ConfigMap 中建立以下節 (stanza)。

consul.local:53 {
    errors
    cache 30
    forward . 10.150.0.1
}

若要明確強制所有非叢集 DNS 查詢都通過位於 172.16.0.1 的特定名稱伺服器,請將 forward 指向該名稱伺服器,而不是 /etc/resolv.conf

forward .  172.16.0.1

最終的 ConfigMap 以及預設的 Corefile 組態看起來像這樣

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 172.16.0.1
        cache 30
        loop
        reload
        loadbalance
    }
    consul.local:53 {
        errors
        cache 30
        forward . 10.150.0.1
    }    

下一步

上次修改時間:2023 年 1 月 11 日上午 11:12 PST:Update page weights in /tasks/administer-cluster section (b1202c78ff)