Pod的LivenessProbe 探针的常见方式有哪些?

Kubernetes存活探针深度指南:生产环境四大检测方案与避坑实践

存活探针(LivenessProbe)是保障Kubernetes应用自愈能力的核心机制。本文将深入解析四种检测方式的适用场景,并分享经过大规模生产验证的配置模板。


一、四大存活检测方案全景图

存活探针类型对比图

  1. 命令执行检测(Exec)

    • 适用场景
      • 检查特定文件是否存在(如锁文件)
      • 验证进程状态
      • 执行自定义健康脚本
    • 生产示例
      livenessProbe:
        exec:
          command:
          - sh
          - -c
          - "pgrep -x nginx && curl -s localhost:8080/status"
        initialDelaySeconds: 30
        periodSeconds: 10
        timeoutSeconds: 2
      
    • 避坑指南
      • 避免执行耗时超过timeoutSeconds的命令
      • 禁止修改应用状态(如清理临时文件)
  2. HTTP端点检测(HTTPGet)

    • 最佳实践
      • 使用独立健康检查端口(避免与业务端口冲突)
      • 实现分级健康检查(如/healthz?level=basic
      • 添加请求头标识探针流量
    • 增强配置
      livenessProbe:
        httpGet:
          path: /internal/health
          port: 9090
          httpHeaders:
          - name: X-Probe-Type
            value: "k8s-liveness"
          - name: Authorization
            value: "Bearer $(PROBE_TOKEN)"
        periodSeconds: 5
      
    • 安全建议
      • 健康接口需要鉴权
      • 限制访问IP范围
  3. TCP端口检测(TCPSocket)

    • 适用场景
      • 数据库服务(MySQL/Redis)
      • 传统TCP协议应用
      • 网络中间件
    • 高阶技巧
      livenessProbe:
        tcpSocket:
          port: service-port
        periodSeconds: 10
        successThreshold: 2  # 连续2次成功才认为健康
      
    • 注意事项
      • 不能检测应用层状态
      • 需配合资源限制使用,避免僵尸进程占用端口
  4. gRPC健康协议(Kubernetes 1.27+)

    • 前提条件
      • 实现gRPC健康检查协议
      • 使用Kubernetes 1.27+版本
    • 配置示例
      livenessProbe:
        grpc:
          port: 50051
          service: "grpc.health.v1.Health" 
        timeoutSeconds: 3
      
    • 性能优势
      • 二进制协议,检测效率提升40%
      • 支持流式健康状态报告

二、参数调优黄金法则

参数名称 推荐值域 计算公式 典型错误案例
initialDelaySeconds 30-300秒 冷启动时间×1.5 Java应用启动未完成被杀死
periodSeconds 5-30秒 业务容忍中断时间÷3 频繁检测导致CPU飙升
timeoutSeconds 1-3秒 小于periodSeconds的1/3 超时引发误判重启
failureThreshold 3-5次 最大容忍故障时间÷periodSeconds 过早触发重启
successThreshold 1-2次 根据业务波动性调整 抖动导致状态翻转

推荐基准配置

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 45    # 留足启动时间
  periodSeconds: 15          # 折中检测频率
  timeoutSeconds: 3          # 合理超时窗口
  failureThreshold: 3        # 45秒内失败触发重启
  successThreshold: 2        # 避免偶发抖动

三、生产环境高阶技巧

  1. 动态阈值调整

    env:
    - name: LIVENESS_FAILURE_THRESHOLD
      valueFrom:
        configMapKeyRef:
          name: probe-config
          key: liveness-failure-threshold
    livenessProbe:
      failureThreshold: $(LIVENESS_FAILURE_THRESHOLD)
    
  2. 压力感知检测

    # 示例健康端点实现
    @app.route('/health')
    def health_check():
        cpu_load = psutil.cpu_percent()
        if cpu_load > 90:
            return "OVERLOAD", 503
        return "OK", 200
    
  3. 关联事件触发

    # 监控探针失败事件
    kubectl get events --field-selector=
    reason=Unhealthy,type=Warning
    

四、经典故障排查案例

案例1:检测风暴导致CPU过载

  • 现象:periodSeconds=1导致检测QPS过高
  • 解决方案
    periodSeconds: 10
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    

案例2:文件锁引发的误杀

  • 现象:临时文件未及时清理导致检测失败
  • 修复方案
    livenessProbe:
      exec:
        command:
        - /scripts/check_lock.sh  # 增加重试逻辑
    

案例3:时钟不同步导致状态漂移

  • 现象:节点时间不同步导致检测超时
  • 根治方案
    # 所有节点部署NTP服务
    kubectl apply -f ntp-daemonset.yaml
    

五、存活探针禁用场景

  1. 有状态服务主节点

    # StatefulSet特殊配置
    annotations:
      special-mode: "disable-liveness-for-primary"
    
  2. 批处理任务中间状态

    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "touch /tmp/pending"]
    
  3. 硬件设备交互场景

    securityContext:
      capabilities:
        add: ["SYS_RAWIO"]
    

通过合理配置存活探针,您的应用将获得智能自愈能力。记住:好的探针配置应该像经验丰富的医生——既能准确诊断病症,又不会过度治疗。

posted on 2025-03-11 11:39  Leo-Yide  阅读(49)  评论(0)    收藏  举报