Spring Boot版Knative Functions启动失败:就绪探针异常问题
解决Knative Functions部署Spring Boot应用后Pod立即关闭的问题
问题概述
使用kn func create创建的默认Java Spring Boot应用,通过kn func deploy部署到Minikube集群时出现以下异常:
- Spring Boot应用完成初始化启动后无报错直接终止
- Pod事件记录显示就绪探针多次失败,包含超时、HTTP 503、连接拒绝等错误:
Warning Unhealthy pod/test1-00001-deployment-59667f6745-xnfvd Readiness probe failed: Get "http://10.244.0.117:8012/": context deadline exceeded (Client.Timeout exceeded while awaiting headers) Warning Unhealthy pod/test1-00001-deployment-59667f6745-xnfvd Readiness probe failed: HTTP probe failed with statuscode: 503 Warning Unhealthy pod/test1-00001-deployment-59667f6745-xnfvd Readiness probe failed: Get "http://10.244.0.117:8012/": dial tcp 10.244.0.117:8012: connect: connection refused - 手动使用
pack构建镜像并通过Knative Serving清单部署时应用运行正常 - 开启
BP_NATIVE_IMAGE="true"构建原生镜像后,部署无异常
核心原因
- 探针配置不匹配:
kn func默认生成的Knative就绪探针端口(如示例中的8012)与Spring Boot默认监听的8080端口不一致,导致探针无法访问应用 - 启动延迟不兼容:普通JVM镜像启动耗时较长,Knative默认探针的初始延迟设置过短,在应用就绪前就开始检测,多次失败后触发Pod终止
- 构建参数差异:
kn func使用的构建环境变量与手动pack构建存在差异,导致应用启动后的监听端口不符合探针预期
解决方案
1. 修正探针端口与路径
在func.yaml中显式配置Knative就绪探针,匹配Spring Boot应用的实际监听端口和健康检查路径:
deploy: knative: readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 5
执行kn func deploy重新部署应用。
2. 指定应用监听端口
在func.yaml中设置环境变量,确保Spring Boot应用监听正确的端口:
build: env: - name: SERVER_PORT value: "8080" - name: BP_JVM_SERVER_PORT value: "8080"
SERVER_PORT用于Spring Boot配置,BP_JVM_SERVER_PORT用于Paketo构建pack指定容器内端口。
3. 延长探针初始延迟
针对普通JVM镜像启动慢的问题,增加探针的初始延迟时间,给应用足够的初始化时间:
deploy: knative: readinessProbe: initialDelaySeconds: 60 periodSeconds: 15 failureThreshold: 3
验证步骤
- 查看Pod日志确认应用监听端口:
kubectl logs <pod-name> - 在Pod内部测试健康检查端点:
kubectl exec <pod-name> -- curl http://localhost:8080/actuator/health/readiness - 检查Knative Serving资源的探针配置:
kubectl get ksvc <service-name> -o yaml
内容的提问来源于stack exchange,提问作者Danny Steinbrecher
相关产品推荐
相关产品推荐

