CoreDNS 的架構
解析流程
這里用到的是 CoreDNS 的 hosts plugin
插件。該插件僅支持 A, AAAA, 和 PTR 記錄。
kubectl edit configmap coredns -n kube-system
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
hosts {
192.168.1.122 demo1.xx.com
192.168.1.123 demo2.xx.com
fallthrough
}
autopath @kubernetes
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
policy sequential
}
cache 30
loop
reload
loadbalance
}
kubernetes plugin
支持從 Kubernetes 集群讀取 zone 數據。
運行 kubernetes 插件的 CoreDNS 可用作 kubernetes 集群中 kube-dns 的替代品。
forward plugin
用於設置 upstream Nameservers 上游 DNS 服務器。CoreDNS 就是通過它讓容器能夠解析外網的。
Multiple upstreams are randomized (see policy) on first use.
prefer_udp
, try first using UDP even when the request comes in over TCP.policy
specifies the policy to use for selecting upstream servers. The default israndom
.
支持三種策略
- random
- round_robin
- sequential
autopath plugin
在使用 autopath
插件之前,需要了解 pod 的四種 DNS 策略。
- Default: Pod 從運行所在的節點繼承名稱解析配置。
- ClusterFirst: 與配置的集群域后綴不匹配的任何 DNS 查詢都將轉發到從節點繼承的上游名稱服務器。
- ClusterFirstWithHostNet: 對於以 hostNetwork 方式運行的 Pod,應顯式設置該策略。
- None: 此設置允許 Pod 忽略 Kubernetes 環境中的 DNS 設置。Pod 會使用其 dnsConfig 字段 所提供的 DNS 設置。
需要注意的是,pod 的默認 dnsPolicy 不是 Default
,而是 ClusterFirst
。
在 ClusterFirst 模式下,兩次(一次 ipv4,一次 ipv6)集群外部域名查詢產生 8 次(四次 ipv4,四次 ipv6)查詢請求。
Autopath 會在第一次域名查詢失敗時切割域名后綴,嘗試找到正確的域名,做到兩次(一次 ipv4,一次 ipv6)域名查詢獲取到正確的解析結果。
pods 必須設置為 verified
使其正常運行。
其它插件
- errors: 查詢處理期間遇到的任何錯誤都將打印到標准輸出。
- health: 監控檢查。
- ready: 就緒檢查。
- loop: 檢測簡單的轉發循環並停止服務器。
參考文檔