背景
下面查询k8s集群里面容器里面直接连接consul server 8500 端口,不是通过agent api 获取consul里面数据。直接连接consul server 获取数据不是很好习惯,导致服务器负担太重, 连接太多问题,导致server服务性能下降。
consul-server $ netstat -an | grep 8500 | grep ESTABLISHED | sort
tcp 0 0 172.xx.x.3:8500 172.xx.x.118:39698 ESTABLISHED
tcp 0 0 172.xx.x.3:8500 172.xx.x.118:50612 ESTABLISHED
tcp 0 0 172.xx.x.3:8500 172.xx.x.14:53468 ESTABLISHED
tcp 0 0 172.xx.x.3:8500 172.xx.x.15:55434 ESTABLISHED
..
上面列举出172.xx.x.118
, 172.xx.x.14
, 172.xx.x.15
确定是k8s主机,由于这些k8s主机部署许多项目代码,逐个项目去定位比较耗费时间的。
解决方法
端口定位
端口定位,通过端口找出对应pid,通过pid找出对应容器。本来想到这个思路。
netstat 确认端口是否占用
172.xx.x.14$ sudo netstat -an | grep 39698
lsof 获取
172.xx.x.14$ sudo losf -i tcp:39698
很可惜,两种方法都不能获取到端口存在。没有通过端口定位。
连接跟踪表定位
由于端口失败了。容器对外连接,连接跟踪表contrack
管理的。尝试用contrack
工具去查询。下面contos安装contrack工具命令:
172.xx.x.14$ yum install conntrack-tools
通过下面命令筛选
172.xx.x.14$ sudo conntrack -L | grep "src=172.xx.x.3" | grep "8500" | grep ESTABLISHED
tcp 6 86390 ESTABLISHED src=10.xx.22.52 dst=172.xx.x.3 sport=57574 dport=8500 src=172.xx.xx.3 dst=172.xx.x.14 sport=8500 dport=57574 [ASSURED] mark=0 use=1
通过上面返回很清晰返回容器IP为10.xx.22.52
访问了,可以通过kubectl命令查找对应IP Pod
$ kubectl get pod -n <namespace> -o wide | grep `10.xx.22.52`
通过pod名称可以找到对应deployment,当然知道属于哪个项目。收工!!!