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

5d77e664d458388a9bbb5e4f332d14b3.giff8d5bfbb01a578ba16595206a43c52f9.png一波四折5d77e664d458388a9bbb5e4f332d14b3.gif——记一次K8S集群应用故障排查446ef5d5f03849b4e68407f31a1202c4.pngPart1 初露端倪eba7e0a1d1246ed48f0cbe6436e54f34.png64dd880342ce5bac814daf7dab57a810.gif

一个周四的下午,客户的报障打破了微信群的平静。

“我们部署在自建K8S集群上的应用突然无法正常访问了,现在业务受到了影响!”

收到客户的报障,我们立刻响应,向客户了解了问题现象和具体报错信息。

客户反馈K8S集群部署在云主机上,K8S的应用pod example-app通过访问外部域名example-api.com调用接口,同时访问云数据库做数据查询后将结果返回客户端。客户排查应用pod日志,日志中有如下报错:

ee860c5f1fbb41c832378364e9a292d0.png

可以看到最关键的信息是Name or service not known。该报错一般为域名无法解析导致的。

由于客户的应用pod只访问example-api.com这一个外部域名,因此判断应该是pod解析该域名时出现异常。为了进一步验证,我们执行kubectl exec -it example-app /bin/sh命令进入pod内执行ping example-api.com命令,果然出现了相同的报错。

ea0742bd3aae2ea2679756f8e41cd74e.png

因此可以确认应用日志中的报错是域名解析失败导致的。

执行kubectl get pod example-app -o yaml|grep dnsPolicy查看pod的dns策略,是ClusterFirst模式,也就是pod使用K8S集群的kube-dns服务做域名解析。

执行命令kubectl get svc kube-dns -n kube-system,确认kube-dns服务的clusterIP是192.168.0.10 查看pod内的/etc/resolv.conf文件,nameserver设置的正是该IP。再执行kubectl describe svc kube-dns -n kube-system|grep Endpoints,可以看到dns服务关联了一个coredns pod作为后端。

执行kubectl get pods -n kube-system|grep coredns看到kube-dns关联的coredns pod处于running状态。

再执行kubectl logs coredns –n kube-system,看到pod日志中有大量和客户配置的外部dns服务器IP地址通讯超时的报错。

1fbea157373c7fec3a7e2efa13d8ce7e.png

10.16.16.16和172.16.16.16为客户自建DNS服务器的IP地址

。为了确认是否是DNS服务器有问题,我们在example-app pod中分别执行nslookup example-api.com 10.16.16.16和nslookup example-api.com 172.16.16.16,均能解析出正确的IP地址。

因此判断问题应该出在coredns pod上。此时我们发现,coredns pod的状态变成了crashloobbackoff,稍后又变成了running。

观察一段时间后发现pod在这两个状态之间反复切换。鉴于整个集群只有一个coredns pod,我们修改了coredns的deploy,将pod副本数调至2,新扩的pod一直处于running状态,pod日志中也没有出现和10.16.16.16、172.16.16.16的通信超时的报错。而此时example-app pod也可以正常解析域名了!可以确认之前是集群唯一的coredns pod状态异常导致集群DNS服务不可用。

那么coredns pod为什么会出现异常呢?

再次查看异常的pod日志,发现除了和外部DNS服务器有通讯超时的记录,还有和集群api-server通讯超时的记录。因此有必要怀疑是pod所处的网络有问题。在客户的K8S集群网络规划中,pod使用和集群node不同的子网通讯。通过在K8S节点云主机上绑定pod子网的弹性网卡,在网卡上给节点的pod在pod子网中分配IP,实现pod的网络可达。

由于example-app pod是可以与外部通讯的,因此pod子网层面是没有问题的。我们将焦点移至coredns pod使用的弹性网卡上。弹性网卡在节点云主机操作系统中的设备名是eth1,pod子网网关是10.176.96.1在节点上执行ping -I eth1 10.176.96.1,结果如图:

1d0e8a08e2e223bcc5bd651687d8e230.png

可见云主机无法通过eth1 ping通子网网关,而且找不到eth1设备。执行ifconfig命令发现eth1设备没有被系统识别到。而弹性网卡底层是被正常挂载到云主机上的。

手动执行echo 1 > /sys/bus/pci/rescan命令重新扫描弹性网卡,发现eth1出现了,此时执行ping -I eth1 10.176.96.1也可以ping通了!而异常的coredns pod也恢复了正常。判断之前应该是系统异常导致的网卡没有被识别到导致。

