抓包就明白CoreDNS域名解析
本文轉(zhuǎn)載自微信公眾號(hào)「運(yùn)維開發(fā)故事」,作者allen_jol 。轉(zhuǎn)載本文請(qǐng)聯(lián)系運(yùn)維開發(fā)故事公眾號(hào)。
DNS 其實(shí)就是一個(gè)分布式的樹狀命名系統(tǒng),它就像一個(gè)去中心化的分布式數(shù)據(jù)庫,存儲(chǔ)著從域名到 IP 地址的映射。k8s中利用CoreDNS進(jìn)行域名解析。
在進(jìn)行CoreDNS抓包之前先來了解幾個(gè)概念
完全限定名稱
完全限定域名(FQDN)就是互聯(lián)網(wǎng)上計(jì)算機(jī)或者主機(jī)的完整域名。由主機(jī)名、域名、頂級(jí)域組成。FQDN= HostName + DomainName
如:域名 www.ayunw.cn ,實(shí)際上它應(yīng)該是 www.ayunw.cn. ,而通常最后的點(diǎn)可以不寫。最后的點(diǎn)被稱為根域 www就是主機(jī)名,ayunw.cn就是域名,而.cn又被稱為頂級(jí)域(一級(jí)域名),ayunw被稱為二級(jí)域名,最后的點(diǎn)被稱為 根域。
如:www.allen.ayunw.cn. ,其中最后的點(diǎn)被稱為 根域(TLD),cn被稱為頂級(jí)域(一級(jí)域名),ayunw被稱為二級(jí)域名,allen被稱為三級(jí)域名,www被稱為主機(jī)名。
k8s中,非完全限定名稱比如:demo-hello.paas.svc.cluster.local
無類域間路由(CIDR)
如:192.168.1.0/24。想要更好的對(duì)CIDR了解的可以自行谷歌查詢?cè)斍?,這里不展開說。
這里,我自己有一個(gè)域名叫 www.ayunw.cn ,然后這里我嘗試用一個(gè) paas 名稱空間下的一個(gè)pod對(duì) www.ayunw.cn 做 nslookup 域名解析。并且對(duì)某一個(gè)coredns的pod進(jìn)行抓包分析。
為了測(cè)試,我這里用一個(gè)已經(jīng)發(fā)布好測(cè)試的容器。進(jìn)入容器,查看 /etc/resolv.conf 文件內(nèi)容
- root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# cat /etc/resolv.conf
- nameserver 10.10.0.2
- search paas.svc.cluster.local svc.cluster.local cluster.local
- options ndots:5
在該容器中安裝 nslookup 工具,然后對(duì) www.ayunw.cn 域名進(jìn)行解析
- [root@kube-master-srv1 ~]# kubectl get po -n paas
- NAME READY STATUS RESTARTS AGE
- demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw 1/1 Running 0 11d
- [root@kube-master-srv1 ~]# kubectl exec -it demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw -n paas -- bash
- root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# cat /etc/issue
- Debian GNU/Linux 10 \n \l
- root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# apt -y install dnsutils
接著找到某一個(gè)coredns,然后去他所調(diào)度到的node節(jié)點(diǎn)通過nsenter進(jìn)入網(wǎng)絡(luò)名稱空間進(jìn)行抓包分析
- # 在k8s-master上查看coredns調(diào)度在哪個(gè)node
- # 接著我就選擇了第一個(gè)coredns
- [root@kube-master-srv1 ~]# kubectl get po -n kube-system -o wide | grep coredns
- coredns-69d9b6c494-4nrxt 1/1 Running 0 96d 10.20.246.18 node2.core <none> <none>
- coredns-69d9b6c494-6vjw4 1/1 Running 0 96d 10.20.240.239 node3.core <none> <none>
- coredns-69d9b6c494-pw5gx 1/1 Running 0 96d 10.20.240.232 node3.core <none> <none>
- # 登錄到 node2.core 節(jié)點(diǎn),找到coredns的pid
- # 進(jìn)入這個(gè)pid進(jìn)入coredns容器的網(wǎng)絡(luò)名稱空間進(jìn)行抓包過濾分析
- [root@kube-node-srv2 ~]# docker ps -a | grep coredns
- 4d38fd311a78 bfe3a36ebd25 "/coredns -conf /etc…" 3 months ago Up 3 months k8s_coredns_coredns-69d9b6c494-4nrxt_kube-system_803290a5-b4bd-4f2e-81b3-5ce82c9aa57c_0
- 00722e50786b registry.xx.xx/library/k8s.gcr.io/pause:3.2 "/pause" 3 months ago Up 3 months k8s_POD_coredns-69d9b6c494-4nrxt_kube-system_803290a5-b4bd-4f2e-81b3-5ce82c9aa57c_0
- [root@kube-node-srv2 ~]# docker inspect -f {{.State.Pid}} 4d38fd311a78
- 896949
- [root@kube-node-srv2 ~]# nsenter -n -t 896949
- [root@kube-node-srv2 ~]# ifconfig
- eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1380
- inet 10.20.246.18 netmask 255.255.255.255 broadcast 10.20.246.18
- ether 46:c1:e0:30:b4:9d txqueuelen 0 (Ethernet)
- RX packets 1489941923 bytes 162419228606 (151.2 GiB)
- RX errors 0 dropped 0 overruns 0 frame 0
- TX packets 1488233127 bytes 297011464372 (276.6 GiB)
- TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
- inet 127.0.0.1 netmask 255.0.0.0
- loop txqueuelen 1000 (Local Loopback)
- RX packets 83731165 bytes 6681735331 (6.2 GiB)
- RX errors 0 dropped 0 overruns 0 frame 0
- TX packets 83731165 bytes 6681735331 (6.2 GiB)
- TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
解析k8s集群的內(nèi)部域名
這里說的集群內(nèi)部域名就是 service的名字。我這里用的是kubernetes這個(gè)service來測(cè)試 連續(xù)解析6次,為了方便查看,我每執(zhí)行一次解析,下面抓包的終端就敲一次回車。
- [root@kube-master-srv1 ~]# kubectl get svc kubernetes
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.10.0.1 <none> 443/TCP 57d
- root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup kubernetes.default
- Server: 10.10.0.2
- Address: 10.10.0.2#53
- Name: kubernetes.default.svc.cluster.local
- Address: 10.10.0.1
抓包分析
以下是抓取kubernetes這個(gè)域名的DNS包的結(jié)果
- [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "kubernetes"
- tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
- listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
- 16:44:42.712421 IP 10.20.105.252.60020 > qing-core-kube-node-srv2.domain: 7282+ A? kubernetes.default.svc.cluster.local. (54)
- 16:44:48.883881 IP 10.20.105.252.ndm-agent-port > qing-core-kube-node-srv2.domain: 25500+ AAAA? kubernetes.default.svc.cluster.local. (54)
- 16:50:15.361021 IP 10.20.105.252.57205 > qing-core-kube-node-srv2.domain: 24061+ A? kubernetes.default.paas.svc.cluster.local. (59)
- 16:50:22.186723 IP 10.20.105.252.60715 > qing-core-kube-node-srv2.domain: 55799+ AAAA? kubernetes.default.svc.cluster.local. (54)
- 16:50:27.813477 IP qing-core-kube-node-srv2.domain > 10.20.176.128.8181: 21787*- 1/0/0 PTR kubernetes.default.svc.cluster.local. (112)
- 16:46:04.429250 IP 10.20.105.252.33895 > qing-core-kube-node-srv2.domain: 37943+ A? kubernetes.default.svc.cluster.local.svc.cluster.local. (72)
- 16:46:04.441717 IP 10.20.105.252.54502 > qing-core-kube-node-srv2.domain: 45454+ AAAA? kubernetes.default.svc.cluster.local. (54)
- 16:46:10.771445 IP 10.20.105.252.54594 > qing-core-kube-node-srv2.domain: 16257+ A? kubernetes.default.svc.cluster.local.svc.cluster.local. (72)
- 16:46:10.783322 IP 10.20.105.252.59768 > qing-core-kube-node-srv2.domain: 60408+ AAAA? kubernetes.default.svc.cluster.local. (54)
通過以上抓包分析得出結(jié)論。當(dāng)解析kubernetes域名的時(shí)候,點(diǎn)的個(gè)數(shù)比ndots的值小,則按照search后面的本地域參數(shù)填補(bǔ)了域名后綴,當(dāng)按照順序 用 paas.svc.cluster.local 填補(bǔ)的時(shí)候解析到了A記錄。然后終止dns查詢將查詢到的A記錄返回。
通過host命令對(duì)名為kubernetes的service的集群內(nèi)部域名進(jìn)行解析
- root@demo-hello-pro-master-5474b97bdf-fvbm5:/# host -v kubernetes.default
- Trying "kubernetes.default.paas.svc.cluster.local"
- Trying "kubernetes.default.svc.cluster.local"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18054
- ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;kubernetes.default.svc.cluster.local. IN A
- ;; ANSWER SECTION:
- kubernetes.default.svc.cluster.local. 5 IN A 10.10.0.1
- Received 106 bytes from 10.10.0.2#53 in 3 ms
- Trying "kubernetes.default.svc.cluster.local"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58952
- ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;kubernetes.default.svc.cluster.local. IN AAAA
- ;; AUTHORITY SECTION:
- cluster.local. 5 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1622445553 7200 1800 86400 5
- Received 147 bytes from 10.10.0.2#53 in 2 ms
- Trying "kubernetes.default.svc.cluster.local"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37783
- ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;kubernetes.default.svc.cluster.local. IN MX
- ;; AUTHORITY SECTION:
- cluster.local. 5 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1622445553 7200 1800 86400 5
- Received 147 bytes from 10.10.0.2#53 in 2 ms
解析k8s集群外部域名
接下來針對(duì)我的 www.ayunw.cn 這個(gè)域名進(jìn)行多次解析。這里我為了測(cè)試,發(fā)起了6 次解析。我每執(zhí)行一次解析,下面抓包的終端就敲一次回車。解析的同時(shí)去coredns這個(gè)容器所在的節(jié)點(diǎn)進(jìn)行抓包分析。
- root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup www.ayunw.cn
- Server: 10.10.0.2
- Address: 10.10.0.2#53
- Non-authoritative answer:
- Name: www.ayunw.cn
- Address: 134.175.123.64
抓包分析
抓包開始,由于我的集群有大量的服務(wù),每秒都有很多內(nèi)部服務(wù)dns解析請(qǐng)求。所以這里我過濾了關(guān)鍵字ayunw。上面的dns每執(zhí)行一次,我在這個(gè)抓包的窗口就敲一下回車,這樣的話方便看清楚每一次的解析結(jié)果
以下是抓 www.ayunw.cn 的域名DNS包的結(jié)果:
- [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "ayunw"
- tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
- listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
- 14:38:07.350640 IP 10.20.105.252.47767 > qing-core-kube-node-srv2.domain: 13102+ A? www.ayunw.cn.cluster.local. (44)
- 14:38:19.098753 IP 10.20.105.252.47071 > qing-core-kube-node-srv2.domain: 15535+ A? www.ayunw.cn.paas.svc.cluster.local. (53)
- 14:38:19.111441 IP 10.20.105.252.56968 > qing-core-kube-node-srv2.domain: 62838+ A? www.ayunw.cn. (30)
- 14:38:19.111720 IP qing-core-kube-node-srv2.35187 > 172.16.0.11.domain: 62838+ A? www.ayunw.cn. (30)
- 14:38:31.200982 IP 10.20.105.252.50777 > qing-core-kube-node-srv2.domain: 10715+ A? www.ayunw.cn.svc.cluster.local. (48)
- 14:38:31.214096 IP 10.20.105.252.51233 > qing-core-kube-node-srv2.domain: 37585+ AAAA? www.ayunw.cn. (30)
- 14:38:31.214299 IP qing-core-kube-node-srv2.35187 > 172.16.0.11.domain: 37585+ AAAA? www.ayunw.cn. (30)
- 14:39:04.691754 IP 10.20.105.252.34080 > qing-core-kube-node-srv2.domain: 34206+ A? www.ayunw.cn.paas.svc.cluster.local. (53)
- 14:39:04.704758 IP 10.20.105.252.36478 > qing-core-kube-node-srv2.domain: 64751+ A? www.ayunw.cn. (30)
- 14:39:04.705068 IP qing-core-kube-node-srv2.48926 > 172.16.0.11.domain: 64751+ A? www.ayunw.cn. (30)
- 14:39:13.925872 IP 10.20.105.252.59868 > qing-core-kube-node-srv2.domain: 45121+ A? www.ayunw.cn.paas.svc.cluster.local. (53)
- 14:39:13.937328 IP 10.20.105.252.45290 > qing-core-kube-node-srv2.domain: 27511+ A? www.ayunw.cn. (30)
- 14:39:13.937576 IP qing-core-kube-node-srv2.48926 > 172.16.0.11.domain: 27511+ A? www.ayunw.cn. (30)
- 14:39:24.838444 IP 10.20.105.252.37510 > qing-core-kube-node-srv2.domain: 45926+ A? www.ayunw.cn.cluster.local. (44)
- 14:45:13.438961 IP 10.20.105.252.55462 > qing-core-kube-node-srv2.domain: 60170+ A? www.ayunw.cn.paas.svc.cluster.local. (53)
- 14:45:13.450865 IP 10.20.105.252.42674 > qing-core-kube-node-srv2.domain: 25680+ A? www.ayunw.cn. (30)
- 14:45:13.451110 IP qing-core-kube-node-srv2.56396 > 172.16.0.11.domain: 25680+ A? www.ayunw.cn. (30)
- ^C35952 packets captured
- 35956 packets received by filter
- 0 packets dropped by kernel
從上面抓包分析的結(jié)果來看, www.ayunw.cn 的這個(gè)域名只有兩個(gè)點(diǎn),比pod里面 /etc/resolv.conf 文件中的 ndots 配置的值小(ndots的值為5,域名的點(diǎn)為2)。則會(huì)按照search的參數(shù)填補(bǔ)域名后綴,并且是根據(jù)search后面的順序 paas.svc.cluster.local 、 svc.cluster.local 、 cluster.local 依次來填充的。因?yàn)楦鶕?jù)search后面的本地域匹配后都沒有域名解析的結(jié)果,因此他就直接解析了 www.ayunw.cn 這個(gè)域名查詢到了該域名的A記錄并且返回了結(jié)果。
通過host命令來進(jìn)行解析
- root@demo-hello-pro-master-5474b97bdf-fvbm5:/# host -v www.ayunw.cn
- Trying "www.ayunw.cn.paas.svc.cluster.local"
- Trying "www.ayunw.cn.svc.cluster.local"
- Trying "www.ayunw.cn.cluster.local"
- Trying "www.ayunw.cn"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8135
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;www.ayunw.cn. IN A
- ;; ANSWER SECTION:
- www.ayunw.cn. 30 IN A 134.175.123.64
- ;; AUTHORITY SECTION:
- . 30 IN NS l.root-servers.net.
- . 30 IN NS e.root-servers.net.
- . 30 IN NS h.root-servers.net.
- . 30 IN NS k.root-servers.net.
- . 30 IN NS d.root-servers.net.
- . 30 IN NS b.root-servers.net.
- . 30 IN NS g.root-servers.net.
- . 30 IN NS j.root-servers.net.
- . 30 IN NS m.root-servers.net.
- . 30 IN NS i.root-servers.net.
- . 30 IN NS f.root-servers.net.
- . 30 IN NS c.root-servers.net.
- . 30 IN NS a.root-servers.net.
- Received 461 bytes from 10.10.0.2#53 in 94 ms
- Trying "www.ayunw.cn"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11085
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;www.ayunw.cn. IN AAAA
- ;; AUTHORITY SECTION:
- ayunw.cn. 5 IN SOA dns17.hichina.com. hostmaster.hichina.com. 2019070911 3600 1200 86400 360
- Received 113 bytes from 10.10.0.2#53 in 99 ms
- Trying "www.ayunw.cn"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19432
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;www.ayunw.cn. IN MX
- ;; AUTHORITY SECTION:
- ayunw.cn. 5 IN SOA dns17.hichina.com. hostmaster.hichina.com. 2019070911 3600 1200 86400 360
- Received 113 bytes from 10.10.0.2#53 in 51 ms
因?yàn)槲业膒od中存在三個(gè)本地域:paas.svc.cluster.local 、 svc.cluster.local 、 cluster.local ,通過host命令可以看到,Trying 一共嘗試了四次,一次根據(jù)我search后面的本地域進(jìn)行了解析搜索,結(jié)果沒有搜索到正確的解析,因此通過pod所在的宿主機(jī)本地的 /etc/resolv.conf 文件中進(jìn)行了解析。
本地宿主機(jī)的/etc/resolv.conf的解析如下: 我這里公司用了內(nèi)部bind服務(wù),做了內(nèi)部dns,然后上游指向了百度的dns。
- # cat /etc/resolv.conf
- options rotate timeout:1
- ; generated by /usr/sbin/dhclient-script
- nameserver 172.16.0.11
- nameserver 172.16.0.12
解析 www.jd.com 域名
- root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup www.jd.com
- Server: 10.10.0.2
- Address: 10.10.0.2#53
- Non-authoritative answer:
- www.jd.com canonical name = www.jd.com.gslb.qianxun.com.
- www.jd.com.gslb.qianxun.com canonical name = www.jdcdn.com.
- www.jdcdn.com canonical name = img20.360buyimg.com.s.galileo.jcloud-cdn.com.
- img20.360buyimg.com.s.galileo.jcloud-cdn.com canonical name = img2x-sched.jcloud-cdn.com.
- Name: img2x-sched.jcloud-cdn.com
- Address: 113.107.249.3
以下是抓www.jd.com的域名DNS包的結(jié)果:
- [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "jd"
- tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
- listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
- 16:17:52.935226 IP 10.20.105.252.56775 > qing-core-kube-node-srv2.domain: 17278+ A? www.jd.com.paas.svc.cluster.local. (51)
- 16:17:52.947890 IP 10.20.105.252.52012 > qing-core-kube-node-srv2.domain: 12806+ A? www.jd.com. (28)
- 16:17:52.948150 IP qing-core-kube-node-srv2.54626 > 172.16.0.11.domain: 12806+ A? www.jd.com. (28)
- 16:17:53.054427 IP 172.16.0.11.domain > qing-core-kube-node-srv2.54626: 12806 5/13/0 CNAME www.jd.com.gslb.qianxun.com., CNAME www.jdcdn.com., CNAME img20.360buyimg.com.s.galileo.jcloud-cdn.com., CNAME img2x-sched.jcloud-cdn.com., A 113.107.249.3 (398)
- 16:17:53.054677 IP qing-core-kube-node-srv2.domain > 10.20.105.252.52012: 12806 5/13/0 CNAME www.jd.com.gslb.qianxun.com., CNAME www.jdcdn.com., CNAME img20.360buyimg.com.s.galileo.jcloud-cdn.com., CNAME img2x-sched.jcloud-cdn.com., A 113.107.249.3 (398)
通過host命令檢測(cè)www.jd.com和上面www.ayunw.cn一樣的
- root@demo-hello-pro-master-5474b97bdf-fvbm5:/# host -v www.jd.com
- Trying "www.jd.com.paas.svc.cluster.local"
- Trying "www.jd.com.svc.cluster.local"
- Trying "www.jd.com.cluster.local"
- Trying "www.jd.com"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61910
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 13, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;www.jd.com. IN A
- ;; ANSWER SECTION:
- www.jd.com. 13 IN CNAME www.jd.com.gslb.qianxun.com.
- www.jd.com.gslb.qianxun.com. 13 IN CNAME www.jdcdn.com.
- www.jdcdn.com. 13 IN CNAME img20.360buyimg.com.s.galileo.jcloud-cdn.com.
- img20.360buyimg.com.s.galileo.jcloud-cdn.com. 13 IN CNAME img2x-sched.jcloud-cdn.com.
- img2x-sched.jcloud-cdn.com. 13 IN A 113.107.249.3
- ;; AUTHORITY SECTION:
- . 13 IN NS f.root-servers.net.
- . 13 IN NS i.root-servers.net.
- . 13 IN NS d.root-servers.net.
- . 13 IN NS l.root-servers.net.
- . 13 IN NS j.root-servers.net.
- . 13 IN NS g.root-servers.net.
- . 13 IN NS k.root-servers.net.
- . 13 IN NS m.root-servers.net.
- . 13 IN NS h.root-servers.net.
- . 13 IN NS c.root-servers.net.
- . 13 IN NS a.root-servers.net.
- . 13 IN NS e.root-servers.net.
- . 13 IN NS b.root-servers.net.
- Received 398 bytes from 10.10.0.2#53 in 5 ms
- Trying "img2x-sched.jcloud-cdn.com"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64422
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;img2x-sched.jcloud-cdn.com. IN AAAA
- ;; AUTHORITY SECTION:
- jcloud-cdn.com. 5 IN SOA ns1.jdgslb.com. apollo.jdgslb.com. 1622435242 10800 3600 604800 3600
- Received 125 bytes from 10.10.0.2#53 in 4 ms
- Trying "img2x-sched.jcloud-cdn.com"
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43091
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;img2x-sched.jcloud-cdn.com. IN MX
- ;; AUTHORITY SECTION:
- jcloud-cdn.com. 5 IN SOA ns1.jdgslb.com. apollo.jdgslb.com. 1622435242 10800 3600 604800 3600
- Received 125 bytes from 10.10.0.2#53 in 40 ms
查看域名的點(diǎn)數(shù)等于ndots的值5的域名解析
這里我有一個(gè)阿里云上的域名,做了一個(gè)dns解析并且測(cè)試了4次
- root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup x.y.z.v.ayunw.cn
- Server: 10.10.0.2
- Address: 10.10.0.2#53
- Non-authoritative answer:
- Name: x.y.z.v.ayunw.cn
- Address: 134.175.123.64
抓包分析
- [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "ayunw"
- tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
- listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
- 16:36:49.928116 IP 10.20.105.252.46581 > qing-core-kube-node-srv2.domain: 38769+ A? x.y.z.v.ayunw.cn. (34)
- 16:36:49.928383 IP qing-core-kube-node-srv2.59801 > 172.16.0.11.domain: 38769+ A? x.y.z.v.ayunw.cn. (34)
- 16:36:56.901762 IP 10.20.105.252.43844 > qing-core-kube-node-srv2.domain: 3524+ A? x.y.z.v.ayunw.cn. (34)
- 16:37:01.763743 IP 10.20.105.252.36053 > qing-core-kube-node-srv2.domain: 62952+ AAAA? x.y.z.v.ayunw.cn. (34)
- 16:37:01.764110 IP qing-core-kube-node-srv2.59801 > 172.16.0.11.domain: 62952+ AAAA? x.y.z.v.ayunw.cn. (34)
- 16:37:06.851820 IP 10.20.105.252.36305 > qing-core-kube-node-srv2.domain: 58393+ AAAA? x.y.z.v.ayunw.cn. (34)
- 16:37:06.852118 IP qing-core-kube-node-srv2.59801 > 172.16.0.11.domain: 58393+ AAA
從上述抓包結(jié)果可以看到,如果域名中的點(diǎn)等于ndots的值,他會(huì)直接解析域名,不會(huì)用search后面的本地域來填補(bǔ)的。可能因?yàn)槲野⒗镌粕线@個(gè)域名的原因,不支持超過5個(gè)點(diǎn)的域名解析。所以超過5個(gè)點(diǎn)的域名我無法測(cè)試。
結(jié)論
如果點(diǎn)的個(gè)數(shù)小于5個(gè),那么會(huì)根據(jù)search中配置的本地域列表一次在對(duì)應(yīng)域中先進(jìn)行搜索。如果沒有返回,則最后再查詢域名本身。如果說search中配置的本地域列表沒有一個(gè)匹配的,那么就會(huì)走到服務(wù)器宿主機(jī)的/etc/resolv.conf中去解析。如果你kubelet中clusterdomain配置錯(cuò)了。那么search中沒有任何一個(gè)匹配的到,直接轉(zhuǎn)發(fā)到本地DNS,走正常的遞歸查詢邏輯。
通過以上測(cè)試發(fā)現(xiàn)ndots的值和請(qǐng)求的域名是相關(guān)的。為了避免多次的DNS解析查詢,可以將需要進(jìn)行解析的域名進(jìn)行相對(duì)的優(yōu)化 盡可能將域名中的點(diǎn)都帶上,并且最好是等于ndots的值。比如:kubernetes.paas.svc.cluster.local。這樣他就直接解析到了這個(gè)域名返回了A記錄而不是在通過search后面的本地域去解析多次。如果你解析的域名是kubernetes.paas他就會(huì)根據(jù)search后面的本地域去進(jìn)行補(bǔ)全解析多次了 在同一個(gè)namespace下可以直接解析service的名稱。比如:nslookup kubernetes,他會(huì)補(bǔ)全default.svc.cluster.local,但是為了解析失敗個(gè)人建議最好還是將域名寫完整。