自定義 DNS 服務
本頁面介紹如何配置 DNS Pod(s) 並自定義叢集中的 DNS 解析過程。
準備工作
你必須擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不充當控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個叢集,或者可以使用這些 Kubernetes 演練場之一。
你的叢集必須執行 CoreDNS 外掛。
你的 Kubernetes 伺服器版本必須是 v1.12 或更高版本。
要檢查版本,請輸入 kubectl version
。
介紹
DNS 是一個內建的 Kubernetes 服務,它使用**外掛管理器** 叢集外掛 自動啟動。
注意
CoreDNS 服務在 `metadata.name` 欄位中被命名為 `kube-dns`。這樣做的目的是為了確保與依賴舊版 `kube-dns` 服務名稱來解析叢集內部地址的工作負載有更高的互操作性。使用名為 `kube-dns` 的服務將 DNS 提供者在通用名稱背後執行的實現細節抽象出來。
如果將 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
}
注意
CoreDNS 不支援 stub 域和名稱伺服器的 FQDN(例如:"ns.foo.com")。在轉換過程中,所有 FQDN 名稱伺服器都將從 CoreDNS 配置中省略。下一步
- 閱讀 除錯 DNS 解析