容器以host模式运行时通过进程ID查找对应的容器名称

场景:

应用服务通过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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值