kubernetes_CoreDNS全解析
kubernetes CoreDNS 是 kube-system 命令空間里面的一個Pod,用于域名解析。
(相關資料圖)
kubernetes自帶三個命名空間(用kubeadm安裝的Kubernetes集群):default kube-public kube-system前兩個不重要,kube-system命名空間很重要,靜態(tài)Pod都在這個命名空間里面。
二、調(diào)用流程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 的問題。
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 記錄的順序。
3.3 讓container同時內(nèi)網(wǎng)和外網(wǎng)(通過 forward 屬性配置上游域名解析服務器來實現(xiàn))參考資料(Corefile 各自字段什么意思):https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/dns-custom-nameservers/
讓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全解析,完成了。
相關閱讀
-
世界熱推薦:今晚7:00直播丨下一個突破...
今晚19:00,Cocos視頻號直播馬上點擊【預約】啦↓↓↓在運營了三年... -
NFT周刊|Magic Eden宣布支持Polygon網(wǎng)...
Block-986在NFT這樣的市場,每周都會有相當多項目起起伏伏。在過去... -
環(huán)球今亮點!頭條觀察 | DeFi的興衰與...
在比特幣得到機構(gòu)關注之后,許多財務專家預測世界將因為加密貨幣的... -
重新審視合作,體育Crypto的可靠關系才能雙贏
Block-987即使在體育Crypto領域,人們的目光仍然集中在FTX上。隨著... -
簡訊:前端單元測試,更進一步
前端測試@2022如果從2014年Jest的第一個版本發(fā)布開始計算,前端開發(fā)... -
焦點熱訊:劉強東這波操作秀
近日,劉強東發(fā)布京東全員信,信中提到:自2023年1月1日起,逐步為...