您的位置:首頁 >聚焦 >

kubernetes_CoreDNS全解析

2022-11-21 15:33:29    來源:程序員客棧
一、前言

kubernetes CoreDNS 是 kube-system 命令空間里面的一個Pod,用于域名解析。


(相關資料圖)

kubernetes自帶三個命名空間(用kubeadm安裝的Kubernetes集群):default kube-public kube-system前兩個不重要,kube-system命名空間很重要,靜態(tài)Pod都在這個命名空間里面。

kube-system中,與網(wǎng)絡相關的三個Podkube-proxy:解決service負載均衡到具體的哪個Podcalico:解決的是node1與node2之間(不同節(jié)點之間)網(wǎng)絡通不通的問題。驗證1:kubectl get pod -n kube-system 查看calico是否正常運行Running(如果不是Running,要么是calico綁定錯誤本地網(wǎng)卡(那個機器錯誤就到哪個機器上修改),要么是云服務沒有打開對應的入規(guī)則和出規(guī)則);驗證2:在node1 ping 另一個節(jié)點node2 上 serviceName.namespace ,驗證通不通。CoreDNS:解決的是 ping 內(nèi)網(wǎng)ip 可以通,ping serviceName.namespace 不通,報錯為 name server unknown;ping 外網(wǎng)ip 可以通,ping 外網(wǎng)域名 不通的問題,報錯為 name server unknown。解決的是將 域名解析為ip 的問題。

二、調(diào)用流程

pod - service - deployment - replicaset - 兩個pod - configmap - linux

kubectl get deployment coredns -o yaml -n kube-system

小結(jié):調(diào)用流程

pod - service - deployment - replicaset - 兩個pod - configmap - linux

所有命令:kubectl get pod -n kube-system -o widekubectl exec -it nginx bashcat /etc/resolv.conf kubectl get all -o wide -A | grep 10.96.0.10kubectl get all -o wide -A | grep kube-dnskubectl get all -o wide -A | grep corednskubectl get deployment coredns -o yaml -n kube-systemkubectl get configmap coredns -o yaml -n kube-system

三、CoreDNS3.1 dnsPolicy的四個屬性

Kubernetes 中 Pod 的 DNS 策略有四種類型,yaml 文件中通過 dnsPolicy 和 dnsConfig 兩個屬性來指定 Pod 的dns方式。

1.Default:Pod 繼承所在主機上的 DNS 配置;

2.ClusterFirst:K8s 的默認設置;先在 K8s 集群配置的 coreDNS 中查詢,查不到的再去繼承自主機的上游 nameserver 中查詢(就是通過 configmap 里面的 forward 屬性來指定上游服務器);

3.ClusterFirstWithHostNet:對于網(wǎng)絡配置為 hostNetwork 的 Pod 而言,其 DNS 配置規(guī)則與 ClusterFirst 一致;

4.None:忽略 K8s 環(huán)境的 DNS 配置,只認 Pod 的 dnsConfig 設置。(當 dnsPolicy 指定為 none,dnsConfig 屬性必須配置)

默認是 ClusterFirst ,表示 ping serviceName.namespace 可以,ping 外網(wǎng)域名 報錯 name server unknown。

設置為 Default 表示 繼承所在主機上的 DNS 配置,但是 ping serviceName.namespace 報錯 name server unknown。

3.2 Corefile 各自字段什么意思

53 表示的 kube-dns Service 服務的端口,其他的如下:

apiVersion: v1kind: ConfigMapmetadata:  name: coredns  namespace: kube-systemdata:  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:錯誤記錄到標準輸出。

health:在 http://localhost:8080/health 處提供 CoreDNS 的健康報告。

ready:在端口 8181 上提供的一個 HTTP 末端,當所有能夠 表達自身就緒的插件都已就緒時,在此末端返回 200 OK。

kubernetes:CoreDNS 將基于 Kubernetes 的服務和 Pod 的 IP 答復 DNS 查詢。你可以在 CoreDNS 網(wǎng)站閱讀更多細節(jié)。 你可以使用 ttl 來定制響應的 TTL。默認值是 5 秒鐘。TTL 的最小值可以是 0 秒鐘, 最大值為 3600 秒。將 TTL 設置為 0 可以禁止對 DNS 記錄進行緩存。

pods insecure 選項是為了與 kube-dns 向后兼容。你可以使用 pods verified 選項,該選項使得 僅在相同名稱空間中存在具有匹配 IP 的 Pod 時才返回 A 記錄。如果你不使用 Pod 記錄,則可以使用 pods disabled 選項。

prometheus:CoreDNS 的度量指標值以 Prometheus 格式在 http://localhost:9153/metrics 上提供。

forward: 不在 Kubernetes 集群域內(nèi)的任何查詢都將轉(zhuǎn)發(fā)到 預定義的解析器 (/etc/resolv.conf).

cache:啟用前端緩存。

loop:檢測到簡單的轉(zhuǎn)發(fā)環(huán),如果發(fā)現(xiàn)死循環(huán),則中止 CoreDNS 進程。

reload:允許自動重新加載已更改的 Corefile。 編輯 ConfigMap 配置后,請等待兩分鐘,以使更改生效。

loadbalance:這是一個輪轉(zhuǎn)式 DNS 負載均衡器, 它在應答中隨機分配 A、AAAA 和 MX 記錄的順序。

參考資料(Corefile 各自字段什么意思):https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/dns-custom-nameservers/

3.3 讓container同時內(nèi)網(wǎng)和外網(wǎng)(通過 forward 屬性配置上游域名解析服務器來實現(xiàn))

讓container同時內(nèi)網(wǎng)和外網(wǎng),通過 forward 屬性配置上游域名解析服務器來實現(xiàn)

[root@w1 ~]# kubectl get configmap coredns -o yaml -n kube-systemapiVersion: v1data:  Corefile: |    .:53 {        errors        health        kubernetes cluster.local in-addr.arpa ip6.arpa {           pods insecure           upstream           fallthrough in-addr.arpa ip6.arpa        }        prometheus :9153        # 這里表示將使用本機linux的域名解析,可以配置為ip,表示其他的機器        forward . /etc/resolv.conf          cache 30        loop        reload        loadbalance    }kind: ConfigMapmetadata:  creationTimestamp: "2022-07-28T16:05:03Z"  name: coredns  namespace: kube-system  resourceVersion: "200"  selfLink: /api/v1/namespaces/kube-system/configmaps/coredns  uid: 0a6711df-0e8f-11ed-a989-000c291867b4

yaml里面的指定 dnsPolicy 為 ClusterFirst 或者不指定,因為默認就是 ClusterFirst,只需要修改 configmap 里面的forward . /etc/resolv.conf配置上上游的域名解析服務器為本地。

查看本機使用的域名解析服務器

cat /etc/resolv.confnameserver 表示域名解析器

3.4 CoreDNS 配置等同于 kube-dns

在 Kubernetes 1.21 版本中,kubeadm 移除了對將 kube-dns 作為 DNS 應用的支持。 對于 kubeadm v1.24,所支持的唯一的集群 DNS 應用是 CoreDNS。

參考資料:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/coredns/

四、尾聲

最好的關于kubernetes的dns方案是:使用默認的 ClusterFirst 可以 ping serviceName.namespace ,然后加上 forward . /etc/resolv.conf 就可以 ping 外網(wǎng)域名。

kubernetes CoreDNS全解析,完成了。

關鍵詞: 域名解析 命名空間 參考資料

相關閱讀