当pod使用distroless等无shell镜像时,kubectl exec会报错,必须用ephemeral容器调试:先确认集群版本≥1.23或启用特性门控,再用kubectl debug注入netshoot/busybox临时容器,共享命名空间后依次验证dns、http连通性及抓包分析。

当Pod使用distroless等无Shell基础镜像时,kubectl exec会直接报错command not found,此时必须借助Ephemeral临时容器进入共享网络命名空间进行在线调试,否则无法验证DNS、HTTP连通性或抓包分析。
确认集群支持EphemeralContainers特性
执行kubectl version检查客户端和服务端版本是否均≥1.23。低于该版本需手动启用特性门控——修改/etc/kubernetes/manifests/kube-apiserver.yaml的command数组,追加--feature-gates=EphemeralContainers=true;同时在/var/lib/kubelet/kubeadm-flags.env中加入相同参数;最后执行systemctl restart kubelet。
【若跳过此步直接运行kubectl debug,命令会静默失败且无任何提示】
用kubectl debug注入调试容器
方法一:使用netshoot镜像(推荐)
执行kubectl debug -it my-pod --image=nicolaka/netshoot --target=my-container。该镜像预装curl、tcpdump、nslookup、strace等全套工具,无需额外安装。
方法二:使用busybox轻量镜像
执行kubectl debug -it my-pod --image=busybox:1.35 --target=my-container -- sh。注意busybox默认不带nslookup或curl,仅适合基础进程查看和文件路径探测。
方法三:指定自定义命令入口
若目标容器处于崩溃循环状态,加--share-processes参数可让临时容器看到主容器的全部进程:kubectl debug -it my-pod --image=nicolaka/netshoot --target=my-container --share-processes。
在临时容器中完成关键诊断动作
第一步:验证DNS解析是否正常
运行nslookup kubernetes.default.svc.cluster.local。如果失败,说明CoreDNS异常或/etc/resolv.conf配置错误,不能直接跳到HTTP测试。
第二步:测试外网HTTP可达性
执行curl -Iv https://www.baidu.com --connect-timeout 5。添加--connect-timeout 5防止因网络卡顿导致命令长时间挂起,影响后续操作节奏。
第三步:抓取目标服务通信包
运行tcpdump -i any port 8080 -w /tmp/app.pcap -c 50,将Pod内访问8080端口的前50个包保存为pcap文件;随后退出临时容器,在宿主机用kubectl cp my-pod:/tmp/app.pcap ./app.pcap拉取并用Wireshark分析。











