在日常运维过程中经常需要根据pid查是哪个pod,或者需要查这个pod的进程id。比如我们查看某台 Kubernetes Node 节点负载高时候。通过 top
或者 pidstat
命令获取 Pid,
但是这个PID对应的是哪个POD容器导致的,这个时候就需要根据PID查询对应容器信息
kubectl describe pod <podName> -n <namespace>
或者是登录对应节点 通过如下命令查询
#节点是dockerd运行时
1. docker ps | grep <podName>
2. docker inspect <容器id> | grep -i pid
3. 或者使用这个命令:docker inspect <容器id> --format '{{.State.Pid}}'
#节点是containerd运行时
1. crictl pods | grep <pod名>,取第1列为pod_id
2. crictl ps | grep <pod_id>,取第1列为容器id
3. crictl inspect <容器id> | grep -i pid ,取第1行为容器pid
所有的进程都会在/proc/有自己的文件夹
1,通过 top
或者 pidstat
命令获取 Pid
例如进程:1042832
2,cat /proc/1042832/cgroup 显示的最后一列就是容器的id ,前面一部分是POD的UUID
cat /proc/1042832/cgroup
可以通过容器ID去查询容器,或者是通过POD的UUID去查看POD信息
例如:批量查下集群POD的uid
kubectl get pods -o custom-columns=Namespace:..metadata.namespace,podName:.metadata.name,podIP:.status.podIP,podStatus:.status.phase,nodeIP:.status.hostIP,Pod_ID:.metadata.uid,ContainerName:.spec.containers[*].name
示例:
[root@VM-249-107-tencentos ~]# kubectl get pods -o custom-columns=Namespace:..metadata.namespace,podName:.metadata.name,Pod_ID:.metadata.uid -A | grep 5c1369b0-2b65-4280-9b05-2475684a049b
输出:
default memory-request-limit-d66c5f9f8-dhr2t 5c1369b0-2b65-4280-9b05-2475684a049b
或者获取到容器ID
cat /proc/1042832/cgroup | head -1 | awk -F '/' '{print $5}' #进程ID 替换成自己查到的进程ID
docker inspect <容器ID> | grep -i pod
总结成一个脚本getPodName.sh ,提前需要安装q工具yum install -y jq
#!/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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。