kubectl debug通过注入临时容器调试精简镜像pod,无需原容器含shell或工具,不中断业务;需集群启用ephemeralcontainers特性、pod配置shareprocessnamespace,并注意非root用户权限限制。

直接用 kubectl debug 向运行中的 Pod 注入临时容器,是调试精简镜像(如 distroless、Alpine、scratch)最有效的方式。它不依赖原容器是否含 shell 或工具,也不需重启或改配置。
为什么必须用 Ephemeral Containers?
精简容器通常只保留主进程所需二进制文件,缺少 sh、curl、netstat、tcpdump 等诊断工具,导致 kubectl exec 无法进入或执行命令。Ephemeral Containers 绕过这个限制——它新建一个带完整工具链的容器,共享目标 Pod 的网络、PID、IPC 和挂载命名空间,相当于“借壳诊断”。
- 原容器保持运行状态,业务零中断
- 调试容器自带工具(如
nicolaka/netshoot、busybox、debian:debug) - 可查看目标容器进程、网络连接、文件系统(需权限支持)
前提条件:确保集群已启用特性
Ephemeral Containers 在 v1.20+ 默认启用,但旧版本或自建集群仍需手动开启:
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 在
kube-apiserver、kubelet启动参数中添加:--feature-gates=EphemeralContainers=true - Pod 必须设置
shareProcessNamespace: true(尤其当需查看目标容器进程时) - 确认节点 kubelet 已重启,且
kubectl version客户端 ≥ v1.18
常用调试操作与命令示例
以下命令均作用于已运行的精简 Pod(例如名为 api-v1):
- 快速进入调试环境:
kubectl debug api-v1 -it --image=nicolaka/netshoot - 指定调试容器名并共享进程命名空间:
kubectl debug api-v1 -it --image=busybox --target=app --share-processes - 排查 CrashLoop 中的 Pod(跳过健康检查干扰):
kubectl debug api-v1 --image=debian --enable-agent=false - 查看目标容器内所有进程:
ps auxf(需--share-processes或目标容器启用shareProcessNamespace) - 抓包分析网络异常:
tcpdump -i eth0 -w /tmp/debug.pcap port 8080
注意事项与避坑提示
不是所有场景都开箱即用,需留意权限与配置细节:
- 若目标容器以非 root 用户运行,临时容器可能无法挂载
/proc或读取部分进程信息 -
--target参数指定的是原 Pod 中某个容器名,用于对齐命名空间;不指定则默认共享全部命名空间 - 临时容器不能设置资源限制(
resources)、探针(livenessProbe)或端口(ports) - 调试结束后,临时容器自动终止,不会残留或影响 Pod 生命周期










