自定義 DNS 流程
從 Kubernetes 1.6 開始,叢集管理者能夠利用 ConfigMap 指定自定義的存根域以及上級 NameServer。下文的配置包含一個存根域和兩個上級域名伺服器。對域名字尾為.my.io的查詢會被發送到位址為 10.100.100.14 的 DNS 服務。另外會把 Google 公共 DNS 作為上級伺服器。注意本節末尾對 ConfigMap 中的資料格式進行的解釋。
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{"my.io": ["10.100.100.14"]}
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 |
my.io | 自定義 DNS(10.100.100.14) |
widget.com | 上級 DNS(8.8.8.8 和 8.8.4.4)中的一個 |
ConfigMap 配置說明
stubDomains (可選)
格式:一個 JSON 編碼的 Map 格式,其 Key 為 DNS 字尾(也就是my.io),值是一個 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: |
{"my.io": "10.100.100.14"}
例 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"]