本文解釋如何為kubernetes叢集配置及自定義DNS服務。從kubernetes1.11版本開始,coreDNS插件被包含在GA發行版中,并且被kubeadm預設安裝。詳情:Configuring CoreDNS and Using CoreDNS for Service Discovery。除特别說明,本文讨論的是預設dns插件。
介紹
Kubernetes的DNS功能以插件形式提供,是自動啟動的系統内置服務。服務包含如下三個容器:
-
kubedns:監控Kubernetes
master的service與endpoint變更,增删改DNS記錄,将相關資料儲存在記憶體中,為DNS查詢提供服務。
- dnsmasq: 充當DNS緩存,提高性能。
- sidecar:挂鬥容器,對dnsmasq與kubedns進行單點健康檢查。
DNS服務擁有靜态IP位址,将各節點kubeletr的–cluster-dns=設定成DNS服務的靜态IP位址,當kubelet建立容器時則将此位址傳遞給容器。Kubernetes的DNS服務基于skyDNS庫,支援forward lookups (A records)、service lookups (SRV records)、reverse IP address lookups (PTR records)。
從節點繼承DNS配置
當kubelet啟動容器時,除使用kubernetes内置的DNS服務,預設從節點繼承其DNS配置。此特性使kubernetes系統中的容器DNS行為高度依賴低層節點,建議關閉,設定kubelet–resolv-conf選項為使用者自定義配置檔案,而非系統預設/etc/resolve.conf,這樣容器繼承的DNS配置由使用者提供的配置檔案決定,而非節點,降低耦合度。
配置存根域及上遊DNS伺服器
叢集管理者可通過為kubernetes中DNS服務kube-system:kube-dns提供ConfigMap對象,設定自定義存根域及上遊DNS伺服器。以下示例為DNS服務配置一個存根域及兩個上遊DNS伺服器:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{"acme.local": ["1.2.3.4"]}
upstreamNameservers: |
["8.8.8.8", "8.8.4.4"]
如果查詢請求的字首為”acme.local”則被直接轉發到1.2.3.4。下表列出不同域名字首與DNS伺服器對應關系:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2EjN5UjMzETM0AjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
對pod的影響
如果pod Spec之dnsPolicy設定為”Default”或者”Node”,則使用者自定義存根伺服器與上遊伺服器對pod沒有影響。當值為”Default”時,pod之DNS配置完全從節點繼承。如果為Node,則取決于pod Spec中的dnsConfig配置。
當dnsPolicy設定為”ClusterFirst”時,pod的DNS配置分成沒無自定義存根域與上遊伺服器、有自定義存根域與上遊伺服器兩種情況。
無自定義存根域與上遊伺服器:如果查詢請求之域名字首與叢集預設域名比對,則使用kubernetes内置DNS服務,如果不比對則使用從節點繼承之DNS服務。
有自定義存根域與上遊伺服器,域名解析流程如下:
1、請求首先發送到kube-dns緩存層。
2、在緩存層,檢查請求的域名字首并将請求轉發到與之比對的DNS伺服器,流程如下:
- 與叢集域名字首比對,如“.cluster.local”,則發往kube-dns。
- 如與存根域比對,如“.acme.local”, 則發往比對的存根域伺服器。
- 否則,發往上遊伺服器。 ConfigMap選項
Kubernetes之配置與自定義DNS服務介紹從節點繼承DNS配置配置存根域及上遊DNS伺服器對pod的影響 Kubernetes之配置與自定義DNS服務介紹從節點繼承DNS配置配置存根域及上遊DNS伺服器對pod的影響 配置CoreDNS
從1.9版本開始,CoreDNS成為GA可選特性,将來可能會取代kube-dns成為預設叢集預設DNS解決方案,CoreDNS具備kube-dns所有功能并更強大。在CoreDNS插件内部通過一種Corefile檔案管理配置。可以直接将為kube-dns設定的ConfigMap直接指定給CoreDNS,CoreDNS自動将此ConfigMap轉換成Corefile。示例如下:
apiVersion: v1
data:
federations: |
{"foo" : "foo.feddomain.com"}
stubDomains: |
{"abc.com" : ["1.2.3.4"], "my.cluster.local" : ["2.3.4.5"]}
upstreamNameservers: |
["8.8.8.8", "8.8.4.4"]
kind: ConfigMap
轉換結果:
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
upstream 8.8.8.8 8.8.4.4
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
federation cluster.local {
foo foo.feddomain.com
}
prometheus :9153
proxy . 8.8.8.8 8.8.4.4
cache 30
}
abc.com:53 {
errors
cache 30
proxy . 1.2.3.4
}
my.cluster.local:53 {
errors
cache 30
proxy . 2.3.4.5
}
原文出處:csdn -> https://blog.csdn.net/dkfajsldfsdfsd/article/details/81218480