Kubernetes 部署 Java 服务并配置探活检查(Liveness & Readiness Probe)
在 Kubernetes 中部署 Java 服务时,必须配置 存活检查(Liveness Probe) 和 就绪检查(Readiness Probe),以确保应用正确启动并健康运行。以下是完整配置指南:
一、探活检查的作用
探活类型 | 作用 | 触发行为 |
---|---|---|
Liveness Probe(存活检查) | 检查应用是否存活(是否崩溃或卡死) | 如果失败,Kubernetes 会重启 Pod |
Readiness Probe(就绪检查) | 检查应用是否准备好接收流量 | 如果失败,Kubernetes 会从 Service 的 Endpoints 中移除该 Pod |
二、Java 服务探活检查的配置方式
Java 应用的探活检查通常通过 HTTP 端点 或 TCP 端口 实现。以下是具体配置方法:
1. HTTP 探活检查(推荐)
适用于 Java Web 应用(如 Spring Boot),通常使用 /actuator/health
或自定义健康检查接口。
示例 Deployment 配置(YAML)
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-service
spec:
replicas: 3
selector:
matchLabels:
app: java-service
template:
metadata:
labels:
app: java-service
spec:
containers:
- name: java-container
image: your-java-app-image:latest
ports:
- containerPort: 8080 # Java 应用监听的端口
livenessProbe:
httpGet:
path: /actuator/health # Spring Boot 默认健康检查路径
port: 8080
initialDelaySeconds: 30 # 容器启动后等待 30 秒再检查(避免应用未完全启动)
periodSeconds: 10 # 每 10 秒检查一次
failureThreshold: 3 # 连续失败 3 次后重启 Pod
readinessProbe:
httpGet:
path: /actuator/health # 同 Liveness Probe,可自定义
port: 8080
initialDelaySeconds: 10 # 应用启动后等待 10 秒再检查
periodSeconds: 5 # 每 5 秒检查一次
failureThreshold: 1 # 连续失败 1 次就从 Service 中移除
关键参数说明
参数 | 说明 | 推荐值 |
---|---|---|
initialDelaySeconds | 容器启动后等待多少秒再开始检查 | Java 应用建议 10~30 秒(取决于启动时间) |
periodSeconds | 检查间隔时间 | 5~10 秒 |
failureThreshold | 连续失败多少次触发动作 | Liveness: 3 次(重启 Pod),Readiness: 1 次(从 Service 移除) |
2. TCP 探活检查(适用于非 HTTP 应用)
如果 Java 应用没有 HTTP 健康检查接口,可以使用 TCP 探活(检查端口是否可连接)。
示例 Deployment 配置
livenessProbe:
tcpSocket:
port: 8080 # 检查 Java 应用的端口
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 1
3. Exec 探活检查(适用于自定义脚本检查)
如果 Java 应用需要执行自定义命令检查健康状态(如调用内部 API),可以使用 exec
方式。
示例 Deployment 配置
livenessProbe:
exec:
command:
- /bin/sh
- -c
- curl -f http://localhost:8080/actuator/health # 自定义检查命令
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
三、Java 应用如何支持探活检查?
1. Spring Boot 应用(推荐)
Spring Boot 默认提供 /actuator/health
健康检查接口,只需确保:
- 添加
spring-boot-starter-actuator
依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
- 确保应用启动时健康检查接口可用(默认端口
8080
)。
2. 自定义健康检查接口
如果应用不是 Spring Boot,可以:
- 实现一个
/health
或/status
的 HTTP 接口,返回200 OK
表示健康。 - 在 Kubernetes 中配置
httpGet
探活检查该接口。
四、探活检查的调试与验证
1. 查看 Pod 的探活状态
kubectl get pods -w # 观察 Pod 状态(Running/CrashLoopBackOff)
kubectl describe pod <pod名> # 查看探活检查的详细日志
- 如果 Pod 处于
CrashLoopBackOff
,可能是探活检查失败导致重启。
2. 手动测试探活接口
# 进入 Pod 执行 curl 测试健康检查接口
kubectl exec -it <pod名> -- curl http://localhost:8080/actuator/health
- 应返回类似:
{"status":"UP"}
- 如果返回
500
或其他错误,需检查应用健康检查逻辑。
3. 查看探活检查日志
kubectl logs <pod名> # 查看应用日志,检查是否有健康检查相关的错误
五、常见问题与解决方案
1. Pod 启动后立即被重启(CrashLoopBackOff)
- 可能原因:
initialDelaySeconds
设置过小,应用未完全启动时探活检查失败。- 应用健康检查接口返回错误(如
500
)。
- 解决方案:
- 增加
initialDelaySeconds
(如从10
改为30
)。 - 检查应用健康检查逻辑,确保返回
200 OK
。
- 增加
2. 应用启动后无法接收流量(Readiness Probe 失败)
- 可能原因:
- 应用启动慢,
initialDelaySeconds
设置过小。 - 应用依赖的服务(如数据库)未就绪。
- 应用启动慢,
- 解决方案:
- 增加
initialDelaySeconds
。 - 检查应用依赖的服务是否可用。
- 增加
3. 探活检查接口返回超时
- 可能原因:
- 应用未监听探活检查的端口。
- 网络策略(NetworkPolicy)阻止访问。
- 解决方案:
- 检查应用是否监听
containerPort
指定的端口。 - 检查 NetworkPolicy 是否允许探活检查流量。
- 检查应用是否监听
六、最佳实践
- 合理设置
initialDelaySeconds
:- Java 应用建议
initialDelaySeconds=30
(取决于启动时间)。
- Java 应用建议
- 使用
/actuator/health
(Spring Boot):- Spring Boot 默认提供健康检查接口,无需额外开发。
- 监控探活检查失败:
- 使用 Prometheus + Grafana 监控探活检查失败次数。
- 测试探活检查:
- 部署后手动测试探活接口,确保返回
200 OK
。
- 部署后手动测试探活接口,确保返回
七、总结
步骤 | 操作 |
---|---|
1. 配置探活检查 | 在 Deployment 中设置 livenessProbe 和 readinessProbe |
2. 确保应用支持健康检查 | Spring Boot 使用 /actuator/health ,或自定义健康检查接口 |
3. 调试探活检查 | 使用 kubectl describe pod 和 kubectl logs 查看失败原因 |
4. 优化探活参数 | 调整 initialDelaySeconds 和 failureThreshold |
关键点:
- Liveness Probe:检查应用是否存活,失败则重启 Pod。
- Readiness Probe:检查应用是否就绪,失败则从 Service 中移除。
- Java 应用:推荐使用 Spring Boot 的
/actuator/health
或自定义健康检查接口。 - 调试:通过
kubectl describe pod
和kubectl logs
查看探活失败原因。