Kubernetes(k8s)的健康检测机制主要通过探针(Probes) 来实现,用于监控容器内应用的健康状态,确保应用能够正常运行并及时恢复故障。Kubernetes 提供了三种类型的探针:存活探针(Liveness Probe)、就绪探针(Readiness Probe) 和 启动探针(Startup Probe)。
一、探针的作用与类型
1. 存活探针(Liveness Probe)
- 目的:检测容器是否仍在正常运行。如果探测失败,Kubernetes 会认为容器处于不健康状态并重启容器。
- 适用场景:应用可能因死锁、内存泄漏等导致进程存在但无法提供服务的情况。
- 示例配置:
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 # 容器启动后等待15秒开始探测 periodSeconds: 10 # 每10秒探测一次 timeoutSeconds: 1 # 探测超时时间1秒 failureThreshold: 3 # 连续3次失败后重启容器 successThreshold: 1 # 连续1次成功视为探测通过
2. 就绪探针(Readiness Probe)
- 目的:检测容器是否已准备好接收流量。如果探测失败,Kubernetes 会将该容器从 Service 的 Endpoints 中移除,停止向其发送请求。
- 适用场景:应用启动时需要加载大量数据或依赖外部服务,暂时无法处理请求。
- 示例配置:
readinessProbe: exec: command: - sh - -c - "curl -s http://localhost:8080/ready | grep OK" initialDelaySeconds: 5 # 容器启动后等待5秒开始探测 periodSeconds: 5 # 每5秒探测一次 timeoutSeconds: 1 # 探测超时时间1秒 failureThreshold: 3 # 连续3次失败后重启容器 successThreshold: 1 # 连续1次成功视为探测通过
3. 启动探针(Startup Probe)
- 目的:用于处理启动时间较长的容器。在启动探针成功之前,其他探针(Liveness/Readiness)不会生效。
- 适用场景:旧版应用或 Java 应用启动耗时较长,需要避免存活探针在启动过程中误判。
- 示例配置:
startupProbe: tcpSocket: port: 8080 failureThreshold: 30 # 允许最多检测30次 periodSeconds: 5 # 每5秒检测一次
二、探测方式
所有探针支持以下三种检测机制:
-
HTTP GET
向容器指定端口和路径发送 HTTP 请求,响应状态码为2xx或3xx表示成功。httpGet: path: /health port: 80 -
Exec
在容器内执行自定义命令,返回值为0表示成功。exec: command: - cat - /app/healthy -
TCP Socket
尝试与容器的指定端口建立 TCP 连接,连接成功即通过检测。tcpSocket: port: 3306
三、关键参数
initialDelaySeconds:容器启动后等待多久开始探测(默认0)。periodSeconds:探测间隔时间(默认10)。timeoutSeconds:探测超时时间(默认1)。successThreshold:连续成功次数视为探测通过(默认1)。failureThreshold:连续失败次数视为探测失败(默认3)。
四、最佳实践
-
合理选择探针类型:
- 使用 Liveness Probe 处理不可恢复的故障(如死锁)。
- 使用 Readiness Probe 处理临时不可用(如依赖服务未就绪)。
- 对启动慢的应用使用 Startup Probe。
-
避免过度依赖存活探针
频繁重启可能导致问题恶化,需结合日志分析根本原因。 -
设置合理的超时和阈值
例如,对高延迟应用调大timeoutSeconds或failureThreshold。 -
长时任务的特殊处理
对批处理任务或单次任务,可能不需要存活探针。
五、总结
Kubernetes 的健康检测通过探针机制保障了应用的可靠性和自愈能力。合理配置探针可以:
- 自动重启故障容器(Liveness Probe)。
- 避免将流量路由到未就绪的实例(Readiness Probe)。
- 兼容慢启动应用(Startup Probe)。
通过结合日志监控和告警系统,能进一步提升集群的运维效率。