自訂 DNS 服務
本頁說明如何組態您的 DNS Pod,並自訂叢集中的 DNS 解析程序。
開始之前
您需要有一個 Kubernetes 叢集,且 kubectl 命令列工具必須已組態為可與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用下列 Kubernetes playground 之一
您的叢集必須正在執行 CoreDNS 附加元件。
您的 Kubernetes 伺服器版本必須為 v1.12 或更新版本。若要檢查版本,請輸入 kubectl version
。
簡介
DNS 是一個內建的 Kubernetes 服務,使用附加元件管理器 叢集附加元件 自動啟動。
注意
CoreDNS 服務在metadata.name
欄位中命名為 kube-dns
。目的是確保與依賴舊版
kube-dns
服務名稱來解析叢集內部位址的工作負載具有更高的互通性。使用名為 kube-dns
的服務,抽離了哪個 DNS 提供者在該通用名稱後方執行的實作細節。如果您以 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/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-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
}
注意
CoreDNS 不支援 Stub-domain 和名稱伺服器的 FQDN(例如:"ns.foo.com")。在轉換期間,所有 FQDN 名稱伺服器將從 CoreDNS 組態中省略。下一步
- 閱讀 偵錯 DNS 解析