如何无需exec进入容器即可获取Kubernetes集群容器内运行的进程列表
Kubernetes集群批量获取所有容器运行进程的替代方案
下面是3种不用手动逐个exec进入容器的可行方案,你可以根据你手里的集群权限选择:
方案1:通过节点容器运行时命令批量采集
如果你有权限登录pod所在的工作节点,或者可以通过DaemonSet在节点上执行命令,直接用容器运行时原生命令批量获取即可:
- 第一步先拿到所有目标容器的ID和所在节点:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\t"}{range .status.containerStatuses[*]}{.containerID}{"\n"}{end}{end}'
输出结果会按「Pod名 节点名 容器ID」的格式列出所有容器信息。
- 第二步登录对应节点,根据你集群的容器运行时执行对应命令:
- 若使用containerd:
crictl ps -q | xargs -I {} crictl exec {} ps aux - 若使用docker:
docker ps -q | xargs -I {} docker exec {} ps aux
执行后会直接输出节点上所有运行容器的进程列表,结合第一步拿到的容器ID过滤,就能得到你需要的目标进程。
- 若使用containerd:
方案2:自动遍历脚本批量执行exec,无需手动逐个操作
要是你没有节点登录权限,只有kubectl的exec权限,也不需要手动敲命令逐个进容器,用一行脚本就能自动遍历所有pod和容器执行ps:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{" "}{range .spec.containers[*]}{.name}{"\n"}{end}{end}' | xargs -l bash -c 'echo "=== Pod: $0, Container: $1 ==="; kubectl exec $0 -c $1 -- ps aux'
这个命令会自动遍历当前命名空间下的所有pod和对应容器,自动执行ps并输出归属标识,全程不需要手动输入任何资源名称,效率远高于手动逐个操作。
方案3:通过节点/proc文件系统直接采集,完全无需进入容器
容器进程本质上是宿主机上做了资源隔离的普通进程,所有进程信息都存在宿主机的/proc目录下,你完全可以不执行任何进入容器的操作,直接在宿主机上过滤进程:
ps axfZ | grep -E 'containerd.io/.*[0-9a-f]{64}|docker/.*[0-9a-f]{64}'
输出结果会携带对应容器的ID,和第一步拿到的容器ID做映射后,就能直接匹配到每个进程所属的pod和容器,不会触发任何容器内操作。
注意:以上方案需要的权限各有不同,方案1和3需要节点登录及容器运行时操作权限,方案2只需要kubectl的exec权限,你可以根据集群的权限管控规则选择合适的方案。
内容的提问来源于stack exchange,提问作者Tidal Waves
相关产品推荐
相关产品推荐

