K8s健康检查
Kubernetes健康检查深度解析:生产环境中的探针配置与故障处理
在微服务架构中,健康检查是保障业务连续性的核心机制。Kubernetes通过探针(Probe)体系实现智能自愈,本文将深入解析三大探针的实战用法,并分享生产环境中的避坑指南。
一、探针类型与适用场景
探针类型 | 触发动作 | 典型应用场景 | 生产环境建议 |
---|---|---|---|
存活探针 | 重启容器 | 处理死锁、内存泄漏 | 配合资源限制使用 |
就绪探针 | 移除Service流量 | 服务初始化、依赖加载 | 比存活探针更宽松的阈值 |
启动探针 | 延迟其他探针检测 | 启动缓慢的Java/PHP应用 | 大流量场景必配 |
二、探针配置全解析
1. HTTP健康检查(推荐RESTful服务)
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: "K8S_Probe"
initialDelaySeconds: 30 # 预留应用启动时间
periodSeconds: 15 # 检测间隔
failureThreshold: 3 # 连续失败3次触发动作
successThreshold: 1
timeoutSeconds: 3 # 超时时间
2. TCP端口检测(适合数据库等)
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
3. 命令执行检测(复杂场景兜底)
startupProbe:
exec:
command:
- /bin/sh
- -c
- "[ -f /var/ready ]" # 检查文件是否存在
failureThreshold: 30 # 允许最长5分钟启动
periodSeconds: 10
三、生产环境最佳实践
1. 参数调优黄金法则
- Java应用:
initialDelaySeconds ≥ 应用启动时间+30s
- Node.js/Python:
initialDelaySeconds ≥ 15s
- 检测间隔:
periodSeconds ∈ [5, 30]
- 超时时间:
timeoutSeconds < periodSeconds
2. 多级健康检查策略
3. 敏感接口防护方案
# 专用健康检查端口
livenessProbe:
httpGet:
path: /internal/health
port: 9000
# Nginx配置示例
server {
listen 9000;
location /internal/health {
allow 127.0.0.1; # 仅允许Kubelet访问
deny all;
return 200;
}
}
四、故障排查四步法
1. 查看事件日志
kubectl describe pod/[pod-name] | grep -A 20 Events
# 常见关键错误:
# - Liveness probe failed: HTTP probe failed with statuscode: 500
# - Readiness probe failed: connection refused
2. 检查应用日志
kubectl logs [pod-name] --tail=100 --previous # 查看前一个容器的日志
3. 手动执行探针检测
# 进入容器执行命令检测
kubectl exec -it [pod-name] -- sh -c "curl -I localhost:8080/healthz"
# 网络连通性测试
kubectl run debug-tool --image=nicolaka/netshoot --rm -it --restart=Never
4. 调整探针参数(临时调试)
# 临时关闭存活探针(慎用!)
kubectl patch deployment/[deploy-name] -p '{"spec":{"template":{"spec":{"containers":[{"name":"app","livenessProbe":null}]}}}'
五、7大经典故障案例
-
OOM引发的死亡循环
现象:存活探针触发频繁重启
根因:内存限制设置过低
方案:调整resources.limits.memory
并添加内存监控 -
慢接口导致的误判
现象:就绪探针偶发失败
根因:检测超时时间过短
方案:增加timeoutSeconds
并优化接口性能 -
文件系统未就绪
现象:启动探针超时
根因:挂载卷初始化缓慢
方案:添加initContainer
等待存储就绪 -
流量洪峰误杀实例
现象:健康检查在高峰时段失败
根因:线程池满导致接口超时
方案:健康检查接口使用独立线程池 -
证书过期导致检测失败
现象:HTTPS探针突然失效
根因:服务端证书过期
方案:使用HTTP检测或自动证书续期 -
DNS解析超时
现象:跨服务检测随机失败
根因:DNS服务器负载过高
方案:使用IP直连或优化CoreDNS配置 -
时区不一致引发异常
现象:定时任务期间检测失败
根因:容器与宿主机时区不同步
方案:统一时区配置并添加时间容忍度
终极配置建议:
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
startupProbe: # 保护启动阶段
httpGet:
path: /health
port: 8080
failureThreshold: 30
periodSeconds: 10
readinessProbe: # 宽松配置
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
failureThreshold: 3
livenessProbe: # 严格配置
httpGet:
path: /health
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
failureThreshold: 3
resources:
limits:
memory: "512Mi"
cpu: "1000m"
通过合理配置健康检查,Kubernetes可实现真正的"自愈式"服务。记住:好的探针配置应该像汽车的ABS系统——平时默默无闻,关键时刻力挽狂澜!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)