🧩 背景
在使用 Kubernetes 集群进行日常运维过程中,我们有时会遇到系统层(如宿主机)出现异常、容器资源使用异常或进程级别问题(如 PID 占用、容器进程 crash 等)。这时我们通过 ctr 工具可以看到容器级别的信息,但如何准确将 containerd 层的容器 ID 映射回具体的 Kubernetes Pod 和容器呢?
本文将基于一个实战案例,讲解如何从 containerd 容器 ID 出发,反查对应的 Kubernetes Pod,做到问题定位与分析闭环。

首先,我们使用 ctr 命令查看所有 containerd 运行中的容器任务:
ctr -n k8s.io tasks list输出如下所示:
TASK PID STATUS
...
1e27e39655c4d67a017353022671aeaf5c6e3cef938486b69413c939359bfea9 2625 RUNNING
...假设我们要排查容器 ID 为 1e27e39655c4d67a017353022671aeaf5c6e3cef938486b69413c939359bfea9 的容器问题,比如其 PID 占用过高或频繁重启等。
我们可以通过 kubectl get pod -A -o json 的方式,获取所有命名空间下 Pod 的详细信息,并通过 grep 查找目标容器 ID:
kubectl get pod -A -o json | grep -A 20 -B 20 "1e27e39655c4d67a017353022671aeaf5c6e3cef938486b69413c939359bfea9"查找到如下关键字段:
"containerID": "containerd://1e27e39655c4d67a017353022671aeaf5c6e3cef938486b69413c939359bfea9",
"image": "registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.31.3",
"name": "kube-proxy",
"ready": true,
"restartCount": 2,这说明:
kube-proxy:v1.31.3 镜像;kube-proxy;containerd 启动的容器,属于 kube-proxy DaemonSet。我们可以进一步从上下文中定位出对应的 Pod 名称和命名空间。
为了方便定位,也可以使用如下 jq 命令直接过滤出包含指定容器 ID 的 Pod 详细信息:
kubectl get pod -A -o json | jq '.. | select(.containerID? | contains("1e27e39655c4d67a017353022671aeaf5c6e3cef938486b69413c939359bfea9")) | .name'也可以配合父级字段 .metadata.name 和 .metadata.namespace 一并提取。
通过上述方法定位到容器对应的 Pod 后,我们可以执行以下操作:
kubectl describe pod <pod-name> -n <namespace>可进一步查看事件(Events)、重启原因、是否有 CrashLoopBackOff 等信息。
kubectl logs <pod-name> -n <namespace> -c kube-proxy --previous查看当前日志或上一次容器崩溃前的日志(如有 restartCount > 0)。
本文展示了从 containerd 容器层任务 ID 出发,如何反查对应 Kubernetes Pod 的方法,适用于:
掌握此技巧可以帮助运维工程师快速闭环问题定位,尤其在只掌握容器 ID 时,极大地提升了排障效率。
本文展示了从 containerd 容器层任务 ID 出发,如何反查对应 Kubernetes Pod 的方法,适用于:
掌握此技巧可以帮助运维工程师快速闭环问题定位,尤其在只掌握容器 ID 时,极大地提升了排障效率。
END
本文分享自 DevOps和k8s全栈技术 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!