场景:
应用服务通过docker-compose部署的,部分服务的以host网络模式运行,通过从top命令中获取的PID无法直接获取到对应的容器名称,经分析测试后可通过父进程查找
非host网络模式可直接通过以下命令查找容器名称
docker inspect -f "{{.Id}} {{.State.Pid}} {{.Name}} " $(docker ps -q) | grep <PID>
host网络模式可直接通过以下命令查找容器名称
- 通过top命令获取进程PID
- 获取对应进程PID的父进程
ps -ef | grep -v grep | grep <PID> | awk '{print $3}'
- 通过上一步的父进程获取容器名称
docker inspect -f "{{.Id}} {{.State.Pid}} {{.Name}} " $(docker ps -q) | grep <PID>
通过进程ID查找k8s pod名称
docker inspect -f "{{.Id}} {{.State.Pid}} {{.Config.Hostname}}" $(docker ps -q) | grep <PID>
通过服务端口查找容器名称
docker inspect -f "{{.Id}} {{.State.Pid}} {{.Name}} {{.Config.ExposedPorts}}" $(docker ps -q) | grep <PORT>
pod按内存排序
docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" | sort -k 4 -h
pod按CPU排序
docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" | sort -rk 3 -h
查看节点污点
for i in $(kubectl get nodes --kubeconfig kube.conf | grep -v "NAME" | awk '{print $1}'); do kubectl describe node/$i --kubeconfig kube.conf| egrep -A 2 '(Taints|projectcalico.org/IPv4Address)'; printf %b "--------------------\n";done
通过procfs查找进程所属容器
[root@10-0-0-23 ~]# cat /proc/4695/cgroup
11:hugetlb:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
10:pids:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
9:devices:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
8:memory:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
7:perf_event:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
6:cpuset:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
5:net_cls:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
4:blkio:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
3:freezer:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
2:cpu,cpuacct:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
1:name=systemd:/kubepods/besteffort/poddf86fa43-8f50-42fa-9255-c5601b2b1ef8/0465f4dffc02a59db47a498f08c659182a30a3ce25c6b6124489a81192d130fc
[root@10-0-0-23 ~]#
[root@10-0-0-23 ~]# crictl ps | grep 0465f4dffc
0465f4dffc02a 91335b349f60a 8 months ago Running datacollection 1 6e573a3470477
通过反复查找ppid获取容器名
docker运行时:
#!/bin/bash
cpid=$1
while true; do
ppid=$(ps -o ppid= -p $cpid)
pname=$(ps -o comm= -p $ppid)
if [ "$pname" == "docker" ]; then
echo "$cpid parent $ppid ($pname)"
break
else
echo "$cpid parent $ppid ($pname)"
cpid=$ppid
fi
done
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep $cpid
containerd运行时:
#!/bin/bash
cpid=$1
while true; do
ppid=$(ps -o ppid= -p $cpid)
pname=$(ps -o comm= -p $ppid)
if [ "$pname" == "containerd-shim" ]; then
echo "$cpid parent $ppid ($pname)"
break
else
echo "$cpid parent $ppid ($pname)"
cpid=$ppid
fi
done
# 此处有问题,待验证
crictl ps -q | xargs crictl inspect --output go-template --template '{{.info.pid}}, {{.status.metadata.name}}' | grep $cpid