Kubernetes 自定義DNS服務(wù)

2022-06-08 11:14 更新

自定義 DNS 服務(wù)

本頁(yè)說明如何配置 DNS Pod(s),以及定制集群中 DNS 解析過程。

在開始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

您的 Kubernetes 服務(wù)器必須為 v1.12 或更高版本。 要檢查版本,請(qǐng)輸入 ?kubectl version?。

你的集群必須運(yùn)行 CoreDNS 插件。 文檔遷移到 CoreDNS 解釋了如何使用 ?kubeadm ?從 ?kube-dns? 遷移到 CoreDNS。

介紹

DNS 是使用集群插件 管理器自動(dòng)啟動(dòng)的內(nèi)置的 Kubernetes 服務(wù)。

從 Kubernetes v1.12 開始,CoreDNS 是推薦的 DNS 服務(wù)器,取代了 kube-dns。 如果 你的集群原來使用 kube-dns,你可能部署的仍然是 ?kube-dns? 而不是 CoreDNS。

Note: CoreDNS 服務(wù)在其 ?metadata.name? 字段被命名為 ?kube-dns?。 這是為了能夠與依靠傳統(tǒng) ?kube-dns? 服務(wù)名稱來解析集群內(nèi)部地址的工作負(fù)載具有更好的互操作性。 使用 ?kube-dns? 作為服務(wù)名稱可以抽離共有名稱之后運(yùn)行的是哪個(gè) DNS 提供程序這一實(shí)現(xiàn)細(xì)節(jié)。

如果你在使用 Deployment 運(yùn)行 CoreDNS,則該 Deployment 通常會(huì)向外暴露為一個(gè)具有 靜態(tài) IP 地址 Kubernetes 服務(wù)。 kubelet 使用 ?--cluster-dns=<DNS 服務(wù) IP>? 標(biāo)志將 DNS 解析器的信息傳遞給每個(gè)容器。

DNS 名稱也需要域名。 你可在 kubelet 中使用 ?--cluster-domain=<默認(rèn)本地域名>? 標(biāo)志配置本地域名。

DNS 服務(wù)器支持正向查找(A 和 AAAA 記錄)、端口發(fā)現(xiàn)(SRV 記錄)、反向 IP 地址發(fā)現(xiàn)(PTR 記錄)等。

如果 Pod 的 ?dnsPolicy ?設(shè)置為 "?default?",則它將從 Pod 運(yùn)行所在節(jié)點(diǎn)繼承名稱解析配置。 Pod 的 DNS 解析行為應(yīng)該與節(jié)點(diǎn)相同。

如果你不想這樣做,或者想要為 Pod 使用其他 DNS 配置,則可以 使用 kubelet 的 ?--resolv-conf? 標(biāo)志。 將此標(biāo)志設(shè)置為 "" 可以避免 Pod 繼承 DNS。 將其設(shè)置為有別于 ?/etc/resolv.conf? 的有效文件路徑可以設(shè)定 DNS 繼承不同的配置。

CoreDNS

CoreDNS 是通用的權(quán)威 DNS 服務(wù)器,可以用作集群 DNS,符合 DNS 規(guī)范。

CoreDNS ConfigMap 選項(xiàng) 

CoreDNS 是模塊化且可插拔的 DNS 服務(wù)器,每個(gè)插件都為 CoreDNS 添加了新功能。 可以通過維護(hù) Corefile,即 CoreDNS 配置文件, 來定制其行為。 集群管理員可以修改 CoreDNS Corefile 的 ConfigMap,以更改服務(wù)發(fā)現(xiàn)的工作方式。

在 Kubernetes 中,CoreDNS 安裝時(shí)使用如下默認(rèn) Corefile 配置。

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health {
            lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }    

