搭建k8s集群时DNS无法解析问题的处理过程

问题描述

在搭建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: can't 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](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

现在基本上可以发现问题的原因了,kube-dns只能解析集群内部地址,而集群外部地址应该发给外部DNS服务器进行解析,由于kube-dns Pod中的/etc/resolv.conf文件存储的DNS服务器地址是127.0.0.53,127...*都是回环地址,也就是集群外域名的DNS解析请求会再次发送回kube-dns,导致形成一个循环,这也是一秒钟会出现几十次i/o timeout日志的原因,请求会不断的在kube-dns中循环,kube-dns就像一个黑洞一样,吃掉了所有dns解析请求,不断累积的请求最终会导致整个集群的网络出现卡顿。

为什么

虽然问题的原因找到了,但是为什么kube-dns Pod中/etc/resolv.conf文件存储的DNS服务器是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中继承来的,查看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.conf,Pod就会继承真正的外部DNS服务器。

总结

通过对问题的探究,也理解了Kubernetes集群中DNS解析的完整过程,如图。

** 在Ubuntu 16.04中也是类似的逻辑,只不过systemd-resolved换成了dnsmasq,监听地址是127.0.1.1*
** 在具体实践过程中,也顺便探究了CoreDNS和KubeDNS架构和解析逻辑上的区别,不过不在此问题的讨论范围,有兴趣的朋友可以自己看一下。*
** 如果Kubernetes集群是安装在NAT网络下的虚拟机上,虚拟机(也就是Kubernetes集群中的Node)中/etc/resolv.conf文件可能被修改为NAT的地址,也就不会出现上面这个问题。*

参考内容

https://www.jianshu.com/p/590a8dfdf9a9

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

k8s集群DNS无法解析问题的处理过程相关推荐

  1. k8s集群dns问题解决办法

    k8s集群dns问题解决办法 目录 故障类型 解决办法 测试脚本 busybox sh 故障类型 我遇到的几次k8s集群的dns问题,大致分为几种: 网络插件的pod挂掉了 服务是双网卡的情况 服务器 ...

  2. k8s集群coredns无法解析外部域名

    1. 问题现象 公司内部SaaS产品运行在阿里云kubernetes环境,使用阿里云[标准托管版]进行部署使用,[标准托管版] 版就是用户只需要自己运维k8s node节点,master节点由阿里云进 ...

  3. K8S集群应用市场安装部署:第一篇

    这里是引用 操作系统要求 服务器配置信息 基础环境部署 3.1. NTP时钟源同步 3.2. 关闭firewalld服务 3.3. 关闭SElinux服务 3.4. 系统调优配置 3.5. 开启IP转 ...

  4. 项目四 CentOS使用kubeadm部署工具部署测试环境的K8s集群---Kubectl命令使用以及安装dashboard界面

    大家好,我是SuieKa.在之前呢有幸学习了马哥教育提供的K8s入门指南以及视频.初来乍到,写一篇关于K8s的介绍以及部署测试环境使用的K8s集群. 树 @·K8s入门简单介绍 一.K8s(Kuber ...

  5. 【好文收藏】K8S集群部署CoreDNS服务

    K8S集群部署CoreDNS服务 k8s集群中的应用通常是通过ingress实现微服务发布的,前文介绍过在K8S集群中使用traefik实现服务的自动发布,其实现方式是traefik通过集群的DNS服 ...

  6. vmware 搭建k8s无法ping通子节点_一波四折 —— 记一次K8S集群应用故障排查

    一波四折--记一次K8S集群应用故障排查Part1 初露端倪 一个周四的下午,客户的报障打破了微信群的平静. "我们部署在自建K8S集群上的应用突然无法正常访问了,现在业务受到了影响!&qu ...

  7. 手把手一起 图形化安装 k8s 集群

    作者 | 小碗汤 来源 | 我的小碗汤 今天接着上一节,使用 KuboardSpray 图形化安装kubernetes集群[1],记录了安装时可能遇到的问题.对此项目感兴趣的同学,不妨亲手实践一下~ ...

  8. 纯手工搭建k8s集群-(二)核心模块部署

    1. 部署ETCD(主节点) 1.1 简介 kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等.都需 ...

  9. keepalive+nginx高可用K8S集群部署

    1.准备工作 1.1集群部署规划 K8S集群角色 节点IP 节点名称 OS 控制节点 192.168.0.180 k8smaster1 Centos7.9 控制节点 192.168.0.181 k8s ...

最新文章

  1. postgresql存储过程输出参数
  2. java EE的apache-tomcat配置文件web.xml
  3. Dribbble for windows phone 8
  4. python3.7安装wordcloud_Python中的wordcloud库安装问题及解决方法
  5. python中chr函数的用法_python中hex,oct,chr,ord函数讲解
  6. 一个SAP开发人员的养蚕流水帐
  7. jupyternotebook虚拟环境无法连接服务_详解pycharm连接远程linux服务器的虚拟环境的方法_python...
  8. 依赖注入的三种方式_Java核心知识 Spring原理十 Spring 依赖注入四种方式
  9. 旅行线路定制主题响应式手机模板
  10. Ubuntu 16.04 安装 VMware-Workstation-12
  11. ANSI,Unicode,UTF-8网页编码的区别【转】
  12. Android TextView滚动的两种方案
  13. 困计算机无法启动adb,win7系统无法启动adb.exe工具包的解决方法
  14. 从零开始学习音视频编程技术(十三) 录屏软件开发之屏幕录像
  15. 信息孤岛的形成与治理
  16. 网页删除mysql数据库_网站数据库被删除了
  17. 使用EasyExcel实现Excel的导入、导出、下载模板等功能
  18. Android Telephony纲要
  19. android 模拟器监听短信,android模拟器用命令和DDMS模拟来电和短信
  20. protues VSM 图形仿真帮助

热门文章

  1. python3精要(6)-数字,分数,除法
  2. python3精要(55)-模块,私有方法
  3. 【机器学习】怎样将Embedding融入传统机器学习框架?
  4. 【NLP】创建强大聊天机器人的初学者指南
  5. 【Python基础】50个令人大开眼界的 Matplotlib 可视化项目
  6. Kaggle知识点:时序数据与Embedding
  7. 反光衣识别算法冠军方案总结(附源码)|极市打榜
  8. 显著改善分割预测,ETH开源基于情景图储存网络的视频目标分割|ECCV2020
  9. 技术实践 | 聊聊网易云信的信令网络库实践
  10. 互联网1分钟 |1220