通过这一问题也提醒我们如果集群需要使用kube-dns服务,coredns的pod一定要配置多副本,以免单个pod异常导致集群DNS不可用。

446ef5d5f03849b4e68407f31a1202c4.pngPart2 一波刚平一波又起eba7e0a1d1246ed48f0cbe6436e54f34.png64dd880342ce5bac814daf7dab57a810.gif

域名解析的问题解决,本以为已经结案,谁知新的问题接踵而来。客户调用应用,不再报错域名解析失败。但是仍然不能正常返回结果。排查应用日志,报错如下:

eb74864bf1b6c0dae5f3fb9ac3b37b4e.png

通过报错判断是应用pod连接云数据库超时导致。排查云数据库所在子网的路由、ACL和白名单设置,均无异常。连接pod后可以ping通数据库域名,判断pod与数据库的网络链路是正常的。但是pod内无法telnet通数据库域名的3306端口,判断这就是导致连接数据库超时的原因了!

排查pod内的防火墙,没有开启。pod所在的子网ACL,没有限制。表面的分析没有任何线索,于是只能祭出网络问题排查的经典手段——tcpdump抓包!

由于pod内的容器一般CPU、内存、网络资源和存储空间有限,在pod内抓包会占用大量资源和存储空间,抓包结束后数据包取出也比较繁琐。而且有的容器镜像是无法安装tcpdump工具的。所以通常我们不会在容器内抓包。

基于K8S集群的网络架构,pod的网络通讯是通过所在节点云主机的辅助弹性网卡收发数据的。因此我们只要在pod所在节点云主机上对相应的网卡进行抓包即可。

在客户的场景下,应用pod使用所在节点的eth1网卡,所以pod telnet云数据库的3306端口时,我们直接在节点上抓取eth1网卡上与云数据库IP交互的数据包即可。

pod的IP是10.176.98.29,云数据库的IP是10.176.46.4。在pod的容器内执行telnet 10.176.46.4 3306,同时在节点上执行tcpdump -i eth1 host 10.176.46.4 -w /tmp/mysql.cap。pod内telnet超时后,我们结束抓包,将cap文件取出后发现居然一片空白,一个包都没有抓到!

这不科学!

之前pod内可以ping通云数据库,说明一定有数据包从pod所在云主机发出并收到了回包。为了验证pod telnet请求的包是否正常发出,我们干脆不把抓包范围局限在eth1网卡,而是使用tcpdump -i any host 10.176.46.4 -w /tmp/mysql.cap对云主机所有网络接口抓包。这次终于抓到了数据包,发现telnet发出后,没有收到数据库的任何回包。

bcc7a56671a0e56b08813c79284477e8.png

在telnet的同时,集群中有其他pod可以正常连接云数据库,所以因为云数据库侧异常导致没有回包的可能性不大。云主机可以和外界通讯的网卡只有eth0和eth1,莫非……为了验证我们的猜想,在telnet时,节点上执行tcpdump -i eth0 host 10.176.46.4,果然看到了pod发出的到云数据库的数据包!

af052e2de32c44b18b973ad310699ccc.png

所以pod 容器telnet不通云数据库3306端口的原因也真相大白了。因为pod telnet云数据库的数据包没有走eth1,而是走了eth0,数据包发送至云数据库后,云数据库的回包发给了pod的子网网关。

SDN网络OVS判断来包是从node子网网关发出(eth0),而回包却是发往pod子网(eth1)源和目的地址不一致,因此将数据包丢弃。pod也就无法收到数据库的回包了。之前可以ping通是因为ICMP协议是代答的,即使源和目的地址不一致,也可以正常收到回包。

那么,pod的所有网络请求正常是应该通过云主机上的辅助网卡收发的,为什么走了云主机主网卡了呢?正常的K8S集群节点上配置了table 2路由规则,定义了pod的网络请求默认路由的下一跳是pod子网网关,并且走辅助网卡,如下图所示:

71eb2a69b6bd34fe51a4fedb57390fa3.png

而在客户的应用pod所在节点执行ip r show table 2,我们看到的结果和第一次抓包一样,空空如也。。。

路由是由K8S集群的网络插件维护,路由缺失问题在网络插件日志中没有发现任何线索,具体原因不得而知。当务之急是修复问题。

