kubectl exec deploy/api -- ls /bin/sh
kubectl get pod api-7d9f -o jsonpath='{.spec.containers[0].livenessProbe}'
kubectl describe pod api-7d9f | grep -A4 Liveness
Pod 上线两小时被重启 4 次,kubectl describe 里写着 liveness probe failed: OCI runtime exec failed: exec: "curl": executable file not found in $PATH。业务日志里一条错误都没有。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,探针的 exec 是在容器自己的文件系统里执行,distroless 这类精简镜像只留了应用二进制,没有 curl 也没有 sh。探针连续失败达到阈值后 kubelet 直接重启容器,业务还没开始处理请求就被打断。
围绕「健康检查 curl 缺失」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
处理上按这个顺序:先用 kubectl exec 试一遍探针里的完整命令 看容器里到底有没有这个可执行文件;没有就改成应用自带的健康接口 用 httpGet 探针 别再依赖外部命令;确需 exec 时把 curl 换成镜像里已有的 wget 或自带脚本 并把路径写绝对;把失败阈值和超时调宽一点 给启动慢的实例留出余量。
改完只确认一件事:describe 里不再出现 exec 失败,Pod 重启次数停在 0,接口连续可用。
