背景:日常运维工作中,经常会遇到机器负载过高的情况,可能是由于某些进程消耗了过多的 CPU 或内存资源。我们需要首先查看运行在节点上的进程,并确定哪些进程造成了负载过高的情况。一种常见的做法是使用进程 ID(PID)来反查相关的 Pod 名称,这样可以帮助我们定位到具体的服务。
相关工具:crictl、jq
1、获取进程的 PID
在宿主机上,使用 ps、top 或 pidstat 等命令找到你想要查询的进程的 PID
2、查找容器 ID(当容器运行时为containerd时)
通过查看 /proc/<PID>/cgroup 文件来找到与进程关联的pod的uid。这个文件通常会包含容器的完整 cgroup 路径
3、查看pod id和name
当容器运行时为containerd时
#传递正确的 containerd.sock路径与第二步获取的pod uid
#方法1
crictl -r unix:///data/containerd/data/containerd.sock pods -q | while read -r pod; do
if crictl -r unix:///data/containerd/data/containerd.sock inspectp "$pod" | grep -q "749bcf4a_fa3b_4c44_a891_49d9857aad1d"; then
name=$(crictl -r unix:///data/containerd/data/containerd.sock inspectp "$pod" | jq -r '.info.config.metadata.name')
echo "Pod ID: $pod, Name: $name"
fi
done
#方法二
#进入master节点
#传入指定的nodeName和uid,过滤该节点所有pod找到指定的pod
kubectl get pods --all-namespaces --field-selector spec.nodeName=10.167.0.11 -oyaml |grep -C 10 749bcf4a_fa3b_4c44_a891_49d9857aad1d
当容器运行时为docker时,不需要第二步获取podID
#进入到目标节点
docker ps -q |xargs docker inspect --format '{{.State.Pid}}, {{.Name}}'|grep 进程PID