在Kubernetes集群的节点上通过PID找到对应的容器服务

80 阅读1分钟

为什么会通过PID来找对应的容器?

有一天收到一条主机线程数达到30760的告警,然后通过监控排查到是JAVA的进程。但在Kubernetes集群下一台主机会运行很多JAVA进程,Kubernetes 使用容器运行时和 CRI(Container Runtime Interface)来管理容器,它们负责容器的创建、销毁和管理,使得容器的 PID 与宿主机的 PID 之间的映射变得复杂,那么如何找到哪个容器服务占用线程数较高呢?

扩大主机PID的方法: juejin.cn/post/719502…

Containerd客户端:juejin.cn/post/724964…

有效的方法

  • 找PID占用线程数
pids=$(ps -ef|grep java |awk '{print $2}' |xargs)
for pid in $pids
do
  echo $pid
  cat /proc/$pid/status | grep Threads
done
  • 通过CGroup找到容器ID
cat /proc/21277/cgroup

image.png

  • 查看容器信息
nerdctl -n k8s.io  inspect 8e18da8ba12d90a782b3acbd09dd31609c08617e6eb3a226f6ed77bd46075c8d

image.png

找到容器的镜像信息,也就找到是哪个服务了。