時間:2023-02-22 04:03:01 | 來源:建站知識
時間:2023-02-22 04:03:01 來源:建站知識
一次K8s中的Pod解析外網(wǎng)域名錯誤的問題排查:cat /etc/resolv.confnameserver 10.68.0.2search devops.svc.cluster.local. svc.cluster.local. cluster.local.
這個文件中,配置的 DNS Server,一般就是 K8S 中,kubedns 的 Service 的 ClusterIP,這個IP是虛擬IP,無法ping,但可以訪問。root@other-8-67:~# kubectl get svc -n kube-system |grep dnskube-dns ClusterIP 10.68.0.2 <none> 53/UDP,53/TCP,9153/TCP 106d
所以,所有域名的解析,其實都要經(jīng)過 kubedns 的虛擬IP 10.68.0.2 進行解析,不論是 Kubernetes 內(nèi)部域名還是外部的域名。Kubernetes 中,域名的全稱,必須是 service-name.namespace.svc.cluster.local 這種模式,服務(wù)名,就是Kubernetes中 Service 的名稱,所以,當(dāng)我們執(zhí)行下面的命令時:curl b
必須得有一個 Service 名稱為 b,這是前提。// search 內(nèi)容類似如下(不同的pod,第一個域會有所不同)search devops.svc.cluster.local svc.cluster.local cluster.local
b.devops.svc.cluster.local -> b.svc.cluster.local -> b.cluster.local ,直到找到為止。// curl b,可以一次性找到(b +devops.svc.cluster.local)b.devops.svc.cluster.local// curl b.devops,第一次找不到( b.devops + devops.svc.cluster.local)b.devops.devops.svc.cluster.local// 第二次查找( b.devops + svc.cluster.local),可以找到b.devops.svc.cluster.local
因此curl b,要比 curl b.devops 效率高,因為 curl b.devops,多經(jīng)過了一次 DNS 查詢。// 1、找到容器ID,并打印它的NS IDdocker inspect --format "{{.State.Pid}}" 16938de418ac// 2、進入此容器的網(wǎng)絡(luò)Namespacensenter -n -t 54438// 3、抓DNS包tcpdump -i eth0 udp dst port 53|grep baidu.com
在其他的容器中,進行 http://baidu.com 域名查找nslookup baidu.com 114.114.114.114
注意:nslookup命令的最后指定DNS服務(wù)容器的IP,是因為,如果不指定,且DNS服務(wù)的容器存在多個的話,那么DNS請求,可能會均分到所有DNS服務(wù)的容器上,我們?nèi)绻蛔ツ硢蝹€DNS服務(wù)容器抓到的包,可能就不全了,指定IP后,DNS的請求,就必然只會打到單個的DNS容器。抓包的數(shù)據(jù)才完整。11:46:26.843118 IP srv-device-manager-7595d6795c-8rq6n.60857 > kube-dns.kube-system.svc.cluster.local.domain: 19198+ A? baidu.com.devops.svc.cluster.local. (49)11:46:26.843714 IP srv-device-manager-7595d6795c-8rq6n.35998 > kube-dns.kube-system.svc.cluster.local.domain: 53768+ AAAA? baidu.com.devops.svc.cluster.local. (49)11:46:26.844260 IP srv-device-manager-7595d6795c-8rq6n.57939 > kube-dns.kube-system.svc.cluster.local.domain: 48864+ A? baidu.com.svc.cluster.local. (45)11:46:26.844666 IP srv-device-manager-7595d6795c-8rq6n.35990 > kube-dns.kube-system.svc.cluster.local.domain: 43238+ AAAA? baidu.com.svc.cluster.local. (45)11:46:26.845153 IP srv-device-manager-7595d6795c-8rq6n.58745 > kube-dns.kube-system.svc.cluster.local.domain: 59086+ A? baidu.com.cluster.local. (41)11:46:26.845543 IP srv-device-manager-7595d6795c-8rq6n.32910 > kube-dns.kube-system.svc.cluster.local.domain: 30930+ AAAA? baidu.com.cluster.local. (41)11:46:26.845907 IP srv-device-manager-7595d6795c-8rq6n.55367 > kube-dns.kube-system.svc.cluster.local.domain: 58903+ A? baidu.com. (27)11:46:26.861714 IP srv-device-manager-7595d6795c-8rq6n.32900 > kube-dns.kube-system.svc.cluster.local.domain: 58394+ AAAA? baidu.com. (27)
我們可以看到,在真正解析 http://baidu.com 之前,經(jīng)歷了 baidu.com.devops.svc.cluster.local. -> baidu.com.svc.cluster.local. -> baidu.com.cluster.local. -> baidu.com./prometheus $ cat /etc/resolv.confnameserver 10.66.0.2search monitor.svc.cluster.local. svc.cluster.local. cluster.local. options ndots:5
ndots:5,表示:如果查詢的域名包含的點“.”,不到5個,那么進行DNS查找,將使用非完全限定名稱(或者叫絕對域名),如果你查詢的域名包含點數(shù)大于等于5,那么DNS查詢,默認(rèn)會使用絕對域名進行查詢。舉例來說:a.b.c.d.e.devops.svc.cluster.local. ->a.b.c.d.e.svc.cluster.local. ->a.b.c.d.e.cluster.local.
直到找到為止。如果走完了search域還找不到,則使用 a.b.c.d.e. ,作為絕對域名進行DNS查找。// 對域名 a.b.c.d.com 進行DNS解析請求 root@srv-xxx-7595d6795c-8rq6n:/go/bin# nslookup a.b.c.d.comServer: 10.68.0.2Address: 10.68.0.2#53** server can't find a.b.c.d.com: NXDOMAIN// 抓包數(shù)據(jù)如下:root@srv-device-manager-7595d6795c-8rq6n:/go/bin# tcpdump -i eth0 udp dst port 53 -c 20 |grep a.b.c.d.comtcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes20 packets captured16:14:40.053575 IP srv-device-manager-7595d6795c-8rq6n.37359 > kube-dns.kube-system.svc.cluster.local.domain: 29842+ A? a.b.c.d.com.cluster.local. (43)16:14:40.054083 IP srv-device-manager-7595d6795c-8rq6n.34813 > kube-dns.kube-system.svc.cluster.local.domain: 19104+ AAAA? a.b.c.d.com.cluster.local. (43)25 packets received by filter16:14:40.054983 IP srv-device-manager-7595d6795c-8rq6n.37303 > kube-dns.kube-system.svc.cluster.local.domain: 53902+ A? a.b.c.d.com.devops.svc.cluster.local. (51)16:14:40.055465 IP srv-device-manager-7595d6795c-8rq6n.40766 > kube-dns.kube-system.svc.cluster.local.domain: 34453+ AAAA? a.b.c.d.com.devops.svc.cluster.local. (51)0 packets dropped by kernel16:14:40.055946 IP srv-device-manager-7595d6795c-8rq6n.35443 > kube-dns.kube-system.svc.cluster.local.domain: 24829+ A? a.b.c.d.com.svc.cluster.local. (47)16:14:40.057698 IP srv-device-manager-7595d6795c-8rq6n.44180 > kube-dns.kube-system.svc.cluster.local.domain: 23046+ AAAA? a.b.c.d.com.svc.cluster.local. (47)16:14:40.058062 IP srv-device-manager-7595d6795c-8rq6n.56986 > kube-dns.kube-system.svc.cluster.local.domain: 42008+ A? a.b.c.d.com. (29)16:14:40.075579 IP srv-device-manager-7595d6795c-8rq6n.55738 > kube-dns.kube-system.svc.cluster.local.domain: 32284+ AAAA? a.b.c.d.com. (29)// 結(jié)論:// 點數(shù)少于5個,先走search域,最后將其視為絕對域名進行查詢
域名中點數(shù)>=5個的情況:// 對域名 a.b.c.d.e.com 進行DNS解析請求 root@srv-xxx-7595d6795c-8rq6n:/go/bin# nslookup a.b.c.d.e.comServer: 10.68.0.2Address: 10.68.0.2#53** server can't find a.b.c.d.e.com: NXDOMAIN// 抓包數(shù)據(jù)如下:root@srv-device-manager-7595d6795c-8rq6n:/go/bin# tcpdump -i eth0 udp dst port 53 -c 20 |grep a.b.c.d.e.comtcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes16:32:39.624305 IP srv-device-manager-7595d6795c-8rq6n.56274 > kube-dns.kube-system.svc.cluster.local.domain: 43582+ A? a.b.c.d.e.com. (31)20 packets captured16:32:39.805470 IP srv-device-manager-7595d6795c-8rq6n.56909 > kube-dns.kube-system.svc.cluster.local.domain: 27206+ AAAA? a.b.c.d.e.com. (31)16:32:39.833203 IP srv-device-manager-7595d6795c-8rq6n.33370 > kube-dns.kube-system.svc.cluster.local.domain: 14881+ A? a.b.c.d.e.com.cluster.local. (45)21 packets received by filter16:32:39.833779 IP srv-device-manager-7595d6795c-8rq6n.40814 > kube-dns.kube-system.svc.cluster.local.domain: 43047+ AAAA? a.b.c.d.e.com.cluster.local. (45)16:32:39.834363 IP srv-device-manager-7595d6795c-8rq6n.53053 > kube-dns.kube-system.svc.cluster.local.domain: 17994+ A? a.b.c.d.e.com.iot.svc.cluster.local. (53)0 packets dropped by kernel16:32:39.834740 IP srv-device-manager-7595d6795c-8rq6n.47803 > kube-dns.kube-system.svc.cluster.local.domain: 15951+ AAAA? a.b.c.d.e.com.iot.svc.cluster.local. (53)16:32:39.835177 IP srv-device-manager-7595d6795c-8rq6n.60845 > kube-dns.kube-system.svc.cluster.local.domain: 38541+ A? a.b.c.d.e.com.svc.cluster.local. (49)16:32:39.835611 IP srv-device-manager-7595d6795c-8rq6n.36086 > kube-dns.kube-system.svc.cluster.local.domain: 49809+ AAAA? a.b.c.d.e.com.svc.cluster.local. (49)// 結(jié)論:// 點數(shù)>=5個,直接視為絕對域名進行查找,只有當(dāng)查詢不到的時候,才繼續(xù)走 search 域。
nslookup a.b.c.com.
在DNS服務(wù)容器上抓到的包如下root@srv-device-manager-7595d6795c-8rq6n:/go/bin# tcpdump -i eth0 udp dst port 53 -c 20 |grep a.b.c.com.tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes16:39:31.771615 IP srv-device-manager-7595d6795c-8rq6n.50332 > kube-dns.kube-system.svc.cluster.local.domain: 50829+ A? a.b.c.com. (27)20 packets captured16:39:31.793579 IP srv-device-manager-7595d6795c-8rq6n.51946 > kube-dns.kube-system.svc.cluster.local.domain: 25235+ AAAA? a.b.c.com. (27)
并沒有多余的DNS請求 ... spec: containers: - env: - name: GOENV value: DEV image: xxx/devops/srv-inner-proxy imagePullPolicy: IfNotPresent lifecycle: {} livenessProbe: failureThreshold: 3 httpGet: path: /health port: 8000 scheme: HTTP initialDelaySeconds: 5 periodSeconds: 5 successThreshold: 1 timeoutSeconds: 1 name: srv-inner-proxy ports: - containerPort: 80 protocol: TCP - containerPort: 8000 protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /health port: 8000 scheme: HTTP initialDelaySeconds: 5 periodSeconds: 5 successThreshold: 1 timeoutSeconds: 1 resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsConfig: options: - name: timeout value: "2" - name: ndots value: "2" - name: single-request-reopen dnsPolicy: ClusterFirst ...
在Kubernetes 中,有4種 DNS 策略關(guān)鍵詞:錯誤
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。