背景

下面查询k8s集群里面容器里面直接连接consul server 8500 端口,不是通过agent api 获取consul里面数据。直接连接consul server 获取数据不是很好习惯,导致服务器负担太重, 连接太多问题,导致server服务性能下降。

  1. consul-server $ netstat -an | grep 8500 | grep ESTABLISHED | sort
  2. tcp 0 0 172.xx.x.3:8500 172.xx.x.118:39698 ESTABLISHED
  3. tcp 0 0 172.xx.x.3:8500 172.xx.x.118:50612 ESTABLISHED
  4. tcp 0 0 172.xx.x.3:8500 172.xx.x.14:53468 ESTABLISHED
  5. tcp 0 0 172.xx.x.3:8500 172.xx.x.15:55434 ESTABLISHED
  6. ..

上面列举出172.xx.x.118, 172.xx.x.14, 172.xx.x.15确定是k8s主机,由于这些k8s主机部署许多项目代码,逐个项目去定位比较耗费时间的。

解决方法

端口定位

端口定位,通过端口找出对应pid,通过pid找出对应容器。本来想到这个思路。

netstat 确认端口是否占用

  1. 172.xx.x.14$ sudo netstat -an | grep 39698

lsof 获取

  1. 172.xx.x.14$ sudo losf -i tcp:39698

很可惜,两种方法都不能获取到端口存在。没有通过端口定位。

连接跟踪表定位

由于端口失败了。容器对外连接,连接跟踪表contrack管理的。尝试用contrack工具去查询。下面contos安装contrack工具命令:

  1. 172.xx.x.14$ yum install conntrack-tools

通过下面命令筛选

  1. 172.xx.x.14$ sudo conntrack -L | grep "src=172.xx.x.3" | grep "8500" | grep ESTABLISHED
  2. 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

  1. $ kubectl get pod -n <namespace> -o wide | grep `10.xx.22.52`

通过pod名称可以找到对应deployment,当然知道属于哪个项目。收工!!!