自定義 DNS 服務

本頁面介紹如何配置 DNS Pod(s) 並自定義叢集中的 DNS 解析過程。

準備工作

你必須擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不充當控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個叢集,或者可以使用這些 Kubernetes 演練場之一。

你的叢集必須執行 CoreDNS 外掛。

你的 Kubernetes 伺服器版本必須是 v1.12 或更高版本。

要檢查版本,請輸入 kubectl version

介紹

DNS 是一個內建的 Kubernetes 服務,它使用**外掛管理器** 叢集外掛 自動啟動。

如果將 CoreDNS 作為 Deployment 執行,它通常會作為具有靜態 IP 地址的 Kubernetes Service 公開。kubelet 使用 `--cluster-dns=<dns-service-ip>` 標誌將 DNS 解析器資訊傳遞給每個容器。

DNS 名稱還需要域。你使用標誌 `--cluster-domain=<default-local-domain>` 在 kubelet 中配置本地域。

DNS 伺服器支援正向查詢(A 和 AAAA 記錄)、埠查詢(SRV 記錄)、反向 IP 地址查詢(PTR 記錄)等等。有關詳細資訊,請參見 Service 和 Pod 的 DNS

如果 Pod 的 `dnsPolicy` 設定為 `default`,它將從 Pod 執行所在的節點繼承名稱解析配置。Pod 的 DNS 解析行為應該與節點相同。但請參閱 已知問題

如果你不希望這樣,或者你希望為 Pod 使用不同的 DNS 配置,你可以使用 kubelet 的 `--resolv-conf` 標誌。將此標誌設定為空字串以防止 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: 錯誤被記錄到標準輸出。
  • health: CoreDNS 的健康狀態報告給 `https://:8080/health`。在這個擴充套件語法中,`lameduck` 將使程序不健康,然後等待 5 秒鐘再關閉程序。
  • ready: 當所有能夠發出就緒訊號的外掛都已發出訊號時,埠 8181 上的 HTTP 端點將返回 200 OK。
  • kubernetes: CoreDNS 將根據 Service 和 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://:9153/metrics` 以 Prometheus 格式(也稱為 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 域和上游名稱伺服器。

示例

如果叢集操作員有一個位於 "10.150.0.1" 的 Consul 域伺服器,並且所有 Consul 名稱都以 ".consul.local" 為字尾。為了在 CoreDNS 中配置它,叢集管理員在 CoreDNS ConfigMap 中建立以下節。

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
    }    

下一步

上次修改時間為 2025 年 1 月 8 日凌晨 2:06 PST:[en] 更新叢集外掛連結 (d3f1ddd0b8)