Kubernetes1.6中配置私有 DNS 區域以及上級域名服務_Kubernetes中文社群
很多使用者都有自己的域名區域,並且希望能夠整合到 Kubernetes DNS 的名稱空間去。例如混合雲使用者可能希望能在叢集內解析他們內部的 “.corp” 。其他使用者使用者可能有一個受非 Kubernetes 管理的服務發現系統(例如 Consul)。我們在 Kubernetes 1.6 中推出了新功能,可配置私有 DNS 區域(通常稱為存根域)以及外部的上級域名服務,本文將會講解如何使用這一功能。
Kubernetes 目前在 Pod 定義中支援兩個 DNS 策略:Default
和ClusterFirst
,dnsPolicy
預設為ClusterFirst
:
- 如果
dnsPolicy
設定為Default
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 的名稱空間中。
- 格式:一個 JSON 編碼的 Map 格式,其 Key 為 DNS 字尾(也就是
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"]