Kubernetes1.6中配置私有 DNS 區域以及上級域名服務

很多用戶都有自己的域名區域,並且希望能夠集成到 Kubernetes DNS 的命名空間去。例如混合雲用戶可能希望能在集羣內解析他們內部的 “.corp” 。其他用戶用戶可能有一個受非 Kubernetes 管理的服務發現系統(例如 Consul)。我們在 Kubernetes 1.6 中推出了新功能,可配置私有 DNS 區域(通常稱爲存根域)以及外部的上級域名服務,本文將會講解如何使用這一功能。

Kubernetes 目前在 Pod 定義中支持兩個 DNS 策略:DefaultClusterFirstdnsPolicy缺省爲ClusterFirst

  • 如果dnsPolicy設置爲Default,那麼域名解析配置會從 Pod 所在節點繼承而來。注意,本文所述功能在dnsPolicy設置爲Default時無效。
  • 如果dnsPolicy設置爲ClusterFirst,DNS 查詢會被髮送到 kube-dns 服務。kube-dns 服務負責相應以集羣域名爲後綴(例如.cluster.local)的查詢。其他的域名查詢(例如 www.kubernetes.io )會被轉發給來自節點定義的上級域名服務器。

在這一功能推出之前,通常需要利用替換上級 DNS 爲自定義解析的方式來完成存根域查詢。然而這就使得這個自定義域名解析器成爲 DNS 解析過程中的一個高風險因素。本功能讓用戶能夠無需對整個 DNS 路徑進行改造就完成自定義解析過程。

自定義 DNS 流程

從 Kubernetes 1.6 開始,集羣管理員能夠利用 ConfigMap 指定自定義的存根域以及上級 NameServer。下文的配置包含一個存根域和兩個上級域名服務器。對域名後綴爲.aceme.local的查詢會被髮送到地址爲 1.2.3.4 的 DNS 服務。另外會把 Google 公共 DNS 作爲上級服務器。注意本節末尾對 ConfigMap 中的數據格式進行的解釋。

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"]

下圖顯示了配置中所指示的 DNS 查詢過程。當dnsPolicy設置爲ClusterFirst時,DNS 查詢首先被髮送到 kube-dns 的 DNS 緩存層。從這裏開始檢查域名後綴,然後發送到指定的 DNS。在本例中,集羣后綴的域名(.cluster.local),被髮送到 kube-dns,最後不符合上面後綴的其他查詢被轉發到上級 DNS 去進行解析。

下文表格用來說明域名解析的過程:

域名 解析服務
kubernetes.default.svc.cluster.local kube-dns
foo.acme.local 自定義 DNS(1.2.3.4)
widget.com 上級 DNS(8.8.8.8 和 8.8.4.4)中的一個

ConfigMap 配置說明

  • stubDomains (可選)
    • 格式:一個 JSON 編碼的 Map 格式,其 Key 爲 DNS 後綴(也就是acme.local),值是一個 JSON 數組,代表一組 DNS IP。
    • 注意:目標域名服務器也可以是 Kuernetes 服務。例如可以用 dnsmasq 把自定義 DNS 導出到 ClusterDNS 的命名空間中。
  • upstreamNameservers
    • 格式:一個 DNS IP 組成的 JSON 數組。
    • 注意:如果指定了這個值,那麼從節點的 /etc/resolv.conf 繼承過來的值就會被覆蓋。
    • 限制:最多可以指定三個。

例 1:添加一個 Consul DNS 存根域

這個例子中,用戶希望把 Consul DNS 服務集成到 kube-dns。Consul 服務位於10.150.0.1,所有的 consul 命名後綴都是.consul.local。Kubernetes 管理員簡單的創建一個ConfigMap對象就可以完成。注意:本例中管理員不想覆蓋節點的上級 DNS 定義,所以不需要指定upstreamNameservers

apiVersion: v1
kind: ConfigMap
metadata:
 name: kube-dns
 namespace: kube-system
data:
 stubDomains: | {"consul.local": "10.150.0.1"}

例 2:替換上級 Nameserver

這個例子中,集羣管理員希望所有的集羣外 DNS 查詢由172.16.0.1的服務來完成,同樣的用一個 ConfigMap 完成:

apiVersion: v1
kind: ConfigMap
metadata:
 name: kube-dns
 namespace: kube-system
data:
 upstreamNameservers: | ["172.16.0.1"]
本文轉自中文社區-Kubernetes1.6中配置私有 DNS 區域以及上級域名服務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章