1. 为什么健康检查是Kubernetes的核心能力Kubernetes作为容器编排的事实标准其核心价值不仅在于能够调度和运行容器更在于确保应用始终处于预期状态。而健康检查机制正是实现这一目标的关键技术手段。在实际生产环境中我们经常遇到这样的场景容器进程虽然还在运行但应用已经无法正常提供服务或者应用启动时需要较长的初始化时间在这期间不应该接收外部流量。传统的基础设施监控往往只能检测进程是否存在而Kubernetes通过探针机制真正理解了应用的内部状态。1.1 健康检查的三种探针类型Kubernetes提供了三种探针来实现不同维度的健康检查Liveness Probe存活探针作用检测应用是否处于运行状态失败后果Kubernetes会重启容器典型场景应用死锁或无响应Readiness Probe就绪探针作用检测应用是否准备好接收流量失败后果从Service的Endpoint中移除该Pod典型场景应用启动初始化、临时过载Startup Probe启动探针作用保护慢启动的应用特殊性质仅在启动阶段生效典型场景需要长时间初始化的传统应用提示在Kubernetes 1.16之前慢启动应用通常需要设置较大的initialDelaySeconds。Startup Probe的引入使这类场景的处理更加优雅。1.2 探针的三种检查方式每种探针都可以通过三种方式实现检查检查方式实现原理适用场景配置复杂度HTTP GET对指定路径发起HTTP请求Web服务低TCP Socket尝试建立TCP连接非HTTP协议服务中Exec在容器内执行命令并检查退出码需要复杂检查逻辑的场景高在实际使用中HTTP GET是最常用的方式因为它简单直观且能反映应用的真实状态。对于Spring Boot应用可以直接使用Actuator的健康检查端点。2. 生产级健康检查配置实践2.1 Spring Boot应用的探针配置示例下面是一个典型的Spring Boot应用部署配置展示了三种探针的合理设置apiVersion: apps/v1 kind: Deployment metadata: name: spring-boot-app spec: template: spec: containers: - name: app image: my-spring-boot-app:1.0.0 ports: - containerPort: 8080 livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 3 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 5 periodSeconds: 5 failureThreshold: 3 startupProbe: httpGet: path: /actuator/health/startup port: 8080 failureThreshold: 30 periodSeconds: 10关键参数说明initialDelaySeconds: 容器启动后等待多长时间开始检查periodSeconds: 检查间隔时间failureThreshold: 连续失败多少次才判定为不健康successThreshold: 对于就绪探针成功多少次才判定为健康2.2 参数调优经验分享根据多年运维经验健康检查参数的设置需要结合应用特点Liveness Probe检查频率不宜过高通常10-30秒一次超时时间设置建议比平均响应时间多50%失败阈值生产环境建议3次避免因临时抖动导致不必要的重启Readiness Probe初始延迟应短尽快参与流量分配检查频率可高5-10秒一次对于有状态服务确保检查包含所有关键依赖Startup Probe失败阈值要足够大覆盖最坏情况下的启动时间检查间隔可比存活探针长减少启动压力启动完成后应立即切换到常规探针注意过于频繁的健康检查会增加应用负担特别是在高并发场景下。我曾经遇到过一个案例由于将periodSeconds设置为1秒导致健康检查请求占用了30%的CPU资源。3. 高级健康检查模式3.1 依赖项检查的最佳实践现代应用通常依赖数据库、缓存等外部服务。理想的健康检查应该反映这些依赖的状态RestController public class HealthCheckController { GetMapping(/health/readiness) public ResponseEntity? readinessCheck() { // 检查数据库连接 if(!databaseHealthChecker.isHealthy()) { return ResponseEntity.status(503).build(); } // 检查缓存连接 if(!cacheHealthChecker.isHealthy()) { return ResponseEntity.status(503).build(); } // 检查线程池状态 if(threadPoolHealthChecker.isOverloaded()) { return ResponseEntity.status(503).build(); } return ResponseEntity.ok().build(); } }这种实现方式比简单的是否运行检查更能反映应用的真实状态。3.2 渐进式健康检查模式对于复杂应用可以采用渐进式健康检查策略启动阶段只检查基础依赖如配置文件加载运行初期增加次要依赖检查如缓存连接完全就绪检查所有依赖如数据库、外部API这种模式可以通过不同的检查端点实现配合Startup Probe使用效果更佳。4. 常见问题与诊断技巧4.1 典型问题排查表问题现象可能原因解决方案Pod不断重启Liveness检查过于严格调整失败阈值或检查标准服务流量不均衡Readiness Probe配置不一致统一所有Pod的检查配置应用启动时接收请求导致错误缺少Startup Probe或延迟不足添加Startup Probe保护健康检查导致性能下降检查频率过高或检查逻辑过重优化检查端点性能短暂故障导致不必要的移除失败阈值设置过低适当增加failureThreshold4.2 诊断命令与技巧查看Pod的健康检查状态kubectl describe pod pod-name | grep -A 10 Liveness\|Readiness手动测试健康检查端点kubectl exec pod-name -- curl -I http://localhost:8080/health查看被拒绝的Endpointkubectl get endpoints service-name -o yaml检查事件日志kubectl get events --sort-by.metadata.creationTimestamp4.3 性能优化建议为健康检查端点实现缓存1-2秒级别避免在健康检查中执行重量级操作考虑使用专门的健康检查端口对于Java应用注意线程池隔离我曾经优化过一个电商应用的健康检查通过以下改动将检查耗时从800ms降到了50ms为Actuator端点添加缓存将数据库检查改为连接池状态检查使用单独的简单端点作为Liveness检查5. 监控与告警集成完善的健康检查体系还需要配合监控系统Prometheus监控示例- job_name: kubernetes-pods-health metrics_path: /actuator/prometheus kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true关键指标告警频繁重启的PodLiveness失败长时间未就绪的Pod健康检查延迟过高Grafana仪表板建议按命名空间统计健康检查失败率Top N健康检查延迟最高的Pod历史重启次数趋势在实际环境中我发现将健康检查状态与业务指标如错误率、响应时间关联分析能够更早发现问题。例如当Readiness Probe失败率上升时往往预示着数据库或缓存即将出现问题。