本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

在 Kubernetes 中配置私有 DNS 區域和上游名稱伺服器

編輯註:這篇文章是 Kubernetes 1.6 新功能系列深入文章 的一部分

許多使用者都有現有的網域名稱區域,他們希望將其整合到其 Kubernetes DNS 命名空間中。例如,混合雲使用者可能希望在叢集內解析其內部「.corp」網域地址。其他使用者可能有一個由非 Kubernetes 服務發現系統(如 Consul)填充的區域。我們很高興地宣布,在 Kubernetes 1.6 中,kube-dns 新增了對可配置的私有 DNS 區域(通常稱為「stub domains」)和外部上游 DNS 名稱伺服器的支援。在這篇博文中,我們將描述如何配置和使用此功能。

預設查找流程

Kubernetes 目前支援兩種 DNS 政策,這些政策使用 dnsPolicy 標誌在每個 Pod 的基礎上指定:「Default」和「ClusterFirst」。如果未明確指定 dnsPolicy,則使用「ClusterFirst」

  • 如果 dnsPolicy 設定為「Default」,則名稱解析配置繼承自 Pod 運行的節點。注意:此功能不能與 dnsPolicy:「Default」結合使用。
  • 如果 dnsPolicy 設定為「ClusterFirst」,則 DNS 查詢將傳送到 kube-dns 服務。對於根植於已配置叢集網域後綴的網域的查詢(在上面的範例中,任何以「.cluster.local」結尾的地址)將由 kube-dns 服務回答。所有其他查詢(例如,www.kubernetes.io)將轉發到從節點繼承的上游名稱伺服器。在此功能之前,通常透過將上游 DNS 替換為自訂解析器來引入 stub domains。但是,這導致自訂解析器本身成為 DNS 解析的關鍵路徑,其中可擴展性和可用性問題可能導致叢集失去 DNS 功能。此功能允許使用者引入自訂解析,而無需接管整個解析路徑。

自訂 DNS 流程

從 Kubernetes 1.6 開始,叢集管理員可以透過為 kube-dns 提供 ConfigMap 來指定自訂 stub domains 和上游名稱伺服器。例如,以下配置插入單個 stub domain 和兩個上游名稱伺服器。如指定,具有「.acme.local」後綴的 DNS 請求將轉發到在 1.2.3.4 偵聽的 DNS。此外,Google Public 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。具有 stub domain 後綴的名稱(例如;「.acme.local」)將傳送到已配置的自訂解析器。最後,與任何這些後綴都不匹配的請求將轉發到上游 DNS。

以下是範例網域名稱表以及這些網域名稱的查詢目的地

網域名稱回答查詢的伺服器
kubernetes.default.svc.cluster.localkube-dns
foo.acme.local自訂 DNS (1.2.3.4)
widget.com上游 DNS (8.8.8.8、8.8.4.4 之一)

ConfigMap 配置注意事項

  • stubDomains (可選)

    • 格式:使用 DNS 後綴鍵(例如;「acme.local」)和由 DNS IP 的 JSON 陣列組成的值的 JSON 地圖。
    • 注意:目標名稱伺服器本身可以是 Kubernetes 服務。例如,您可以運行自己的 dnsmasq 副本,以將自訂 DNS 名稱匯出到 ClusterDNS 命名空間中。
  • upstreamNameservers (可選)

    • 格式:DNS IP 的 JSON 陣列。
    • 注意:如果指定,則指定的值將替換預設從節點的 /etc/resolv.conf 中取得的名稱伺服器
    • 限制:最多可以指定三個上游名稱伺服器

範例 #1:新增 Consul DNS Stub Domain

在本範例中,使用者具有 Consul DNS 服務發現系統,他們希望與 kube-dns 整合。consul 網域伺服器位於 10.150.0.1,並且所有 consul 名稱都具有後綴「.consul.local」。若要配置 Kubernetes,叢集管理員只需創建一個 ConfigMap 物件,如下所示。注意:在本範例中,叢集管理員不希望覆蓋節點的上游名稱伺服器,因此他們不需要指定可選的 upstreamNameservers 欄位。

apiVersion: v1

kind: ConfigMap

metadata:

  name: kube-dns

  namespace: kube-system

data:

  stubDomains: |

    {“consul.local”: [“10.150.0.1”]}

範例 #2:替換上游名稱伺服器

在本範例中,叢集管理員希望明確強制所有非叢集 DNS 查找都通過其自己的名稱伺服器 172.16.0.1。同樣,這很容易實現;他們只需要創建一個 ConfigMap,其中 upstreamNameservers 欄位指定所需的名稱伺服器。

apiVersion: v1

kind: ConfigMap

metadata:

  name: kube-dns

  namespace: kube-system

data:

  upstreamNameservers: |

    [“172.16.0.1”]




**Get involved**  

If you’d like to contribute or simply help provide feedback and drive the roadmap, [join our community](https://github.com/kubernetes/community#kubernetes-community). Specifically for network related conversations participate though one of these channels:  

- Chat with us on the Kubernetes [Slack network channel](https://kubernetes.slack.com/messages/sig-network/)
- Join our Special Interest Group, [SIG-Network](https://github.com/kubernetes/community/wiki/SIG-Network), which meets on Tuesdays at 14:00 PT
Thanks for your support and contributions. Read more in-depth posts on what's new in Kubernetes 1.6 [here](https://kubernetes.dev.org.tw/blog/2017/03/five-days-of-kubernetes-1-6).


- Post questions (or answer questions) on [Stack Overflow](http://stackoverflow.com/questions/tagged/kubernetes)
- Join the community portal for advocates on [K8sPort](http://k8sport.org/)
- Get involved with the Kubernetes project on [GitHub](https://github.com/kubernetes/kubernetes)
- Follow us on Twitter [@Kubernetesio](https://twitter.com/kubernetesio) for latest updates
- Connect with the community on [Slack](http://slack.k8s.io/)
- [Download](http://get.k8s.io/) Kubernetes