Kubernetes的Pod也跟一般機器一樣,都需要一套DNS查詢機制去解析出網路域名背後的IP來確定服務目的地。通常Kubernetes 的Pod有兩種DNS Policy,一種是Default Policy,Pod直接繼承Node節點的DNS設定(/etc/resolv.conf);而另一個是ClusterFirst Policy,目前Kubernetes都給Pod預設DNS Policy為ClusterFirst,其查詢原理如下:
基本上可以理解成當Pod不走Node的DNS查詢機制時(default dns policy),便會把欲查詢IP的域名(host domain name)往 kubernetes DNS cache作查詢,這裡通常是放Kubernetes內被查詢過暫存在此DNS Cache內的DNS Record,如果有就把Domain Name IP丟回給Pod,Cache沒有要被查詢的DNS Record的話會根據被查詢的主域名(Domain Name)是什麼來決定去哪做DNS查詢。
首先如果Domain Name如果是 以cluster.local 結尾的主機,將透過KubeDNS來查詢域名IP,而另外一種Kubernetes自定義的DNS存根域名(Stub Domain),例如我們在Kubernetes中自定義了域名為out-of.kubernetes的服務,那麼只要是域名為***.out-of.kubernetes的DNS查詢都會被送到IP為 10.126.32.15的IP機器去作DNS query,當然這個IP也是我們在ConfigMap for kube-dns的yaml配置檔中所指定的。
而如果欲查詢的domain name均不屬於kubeDNS與Stub Domain,那就是由上游DNS server來幫忙查詢IP,例如你的pod要查詢的DNS 為 www.yahoo.com.tw,將會被送到8.8.8.8/8.8.4.4的上游DNS Server來做查詢,當然這也會是我們在ConfigMap for kube-dns的yaml檔中設定。
以下是ConfigMap for kube-dns設定的yaml 範本:
apiVersion: v1 kind: ConfigMap metadata: name: kube-dns namespace: kube-system data: stubdomains: | {"out-of.kubernetes": ["10.126.32.15"]} upstreamNameservers: | ["8.8.8.8","8.8.4.4"] |
大致說明一下
- kind: ConfigMap 是說這yaml檔是用來產生ConfigMap物件的。
- name:kube-dns 是說這個ConfigMap物件名稱為kube-dns。
- namespace:kube-system 這個configMap物件建立在kube-system命名空間。
- stubdomains 指出凡是***.out-of.kubernetes的domain的服務都必須交由10.126.32.15 自定義存根域dns server作解析。
- upstreamNameservers 則指出不是cluster.local及out-of.kubernetes的服務全部交由IP為8.8.8.8/8.8.4.4的上游DNS Server解析IP。
2019年12月11日星期三