Kubernetes 部署 Java 服务并配置探活检查(Liveness & Readiness Probe)

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 健康检查接口,只需确保:

  1. 添加 spring-boot-starter-actuator 依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  2. 确保应用启动时健康检查接口可用(默认端口 8080)。

2. 自定义健康检查接口

如果应用不是 Spring Boot,可以:

  1. 实现一个 /health/status 的 HTTP 接口,返回 200 OK 表示健康。
  2. 在 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 是否允许探活检查流量。

六、最佳实践

  1. 合理设置 initialDelaySeconds
    • Java 应用建议 initialDelaySeconds=30(取决于启动时间)。
  2. 使用 /actuator/health(Spring Boot)
    • Spring Boot 默认提供健康检查接口,无需额外开发。
  3. 监控探活检查失败
    • 使用 Prometheus + Grafana 监控探活检查失败次数。
  4. 测试探活检查
    • 部署后手动测试探活接口,确保返回 200 OK

七、总结

步骤操作
1. 配置探活检查在 Deployment 中设置 livenessProbereadinessProbe
2. 确保应用支持健康检查Spring Boot 使用 /actuator/health,或自定义健康检查接口
3. 调试探活检查使用 kubectl describe podkubectl logs 查看失败原因
4. 优化探活参数调整 initialDelaySecondsfailureThreshold

关键点

  • Liveness Probe:检查应用是否存活,失败则重启 Pod。
  • Readiness Probe:检查应用是否就绪,失败则从 Service 中移除。
  • Java 应用:推荐使用 Spring Boot 的 /actuator/health 或自定义健康检查接口。
  • 调试:通过 kubectl describe podkubectl logs 查看探活失败原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值