可以通过重启ipamd容器恢复table 2路由。

执行docker ps | grep ipamd | grep sh找到ipamd的容器ID。

然后执行docker restart 容器ID重启容器。

再次执行ip r show table 2,终于看到了路由规则!

Finally,此时在应用pod内测试可以telnet通云数据库的3306端口。客户的应用调用也终于可以成功返回结果。

然鹅,如果各位看官觉得这个case到这里就结束了,那就和当时排障的攻城狮一样图样图森破了。

446ef5d5f03849b4e68407f31a1202c4.pngPart3

慢=不可用

64dd880342ce5bac814daf7dab57a810.gif

就在攻城狮以为一切都恢复正常时,客户的追加反馈表明这个问题只是进入了下一个阶段。

客户反馈应用虽然可以正常调用,但是一次调用要超过一分钟才能有返回结果,之前正常的速度是仅需几秒就可以返回结果。现在这样的速度完全不能满足业务要求,相当于还是不可用的。

问题尚未解决,攻城狮仍需努力!

分析应用调用返回慢的问题,一是着眼于应用流程的各个环节,如客户端,服务端对业务请求的处理时间,另外一个就是排查数据传输链路是否有延迟。在客户的场景下,就是确认pod和云数据库在处理请求上是否有瓶颈,还有就是pod到云数据库之间的网络传输是否有延迟。在pod内ping云数据库IP,没有超时丢包,延迟很低。

b9c75a400bef1875e429d557f08056c2.png

要想确认pod和云数据库在处理请求时的时长,还是要依靠tcpdump工具抓包分析。于是我们在pod对数据库发起一次完整的请求过程中,依然使用tcpdump -i eth1 host 10.176.46.4 -w /tmp/mysql.cap命令在pod所在节点抓包。将数据包取出后分析发现,一次完整的业务请求,pod会对数据库做13次查询。对比第一次查询和最后一次查询的时间,如图所示:

1ddf0436527554d9cd2eab78c57156a4.png

可以发现13次请求用了1分钟左右,与业务调用耗时吻合。排查云数据库监控,发现内存

使用接近100%

4b3264813aec506c0b45aef7bdb1ce38.png

同时实例慢查询日志中有大量慢sql记录,可以看到几乎每次查询都耗时较长

64c69a811499a2910bd94d44a35d1782.png

可见如果业务调用的13次请求,每次都是慢查询,耗时4秒左右,就会导致我们看到的完整请求耗时一分钟左右。

因此判断瓶颈应该主要在云数据库上,建议客户对数据库慢查询进行优化,降低内存负载。然后观察应用调用时长是否恢复正常。

446ef5d5f03849b4e68407f31a1202c4.png

part4 问题的真相只有一个!

64dd880342ce5bac814daf7dab57a810.gif

当我们天真地以为优化完数据库慢查询后,一切就都尘埃落定时。客户的反馈几乎让人崩溃——优化慢查询后,数据库内存使用已降至30%,慢日志中也几乎没有慢sql记录。而应用的调用时长仍然没有缩短!

一定还有哪个环节有疏漏。

为了完整了解应用pod在应用调用过程中都产生了哪些数据交互,我们决定再次抓包分析,但焦点不再集中在云数据库上,而是以pod维度进行抓包。使用tcpdump -i eth1 host -w /tmp/app.cap命令在pod所在节点抓取所有和pod相关的包,分析数据包后果然有了新的发现:pod与100.64.249.132这个地址有文件传输交互。

224f826920ed588d3d2ff88c1d69eaea.png

查看数据包详细数据发现这个地址是OSS对象存储解析到的域名!pod还会与oss传输文件这个重要环节在此前是不知道的,客户也没有主动告知。

这也提醒我们在分析应用问题时,务必要搞清完整的业务调用流程,应用架构和涉及到的产品环节,否则挤牙膏似的信息输出和被问题现象牵着鼻子走,会浪费大量时间,甚至严重阻碍问题排查。

我们在pod内测试ping 100.64.249.132,延时非常感人。

ab5a8999f54b00c1d42bea89c61b8634.png

与客户确认,客户反馈OSS域名解析的IP貌似不对。在业务架构规划时,为了保证客户pod与oss的网络性能,配置了通过专线连接oss。当前解析的IP没有走专线网段,而是走了普通的网段,无法满足性能要求。正常走专线的域名解析IP应该是10.219.226.2。

