网页制作模板的网站代码,最新手机发布会,医疗类网站还有做seo,淮安企业网站制作在搭建Kubernetes集群过程中#xff0c;安装了kube-dns插件后#xff0c;运行一个ubuntu容器#xff0c;发现容器内无法解析集群外域名#xff0c;一开始可以解析集群内域名#xff0c;一段时间后也无法解析集群内域名。$ nslookup kubernetes.default Server: 10.99.0.2 …在搭建Kubernetes集群过程中安装了kube-dns插件后运行一个ubuntu容器发现容器内无法解析集群外域名一开始可以解析集群内域名一段时间后也无法解析集群内域名。$ nslookup kubernetes.default Server: 10.99.0.2 Address 1: 10.99.0.2 kube-dns.kube-system.svc.cluster.localnslookup: cant resolve kubernetes.default 排查过程 在排查问题前先思考一下Kubernetes集群中的DNS解析过程在安装好kube-dns的集群中普通Pod的dnsPolicy属性是默认值ClusterFirst也就是会指向集群内部的DNS服务器kube-dns负责解析集群内部的域名kube-dns Pod的dnsPolicy值是Default意思是从所在Node继承DNS服务器对于无法解析的外部域名kube-dns会继续向集群外部的dns进行查询过程如图。Ubuntu容器是一个普通的Pod在Linux系统中/etc/resolv.conf是存储DNS服务器的文件普通Pod的/etc/resolv.conf文件应该存储的是kube-dns的Service IP。nameserver 10.99.0.2 # 这里存储的是kube-dns的Service IP search default.svc.cluster.local. svc.cluster.local. cluster.local. options ndots:5 查看后发现/etc/resolv.conf文件中存储的是kube-dns的Service IP证明这一步没有问题接下来查看一下kube-dns的Pod先进入kube-dns的Pod中检查一下/etc/resolv.conf文件这里存储的应该是集群外部的DNS服务器地址查看后发现这里存储的地址是127.0.0.53进一步查看kube-dns Pod的log发现出现了非常多的i/o timeout错误。2018/07/11 07:12:47 [ERROR] 2 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. A: unreachable backend: read udp 127.0.0.1:55672-127.0.0.53:53: i/o timeout 现在基本上可以发现问题的原因了kube-dns只能解析集群内部地址而集群外部地址应该发给外部DNS服务器进行解析由于kube-dns Pod中的/etc/resolv.conf文件存储的DNS服务器地址是127.0.0.53127...*都是回环地址也就是集群外域名的DNS解析请求会再次发送回kube-dns导致形成一个循环这也是一秒钟会出现几十次i/o timeout日志的原因请求会不断的在kube-dns中循环kube-dns就像一个黑洞一样吃掉了所有dns解析请求不断累积的请求最终会导致整个集群的网络出现卡顿。为什么 虽然问题的原因找到了但是为什么kube-dns Pod中/etc/resolv.conf文件存储的DNS服务器是127.0.0.53kube-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中继承来的查看Node中的/etc/resolv.conf文件存储的DNS服务器地址确实是127.0.0.53那么下一个问题出现了在Node中发送DNS解析请求为什么不会产生回环的问题呢Node使用的是Ubuntu 18.04 Server在这个版本的系统中DNS解析请求并不是直接发给所在网络的DNS服务器的Ubuntu 18.04中有一个systemd-resolved服务为本地应用程序提供了DNS解析服务例如nslookup localhost解析程序从/etc/resolv.conf文件中找到DNS服务器127.0.0.53发送解析请求systemd-resolved会监听在53端口上捕获到解析请求后如果是自己可以解析的例如localhost会直接返回127.0.0.1如果不能解析才会发送给外部服务器而外部服务器的地址存储在/run/systemd/resolve/resolv.conf文件中这个文件是systemd-resolved服务器的配置文件过程如图。怎么破 理解了问题的来龙去脉解决问题的办法也就应运而生。在Kubernetes集群中kubelet是worker组建负责管理Pod根据kubernetes文档kubelet默认会从Node的/etc/resolv.conf文件读取DNS服务器地址使得dnsPolicy是Default的Pod得以继承kubelet中的--resolv-conf参数可以指定这个配置文件的地址。在Ubuntu 18.04中将这个参数设置为systemd-resolved的DNS服务器配置文件/run/systemd/resolve/resolv.confPod就会继承真正的外部DNS服务器。rootk8s-16.04:~# ll /etc/resolv.conf lrwxrwxrwx 1 root root 35 11月 23 19:17 /etc/resolv.conf - /var/run/NetworkManager/r