重新部署K3s Deployment时探针报错:$PATH未找到可执行文件
问题分析与解决
核心原因
报错executable file not found in $PATH明确说明容器镜像中缺少探针命令依赖的grpc_health_probe和grpcurl工具,并非K3s探针机制变更导致。
之前能正常运行,大概率是以下两种情况:
- 之前使用的镜像版本预装了这两个工具,修复后构建的新镜像未添加该依赖
- 依赖
latest镜像标签拉取镜像,新版本镜像未预装所需工具
K3s探针机制说明
近几个月K3s的exec类型探针机制未发生会引发此类问题的变更。kubelet执行exec探针的逻辑始终是在容器内部执行指定命令,前提是容器内必须存在该命令且命令路径在$PATH环境变量中。
解决办法
1. 验证镜像依赖
拉取镜像后进入容器检查工具是否存在:
docker pull myname/mydeployment:latest docker run --rm -it myname/mydeployment:latest which grpc_health_probe docker run --rm -it myname/mydeployment:latest which grpcurl
若命令无输出,说明镜像确实缺少对应工具。
2. 在镜像中预装依赖工具
修改Dockerfile,构建时添加所需工具:
安装grpc_health_probe
RUN GRPC_HEALTH_PROBE_VERSION=v0.4.19 && \ curl -L https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 -o /usr/local/bin/grpc_health_probe && \ chmod +x /usr/local/bin/grpc_health_probe
安装grpcurl
如果镜像基于Go环境:
RUN go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
非Go环境可直接下载二进制包:
RUN GRPCURL_VERSION=v1.8.7 && \ curl -L https://github.com/fullstorydev/grpcurl/releases/download/${GRPCURL_VERSION}/grpcurl_${GRPCURL_VERSION}_linux_x86_64.tar.gz | tar -xz -C /usr/local/bin grpcurl && \ chmod +x /usr/local/bin/grpcurl
重新构建并推送镜像后,重新部署Deployment即可。
3. 改用原生gRPC探针(推荐)
Kubernetes 1.24及以上版本支持原生grpc类型探针,无需依赖容器内工具,直接由kubelet发起健康检查。修改Deployment探针配置:
livenessProbe: grpc: port: 50051 service: ping.Pinger/Ping # 需检查具体服务方法时添加,部分版本支持 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: grpc: port: 50051 initialDelaySeconds: 5 periodSeconds: 10
仅需检查gRPC服务可用性时,可省略service字段。
4. 使用固定镜像标签
避免使用latest标签,改用固定版本标签(如v1.0.0),防止意外拉取到未预装依赖的镜像版本。
内容的提问来源于stack exchange,提问作者Johnney
相关产品推荐
相关产品推荐

