摘要:?jiǎn)栴}描述在搭建集群過(guò)程中,安裝了插件后,運(yùn)行一個(gè)容器,發(fā)現(xiàn)容器內(nèi)無(wú)法解析集群外域名,一開(kāi)始可以解析集群內(nèi)域名,一段時(shí)間后也無(wú)法解析集群內(nèi)域名??偨Y(jié)通過(guò)對(duì)問(wèn)題的探究,也理解了集群中解析的完整過(guò)程,如圖。
問(wèn)題描述
在搭建Kubernetes集群過(guò)程中,安裝了kube-dns插件后,運(yùn)行一個(gè)ubuntu容器,發(fā)現(xiàn)容器內(nèi)無(wú)法解析集群外域名,一開(kāi)始可以解析集群內(nèi)域名,一段時(shí)間后也無(wú)法解析集群內(nèi)域名。
$ nslookup kubernetes.default Server: 10.99.0.2 Address 1: 10.99.0.2 kube-dns.kube-system.svc.cluster.local nslookup: can"t resolve "kubernetes.default"排查過(guò)程
在排查問(wèn)題前,先思考一下Kubernetes集群中的DNS解析過(guò)程,在安裝好kube-dns的集群中,普通Pod的dnsPolicy屬性是默認(rèn)值ClusterFirst,也就是會(huì)指向集群內(nèi)部的DNS服務(wù)器,kube-dns負(fù)責(zé)解析集群內(nèi)部的域名,kube-dns Pod的dnsPolicy值是Default,意思是從所在Node繼承DNS服務(wù)器,對(duì)于無(wú)法解析的外部域名,kube-dns會(huì)繼續(xù)向集群外部的dns進(jìn)行查詢,過(guò)程如圖。
Ubuntu容器是一個(gè)普通的Pod,在Linux系統(tǒng)中,/etc/resolv.conf是存儲(chǔ)DNS服務(wù)器的文件,普通Pod的/etc/resolv.conf文件應(yīng)該存儲(chǔ)的是kube-dns的Service IP。
nameserver 10.99.0.2 # 這里存儲(chǔ)的是kube-dns的Service IP search default.svc.cluster.local. svc.cluster.local. cluster.local. options ndots:5
查看后發(fā)現(xiàn)/etc/resolv.conf文件中存儲(chǔ)的是kube-dns的Service IP,證明這一步?jīng)]有問(wèn)題,接下來(lái)查看一下kube-dns的Pod,先進(jìn)入kube-dns的Pod中檢查一下/etc/resolv.conf文件,這里存儲(chǔ)的應(yīng)該是集群外部的DNS服務(wù)器地址,查看后發(fā)現(xiàn),這里存儲(chǔ)的地址是127.0.0.53,進(jìn)一步查看kube-dns Pod的log,發(fā)現(xiàn)出現(xiàn)了非常多的i/o timeout錯(cuò)誤。
2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:38019->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:57567->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:52599->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:42539->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:46885->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:44189->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:56505->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:47320->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:42464->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:49203->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:58103->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:47148->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:36883->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:40968->127.0.0.53:53: i/o timeout 2018/07/11 07:12:47 [ERROR] 2 [www.baidu.com](http://www.baidu.com/). A: unreachable backend: read udp 127.0.0.1:55672->127.0.0.53:53: i/o timeout
現(xiàn)在基本上可以發(fā)現(xiàn)問(wèn)題的原因了,kube-dns只能解析集群內(nèi)部地址,而集群外部地址應(yīng)該發(fā)給外部DNS服務(wù)器進(jìn)行解析,由于kube-dns Pod中的/etc/resolv.conf文件存儲(chǔ)的DNS服務(wù)器地址是127.0.0.53,127...*都是回環(huán)地址,也就是集群外域名的DNS解析請(qǐng)求會(huì)再次發(fā)送回kube-dns,導(dǎo)致形成一個(gè)循環(huán),這也是一秒鐘會(huì)出現(xiàn)幾十次i/o timeout日志的原因,請(qǐng)求會(huì)不斷的在kube-dns中循環(huán),kube-dns就像一個(gè)黑洞一樣,吃掉了所有dns解析請(qǐng)求,不斷累積的請(qǐng)求最終會(huì)導(dǎo)致整個(gè)集群的網(wǎng)絡(luò)出現(xiàn)卡頓。
為什么
雖然問(wèn)題的原因找到了,但是為什么kube-dns Pod中/etc/resolv.conf文件存儲(chǔ)的DNS服務(wù)器是127.0.0.53?
kube-dns Pod的dnsPolicy值是Default,查看一下Kubernetes文檔。
"Default": The Pod inherits the name resolution configuration from the node that the pods run on. See?related discussion?for more details.
所以kube-dns的/etc/resolv.conf文件是從Node中繼承來(lái)的,查看Node中的/etc/resolv.conf文件,存儲(chǔ)的DNS服務(wù)器地址確實(shí)是127.0.0.53,那么下一個(gè)問(wèn)題出現(xiàn)了,在Node中發(fā)送DNS解析請(qǐng)求為什么不會(huì)產(chǎn)生回環(huán)的問(wèn)題呢?
Node使用的是Ubuntu 18.04 Server,在這個(gè)版本的系統(tǒng)中,DNS解析請(qǐng)求并不是直接發(fā)給所在網(wǎng)絡(luò)的DNS服務(wù)器的,Ubuntu 18.04中有一個(gè)systemd-resolved服務(wù),為本地應(yīng)用程序提供了DNS解析服務(wù),例如nslookup localhost,解析程序從/etc/resolv.conf文件中找到DNS服務(wù)器127.0.0.53,發(fā)送解析請(qǐng)求,systemd-resolved會(huì)監(jiān)聽(tīng)在53端口上,捕獲到解析請(qǐng)求后,如果是自己可以解析的,例如localhost,會(huì)直接返回127.0.0.1,如果不能解析,才會(huì)發(fā)送給外部服務(wù)器,而外部服務(wù)器的地址存儲(chǔ)在/run/systemd/resolve/resolv.conf文件中,這個(gè)文件是systemd-resolved服務(wù)器的配置文件,過(guò)程如圖。
怎么破
理解了問(wèn)題的來(lái)龍去脈,解決問(wèn)題的辦法也就應(yīng)運(yùn)而生。在Kubernetes集群中,kubelet是worker組建,負(fù)責(zé)管理Pod,根據(jù)kubernetes文檔,kubelet默認(rèn)會(huì)從Node的/etc/resolv.conf文件讀取DNS服務(wù)器地址,使得dnsPolicy是Default的Pod得以繼承,kubelet中的--resolv-conf參數(shù)可以指定這個(gè)配置文件的地址。在Ubuntu 18.04中,將這個(gè)參數(shù)設(shè)置為systemd-resolved的DNS服務(wù)器配置文件/run/systemd/resolve/resolv.conf,Pod就會(huì)繼承真正的外部DNS服務(wù)器。
總結(jié)通過(guò)對(duì)問(wèn)題的探究,也理解了Kubernetes集群中DNS解析的完整過(guò)程,如圖。
* 在Ubuntu 16.04中也是類似的邏輯,只不過(guò)systemd-resolved換成了dnsmasq,監(jiān)聽(tīng)地址是127.0.1.1
* 在具體實(shí)踐過(guò)程中,也順便探究了CoreDNS和KubeDNS架構(gòu)和解析邏輯上的區(qū)別,不過(guò)不在此問(wèn)題的討論范圍,有興趣的朋友可以自己看一下。
* 如果Kubernetes集群是安裝在NAT網(wǎng)絡(luò)下的虛擬機(jī)上,虛擬機(jī)(也就是Kubernetes集群中的Node)中/etc/resolv.conf文件可能被修改為NAT的地址,也就不會(huì)出現(xiàn)上面這個(gè)問(wèn)題。
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/
https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html
https://github.com/kubernetes/kubernetes/issues/49411
https://github.com/kubernetes/kubernetes/issues/45828
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/8062.html
摘要:?jiǎn)栴}描述在搭建集群過(guò)程中,安裝了插件后,運(yùn)行一個(gè)容器,發(fā)現(xiàn)容器內(nèi)無(wú)法解析集群外域名,一開(kāi)始可以解析集群內(nèi)域名,一段時(shí)間后也無(wú)法解析集群內(nèi)域名??偨Y(jié)通過(guò)對(duì)問(wèn)題的探究,也理解了集群中解析的完整過(guò)程,如圖。 showImg(https://segmentfault.com/img/remote/1460000015639330); 問(wèn)題描述 在搭建Kubernetes集群過(guò)程中,安裝了kub...
摘要:?jiǎn)栴}是不是定義的一個(gè)的容器集群是只部署在同一個(gè)主機(jī)上楊樂(lè)到目前是,同一個(gè)里的是部署在同一臺(tái)主機(jī)的。問(wèn)題這個(gè)圖里的是安裝在哪里的所有的客戶端以及會(huì)連接這個(gè)嘛楊樂(lè)可以任意地方,只要能訪問(wèn)到集群,會(huì)作為的出口。 kubernetes1.0剛剛發(fā)布,開(kāi)源社區(qū)400多位貢獻(xiàn)者一年的努力,多達(dá)14000多次的代碼提交,最終達(dá)到了之前預(yù)計(jì)的milestone, 并意味著這個(gè)開(kāi)源容器編排系統(tǒng)可以正式在...
摘要:個(gè)推針對(duì)服務(wù)場(chǎng)景,基于和搭建了微服務(wù)框架,提高了開(kāi)發(fā)效率。三容器化在微服務(wù)落地實(shí)踐時(shí)我們選擇了,下面將詳細(xì)介紹個(gè)推基于的實(shí)踐。 2016年伊始Docker無(wú)比興盛,如今Kubernetes萬(wàn)人矚目。在這個(gè)無(wú)比需要?jiǎng)?chuàng)新與速度的時(shí)代,由容器、微服務(wù)、DevOps構(gòu)成的云原生席卷整個(gè)IT界。個(gè)推針對(duì)Web服務(wù)場(chǎng)景,基于OpenResty和Node.js搭建了微服務(wù)框架,提高了開(kāi)發(fā)效率。在微服...
摘要:個(gè)推針對(duì)服務(wù)場(chǎng)景,基于和搭建了微服務(wù)框架,提高了開(kāi)發(fā)效率。三容器化在微服務(wù)落地實(shí)踐時(shí)我們選擇了,下面將詳細(xì)介紹個(gè)推基于的實(shí)踐。 2016年伊始Docker無(wú)比興盛,如今Kubernetes萬(wàn)人矚目。在這個(gè)無(wú)比需要?jiǎng)?chuàng)新與速度的時(shí)代,由容器、微服務(wù)、DevOps構(gòu)成的云原生席卷整個(gè)IT界。個(gè)推針對(duì)Web服務(wù)場(chǎng)景,基于OpenResty和Node.js搭建了微服務(wù)框架,提高了開(kāi)發(fā)效率。在微服...
摘要:手動(dòng)搭建集群探索系列的第三篇,主要記錄手動(dòng)搭建集群的過(guò)程,部署部署用作服務(wù)發(fā)現(xiàn)。配置的子網(wǎng)范圍不能和的一致。 手動(dòng)搭建kubernetes集群 探索kubernetes系列的第三篇,主要記錄手動(dòng)搭建k8s集群的過(guò)程,部署dashboard, 部署DNS用作服務(wù)發(fā)現(xiàn)。順便記錄一下k8s中的一些資源的概念。 配置環(huán)境 這個(gè)步驟可以參考《Flannel with Docker》文中的步驟,不...
閱讀 1959·2021-11-24 11:16
閱讀 3292·2021-09-10 10:51
閱讀 3268·2021-08-03 14:03
閱讀 1294·2019-08-29 17:03
閱讀 3279·2019-08-29 12:36
閱讀 2269·2019-08-26 14:06
閱讀 522·2019-08-23 16:32
閱讀 2755·2019-08-23 13:42