hello云胜

技术与生活

0%

在运维过程中经常需要根据pid查是哪个pod,或者需要查这个pod的进程id。

比如我们收到监控报警,某台 Kubernetes Node 节点负载高。通过 top 或者 pidstat 命令获取 Pid

查询某个pod的进程PID

1
kubectl describe pod xxxpod

![image-20230919135218465](D:\github\docs\云原生\k8s\pod name与pid互查.assets\image-20230919135218465.png)

找到其运行的node节点和docker容器id。

快捷操作:

1
kubectl get pod busybox -o=jsonpath='{.status.containerStatuses[0].containerID}'

ssh到该node节点执行

1
docker inspect 容器id --format '{{.State.Pid}}'

如果是containerd

1
crictl inspect 容器id | grep -i pid

根据PID查询pod name

根据所有的进程都会在/proc/有自己的文件夹。

比如PID是22586

![image-20230919162950598](D:\github\docs\云原生\k8s\pod name与pid互查.assets\image-20230919162950598.png)

cat /proc/22586/cgroup 显示的最后一列就是容器的id

把他截取出来

1
cat /proc/22586/cgroup | head -1 | awk -F '/' '{print $5}'

然后就可以docker inspect了

1
docker inspect d569f04a

![image-20230919164622876](D:\github\docs\云原生\k8s\pod name与pid互查.assets\image-20230919164622876.png)

在Config.Labels下可以看到pod的name和namespace

总结成一个脚本getPodName.sh

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env bash

get_pod_name() {
CID=`cat /proc/${pid}/cgroup | head -1 | awk -F '/' '{print $5}'`
CID=$(echo ${CID:0:8})
podname=$(docker inspect $CID | jq '.[0].Config.Labels."io.kubernetes.pod.name"')
ns=$(docker inspect $CID | jq '.[0].Config.Labels."io.kubernetes.pod.namespace"')
echo $ns:$podname
}

pid=$1
get_pod_name

用到了jq工具,需要提前安装

1
yum install -y jq