Corefile 配置包括以下 CoreDNS 插件

  • errors:錯(cuò)誤記錄到標(biāo)準(zhǔn)輸出。
  • health:在 http://localhost:8080/health 處提供 CoreDNS 的健康報(bào)告。
  • ready:在端口 8181 上提供的一個(gè) HTTP 末端,當(dāng)所有能夠 表達(dá)自身就緒的插件都已就緒時(shí),在此末端返回 200 OK。
  • kubernetes:CoreDNS 將基于 Kubernetes 的服務(wù)和 Pod 的 IP 答復(fù) DNS 查詢。你可以在 CoreDNS 網(wǎng)站閱讀更多細(xì)節(jié)。 你可以使用 ?ttl ?來定制響應(yīng)的 TTL。默認(rèn)值是 5 秒鐘。TTL 的最小值可以是 0 秒鐘, 最大值為 3600 秒。將 TTL 設(shè)置為 0 可以禁止對(duì) DNS 記錄進(jìn)行緩存。
  • ?pods insecure? 選項(xiàng)是為了與 kube-dns 向后兼容。你可以使用 ?pods verified? 選項(xiàng),該選項(xiàng)使得 僅在相同名稱空間中存在具有匹配 IP 的 Pod 時(shí)才返回 A 記錄。如果你不使用 Pod 記錄,則可以使用 ?pods disabled? 選項(xiàng)。

  • prometheus:CoreDNS 的度量指標(biāo)值以 Prometheus 格式在 http://localhost:9153/metrics 上提供。
  • forward: 不在 Kubernetes 集群域內(nèi)的任何查詢都將轉(zhuǎn)發(fā)到 預(yù)定義的解析器 (/etc/resolv.conf).
  • cache:?jiǎn)⒂们岸司彺妗?/li>
  • loop:檢測(cè)到簡(jiǎn)單的轉(zhuǎn)發(fā)環(huán),如果發(fā)現(xiàn)死循環(huán),則中止 CoreDNS 進(jìn)程。
  • reload:允許自動(dòng)重新加載已更改的 Corefile。 編輯 ConfigMap 配置后,請(qǐng)等待兩分鐘,以使更改生效。
  • loadbalance:這是一個(gè)輪轉(zhuǎn)式 DNS 負(fù)載均衡器, 它在應(yīng)答中隨機(jī)分配 A、AAAA 和 MX 記錄的順序。

你可以通過修改 ConfigMap 來更改默認(rèn)的 CoreDNS 行為。

使用 CoreDNS 配置存根域和上游域名服務(wù)器

CoreDNS 能夠使用 forward 插件配置存根域和上游域名服務(wù)器。

示例

如果集群操作員在 10.150.0.1 處運(yùn)行了 Consul 域服務(wù)器, 且所有 Consul 名稱都帶有后綴 ?.consul.local?。要在 CoreDNS 中對(duì)其進(jìn)行配置, 集群管理員可以在 CoreDNS 的 ConfigMap 中創(chuàng)建加入以下字段。

consul.local:53 {
        errors
        cache 30
        forward . 10.150.0.1
    }

要顯式強(qiáng)制所有非集群 DNS 查找通過特定的域名服務(wù)器(位于 172.16.0.1),可將 ?forward ?指向該域名服務(wù)器,而不是 ?/etc/resolv.conf?。

forward .  172.16.0.1

最終的包含默認(rèn)的 ?Corefile ?配置的 ConfigMap 如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 172.16.0.1
        cache 30
        loop
        reload
        loadbalance
    }
    consul.local:53 {
        errors
        cache 30
        forward . 10.150.0.1
    } 

工具 ?kubeadm ?支持將 kube-dns ConfigMap 自動(dòng)轉(zhuǎn)換為 CoreDNS ConfigMap。

Note: 盡管 kube-dns 接受 FQDN(例如:ns.foo.com)作為存根域和名字服務(wù)器,CoreDNS 不支持此功能。 轉(zhuǎn)換期間,CoreDNS 配置中將忽略所有的 FQDN 域名服務(wù)器。

CoreDNS 配置等同于 kube-dns

CoreDNS 不僅僅提供 kube-dns 的功能。 為 kube-dns 創(chuàng)建的 ConfigMap 支持 ?StubDomains ?和 ?upstreamNameservers ?轉(zhuǎn)換為 CoreDNS 中的 ?forward ?插件。

示例

用于 kubedns 的此示例 ConfigMap 描述了 stubdomains 和 upstreamnameservers:

apiVersion: v1
data:
  stubDomains: |
        {"abc.com" : ["1.2.3.4"], "my.cluster.local" : ["2.3.4.5"]}
  upstreamNameservers: |
        ["8.8.8.8", "8.8.4.4"]
kind: ConfigMap

CoreDNS 中的等效配置將創(chuàng)建一個(gè) Corefile:

  • 針對(duì) stubDomains:
  • abc.com:53 {
         errors
         cache 30
         proxy . 1.2.3.4
     }
     my.cluster.local:53 {
         errors
         cache 30
         proxy . 2.3.4.5
     }

帶有默認(rèn)插件的完整 Corefile:

.:53 {
    errors
    health
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure
       fallthrough in-addr.arpa ip6.arpa
    }
    federation cluster.local {
       foo foo.feddomain.com
    }
    prometheus :9153
    forward .  8.8.8.8 8.8.4.4
    cache 30
}
abc.com:53 {
    errors
    cache 30
    forward . 1.2.3.4
}
my.cluster.local:53 {
    errors
    cache 30
    forward . 2.3.4.5
}

遷移到 CoreDNS

要從 kube-dns 遷移到 CoreDNS,此博客 提供了幫助用戶將 kube-dns 替換為 CoreDNS。 集群管理員還可以使用部署腳本 進(jìn)行遷移。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)