直接回答:distroless/scratch 镜像没有 shell、没有网络工具,一旦进 K8s 排障就是瞎子——exec 进去什么都没有。ephemeral container(1.25 稳定)允许在不重启 Pod 的前提下注入一个临时调试容器,共享该 Pod 的网络命名空间(以及可选的进程命名空间),用 busybox、netshoot 等全副武装的镜像直接对目标 Pod 做网络抓包、端口连通性、进程检查。
展开解析:常用三板斧:kubectl debug -it pod/xxx --image=busybox --target=app -- sh 共享进程命名空间后直接看目标容器的进程(ps)与文件系统(/proc//root);kubectl debug node/xxx 以特权 chroot 宿主机做节点级排查;kubectl debug --copy-to 复制一份 Pod 并把启动命令换成 sleep,用于反复崩溃的 Pod——原 Pod 起不来没法 exec,副本可以随便折腾。权限边界:需要 pods/ephemeralcontainers 的 RBAC 权限,生产环境建议收紧并审计,临时容器同样能读到 Pod 的 secret 挂载。注意它不进调度决策(无 requests/limits 保障)、不随 Pod 重启保留,纯一次性诊断手段。排障价值排序:网络问题(netshoot 里 tcpdump/dig/curl 齐全)> 进程与文件检查 > 崩溃现场复刻。它把“为了排障往镜像里塞调试工具”这个安全与体积的纠结基本终结了。
追问方向:--target 参数的作用是什么?为什么复制 Pod 副本调试优于在线改原 Pod?
(约 470 字)