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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