一、前言
kubernetes CoreDNS 是 kube-system 命令空間里面的一個(gè)Pod,用于域名解析。
kubernetes自帶三個(gè)命名空間(用kubeadm安裝的Kubernetes集群):
default kube-public kube-system
前兩個(gè)不重要,kube-system命名空間很重要,靜態(tài)Pod都在這個(gè)命名空間里面。
kube-system中,與網(wǎng)絡(luò)相關(guān)的三個(gè)Pod
kube-proxy:解決service負(fù)載均衡到具體的哪個(gè)Pod
calico:解決的是node1與node2之間(不同節(jié)點(diǎn)之間)網(wǎng)絡(luò)通不通的問題。
驗(yàn)證1:kubectl get pod -n kube-system 查看calico是否正常運(yùn)行Running(如果不是Running,要么是calico綁定錯(cuò)誤本地網(wǎng)卡(那個(gè)機(jī)器錯(cuò)誤就到哪個(gè)機(jī)器上修改),要么是云服務(wù)沒有打開對應(yīng)的入規(guī)則和出規(guī)則);
驗(yàn)證2:在node1 ping 另一個(gè)節(jié)點(diǎn)node2 上 serviceName.namespace ,驗(yàn)證通不通。
CoreDNS:解決的是 ping 內(nèi)網(wǎng)ip 可以通,ping serviceName.namespace 不通,報(bào)錯(cuò)為 name server unknown;ping 外網(wǎng)ip 可以通,ping 外網(wǎng)域名 不通的問題,報(bào)錯(cuò)為 name server unknown。解決的是將 域名解析為ip 的問題。
二、調(diào)用流程
pod - service - deployment - replicaset - 兩個(gè)pod - configmap - linux




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


小結(jié):調(diào)用流程
pod - service - deployment - replicaset - 兩個(gè)pod - configmap - linux
所有命令:
kubectl get pod -n kube-system -o wide
kubectl exec -it nginx bash
cat /etc/resolv.conf
kubectl get all -o wide -A | grep 10.96.0.10
kubectl get all -o wide -A | grep kube-dns
kubectl get all -o wide -A | grep coredns
kubectl get deployment coredns -o yaml -n kube-system
kubectl get configmap coredns -o yaml -n kube-system
三、CoreDNS
3.1 dnsPolicy的四個(gè)屬性
Kubernetes 中 Pod 的 DNS 策略有四種類型,yaml 文件中通過 dnsPolicy 和 dnsConfig 兩個(gè)屬性來指定 Pod 的dns方式。
1.Default:Pod 繼承所在主機(jī)上的 DNS 配置;
2.ClusterFirst:K8s 的默認(rèn)設(shè)置;先在 K8s 集群配置的 coreDNS 中查詢,查不到的再去繼承自主機(jī)的上游 nameserver 中查詢(就是通過 configmap 里面的 forward 屬性來指定上游服務(wù)器);
3.ClusterFirstWithHostNet:對于網(wǎng)絡(luò)配置為 hostNetwork 的 Pod 而言,其 DNS 配置規(guī)則與 ClusterFirst 一致;
4.None:忽略 K8s 環(huán)境的 DNS 配置,只認(rèn) Pod 的 dnsConfig 設(shè)置。(當(dāng) dnsPolicy 指定為 none,dnsConfig 屬性必須配置)
默認(rèn)是 ClusterFirst ,表示 ping serviceName.namespace 可以,ping 外網(wǎng)域名 報(bào)錯(cuò) name server unknown。
設(shè)置為 Default 表示 繼承所在主機(jī)上的 DNS 配置,但是 ping serviceName.namespace 報(bào)錯(cuò) name server unknown。
3.2 Corefile 各自字段什么意思
53 表示的 kube-dns Service 服務(wù)的端口,其他的如下:
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 可以禁止對 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:啟用前端緩存。
loop:檢測到簡單的轉(zhuǎn)發(fā)環(huán),如果發(fā)現(xiàn)死循環(huán),則中止 CoreDNS 進(jìn)程。
reload:允許自動(dòng)重新加載已更改的 Corefile。 編輯 ConfigMap 配置后,請等待兩分鐘,以使更改生效。
loadbalance:這是一個(gè)輪轉(zhuǎn)式 DNS 負(fù)載均衡器, 它在應(yīng)答中隨機(jī)分配 A、AAAA 和 MX 記錄的順序。
參考資料(Corefile 各自字段什么意思):https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/dns-custom-nameservers/
3.3 讓container同時(shí)內(nèi)網(wǎng)和外網(wǎng)(通過 forward 屬性配置上游域名解析服務(wù)器來實(shí)現(xiàn))
讓container同時(shí)內(nèi)網(wǎng)和外網(wǎng),通過 forward 屬性配置上游域名解析服務(wù)器來實(shí)現(xiàn)
[root@w1 ~]# kubectl get configmap coredns -o yaml -n kube-system
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
# 這里表示將使用本機(jī)linux的域名解析,可以配置為ip,表示其他的機(jī)器
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
metadata:
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 或者不指定,因?yàn)槟J(rèn)就是 ClusterFirst,只需要修改 configmap 里面的 forward . /etc/resolv.conf 配置上上游的域名解析服務(wù)器為本地。
查看本機(jī)使用的域名解析服務(wù)器

cat /etc/resolv.conf
nameserver 表示域名解析器
3.4 CoreDNS 配置等同于 kube-dns
在 Kubernetes 1.21 版本中,kubeadm 移除了對將 kube-dns 作為 DNS 應(yīng)用的支持。 對于 kubeadm v1.24,所支持的唯一的集群 DNS 應(yīng)用是 CoreDNS。
參考資料:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/coredns/
四、尾聲
最好的關(guān)于kubernetes的dns方案是:使用默認(rèn)的 ClusterFirst 可以 ping serviceName.namespace ,然后加上 forward . /etc/resolv.conf 就可以 ping 外網(wǎng)域名。
kubernetes CoreDNS全解析,完成了。