但是域名解析为什么会出现问题呢?

各位童鞋是否还记得part1中我们提到客户的pod使用的是kube-dns提供的dns解析,而kube-dns配置的上游服务器是客户自建的dns服务器?经过客户测试发现,自建dns服务器对oss域名的解析就是100.64.249.132。应该是近期客户侧维护dns服务器的时候误操作修改了解析导致的。。。将自建dns服务器的域名解析地址修改回正确地址后。再次在pod内测试,结果如下:

821dddb3c2b3d152e1734e0f844a5e77.png

再次测试应用调用,终于恢复到了正常的时长!可喜可贺!

7a35d7ac9c059dbc36d68d55949b2e94.gif

 至此客户的问题卍解,总结问题排查过程,有几点值得分享:

1、  k8s集群如果使用kube-dns服务,coredns pod务必配置多副本,避免单点故障导致集群dns服务不可用。

2、  排查K8S集群pod网络问题时,可以在pod所在节点抓取pod使用的辅助网卡的相应网络数据包,避免直接在pod内抓包。

3、  应用系统性能排查涉及到各个节点设备和网络传输,务必了解清楚完整的系统架构,调用流程,再针对涉及的每个环节逐一分析。

7a35d7ac9c059dbc36d68d55949b2e94.gif

以上就是一次“波折”的K8S应用问题排查过程,感谢各位童鞋阅读,如果能够对大家有所帮助,欢迎点赞转发评论。关注我们的公众号,更多精彩内容会持续放送!

a01b48eb4a17e78123dac3a6b26e3146.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python有趣的简单代码_简单几步,100行代码用Python画一个蝙蝠侠的logo

转自:菜鸟学Python蝙蝠侠作为DC漫画的核心人物之一,一直都受到广大粉丝的喜爱,而笔者作为DC的铁杆粉丝,自然也是老爷(粉丝对蝙蝠侠的昵称)的支持者。今天,笔者就用Python来画一个蝙蝠侠的logo,大概就是下图…

iis7php怎么301重定向,iis7/8设置网站301重定向的方法

准备条件:a、一台装有win2008以上版本的服务器 b、iis启用并且运行正常 c、在网站程序存放目录中单独创建个目录,目录里面留空即可(为了方便区分,目录名称可以设置为站点名称301,例如fcblog_301)1、打开Internet信息服务…

结构体内元素不确定_查漏补缺!高中三年生物最易忽略、易错的30个知识点整理不容错过...

高中生物的知识体系基本上是由大约数十个核心概念为基础构建起来的,这些概念包括细胞、细胞分裂、光合作用、呼吸作用、基因、染色体、遗传、变异、进化、生化系统等等,今天学姐来帮助你们整理一下高中三年中最容易忽略,也是最容易出错的30个…

基于单片机超声波测距系统的设计_一种基于UWB技术实现的测距防撞系统

叉车被广泛应用于工厂车间、仓库、流通中心和配送中心等,大大提高了对成件托盘货物进行装卸、堆垛和短距离运输作业的运输效率,几乎是所有车间必不可少的运输工具。但目前,简单方便的同时,安全事故(剐蹭、碰撞、碾压、撞车等)却也…

vb.net中递归退到最外层_数组中的逆序对

题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的…

java实现条形图,JavaFX条形图

本文概述通常, 条形图可以定义为使用矩形条形表示数据的图。条的长度表示绘制在其中一根轴上的精确数值数据值。矩形条可以在图表上水平或垂直绘制。在下图中, 条形图显示了工程各个分支中的学生人数。 X轴是类别轴, 显示了不同的分支, 而Y轴是数字轴, 显示了特定分支中的学生人…

php excel 垂直居中,完美实现文字图片水平垂直居中

垂直居中是一个历史悠久的大问题,要做到兼容所有浏览器少不了要花点时间,网上也流传了很多解决方案,但没发现比我现在用的方案更完美,至少在我的项目是如此。项目中要用到垂直居中而碰到兼容性问题的,一般都是以下几种…

cd短是什么意思_每日命令|pwd、cd

01 命令简介上回说到《每日命令 | ls》,今天我们来说一说pwd命令和cd命令。pwd命令——返回当前工作目录名称。cd命令——改变工作目录。什么是工作目录?举个例子:我在北京上班,那我的工作地点就是北京;后来我到上海上…

