排查Kubernetes容器不断连接MySQL,导致MySQL连接数饱和的问题->k8s抓包
1.检查MySQL连接数多的IP邮件收到监控报警,MySQL连接数过多,导致MySQL主机内存超载,达到98.45%mysql [(none)]> show processlist;发现同一个IP通过很多端口连接,但都是sleep状态如 1.2.3.4:48866连接检查MySQL客户端主机的连接切换到1.2.3.4主机netstat -anp|grep 48866发现没有记录,应该是1.2
·
1.检查MySQL连接数多的IP
邮件收到监控报警,MySQL连接数过多,导致MySQL主机内存超载,达到98.45%
mysql [(none)]> show processlist;
发现同一个IP通过很多端口连接,但都是sleep状态
如 1.2.3.4:48866连接
检查MySQL客户端主机的连接
切换到1.2.3.4主机
netstat -anp|grep 48866
发现没有记录,应该是1.2.3.4主机连接MySQL主机不成功,重新换了端口继续连接,直接抓白
tcpdump -i eth0 -vv -n tcp and dst mysql_server_ip
发现很多到MySQL的连接,而且不断切换端口连接,问题初步排查到
就是这台主机上的程序在不断重连MySQL Server
检查MySQL客户端主机上的那个程序
1.真正的客户端是1.2.3.4上的容器,也就是k8s中的pod,现在要找到是那个pod在不断重新连接MySQL
2.目前Kubernetes采用的Calico IPIP网络模式,每启动一个pod就会在对应主机启动一个对应的calico网卡,如cali1018a78cb62
3.那么模仿上一步抓包的方法,尝试所有的calico网卡,看那个网卡会有不断尝试连接MySQL Server的包
4.最后定位到是cali1018a78cb62
5.通过calico命令找到网卡所对应的pod
[root@master01 ~]# calicoctl.sh get workloadendpoint -a|grep cali1018a78cb62
prod portal-qz-web-8459586956-wgjj5 saasdb02 10.202.84.114/32 cali1018a78cb62
可见出问题的应用是portal-qz-web,告诉开发搞事情!
如果知道pod,如何抓这个pod的包?
- 查看指定 pod 运行在哪个宿主机上
kubctl describe pod <pod> -n mservice
- 获得容器的 pid
docker inspect -f {{.State.Pid}} <container>
或docker top 容器id
- 进入该容器的 network namespace
nsenter --target <PID> -n
- 使用 tcpdump 抓包,指定 eth0 网卡
tcpdump -i eth0 tcp and port 80 -vvv
- 或者直接抓包并导出到文件
tcpdump -i eth0 -w ./out.cap
- 从远程 scp 到本地
scp ruofeng@ipaddr:/home/ruofeng/out.cap ./
- 之后在 Wireshark 中可以打开文件非常直观得查看过滤抓到的数据。
参考链接
1.抓包
https://ruofeng.me/2018/09/19/capture-packets-in-kubernetes/
2.calico ipip网络
https://segmentfault.com/a/1190000016565044
更多推荐
所有评论(0)