sql 查询表结构_SQL查询语句的完整结构解析

SELECT语句完整的句法模板:SELECT [DISTINCT] FROM [ JOIN ON ][WHERE ][GROUP BY [HAVING ]][ORDER BY ,...]上述句法模版中的[ ]表示该部分可选。SELECT整个语句的执行过程为:(1) 读取FORM子句中表、视图的数据。(2) 存在连接表时&…

基于matlab实现的云模型计算隶属度,基于MATLAB实现的云模型计算隶属度

”云”或者’云滴‘是云模型的基本单元,所谓云是指在其论域上的一个分布,可以用联合概率的形式(x, u)来表示云模型用三个数据来表示其特征期望:云滴在论域空间分布的期望,一般用符号Εx表示。熵:不确定程度…

二陈丸配什么吃不上火_宝妈一个人带孩子是什么感觉?前三种场景,不知道是怎么熬过来的...

导语:很多人认为一个家庭主妇很轻松,每天就带带孩子,其他什么都不需要做,远远没有那些人说的那么辛苦,无论是老公还是很多婆婆都认为是在家享福呢,经常就会甩出一句话“每天不就带个孩子吗?至于…

php怎么分割页面,将一个页面分成多个html文件(静态html分割页面)

静态html分割页面,达到类似PHP等动态页面的include引入页面效果。用html把首页分成三个文件web.png在PHP、JSP等动态页面开发中,页面里引入其它页面只需include()进来就可以实现页面的分离。如果用HTML,也是可以实现页面的分割的。两种方法&a…

zbar扫描无法近距离扫码_生意好时最怕收银出故障,这几个扫码枪的常见问题你一定要知道...

文|杭州丰收收不怕生意不够好,就怕生意好时收银出故障。这几天丰收收经常接到询问,说自己商铺所在的位置信号非常不好,很多客户等了很久没法付款,索性就不买了。看着上门的生意就这么走了,心里很不是滋味。遭遇这种经历…

你觉得外观模式和代理模式的联系和区别是什么?_GoF23种设计模式

UML泛化(继承非抽象类):带空心三角形的直线表示实现(继承抽象类,类实现接口):带空心三角形的虚线表示依赖:类与类之间最弱的关系,依赖可以简单的理解一个类使用了另一个类…

反注入技术:防范非法 Call 调用的探讨

DLL 注入是一种常见的技术,用于向目标进程注入外部的动态链接库(DLL),以执行某些特定的操作。这种技术在恶意软件、游戏作弊等场景中被广泛使用,因此,研究和实施一些反注入技术对于提高应用程序的安全性是至…

tp5 php跨域,TP5.1解决跨域

TP5.1解决跨域博客说明文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!介绍在前后端分离开发的时候就会遇到跨域的问题,在本地调试的时候可能不…

如何避免_如何避免变频器受负载冲击

电工学习网:www.diangon.com关注电工学习网官方微信公众号“电工电气学习”,收获更多经验知识。为了保障变频器的安全运行,避免变频器受负载冲击,必须做好以下几点:㈠尽量保证变频器有充足的加减速时间变频器在开机或升速时&#…

哪种语言 连接 oracle,Go语言连接Oracle(就我这个最全)

综合参考了网上挺多的方案倒腾了半天终于连接好了Go都出来这么多年了还没有个Oracle的官方驱动。。。过程真的很蛋疼。。一度想放弃直接连ODBC首先交代一下运行环境和工具版本:WIN10MINGW64ORACLE INSTANCCLIENT_18_3 x64Jetbrins Goland看完这篇文章,…

补丁程序正在运行_针对微软4月14日更新补丁会导致蓝屏问题的检测及解决方法...

近期,我们接连收到用户求助,在使用电脑过程中会突然出现蓝屏问题,经火绒工程师分析发现,大部分用户出现蓝屏问题,是因为安装了微软于4月14日推送的补丁所致(详见下图)。目前微软方面表示正在调查相关问题。Win10系统蓝…

商城html源码_Java开源商城源码推荐,从菜鸡到大神,永远绕不开的商城系统

每个Java程序员,从懵逼菜鸡,再到懵懂菜鸟,再到小鸟,大鸟,最后到技术大神,始终绕不开商城系统,里面蕴含了大量的业务,涉及到了大量的知识点和解决方案。今天锋哥介绍一款Java开源商城…