Kubernetes 探针超时主要在 Pod YAML 中通过 timeoutSeconds 字段配置,Go 程序需配合上下文超时控制避免阻塞。调整时需平衡故障检测速度与网络波动风险,超时过短会导致误杀 Pod,过长会延缓故障恢复。
先说结论:调整 Kubernetes Pod spec 中的 timeoutSeconds 字段,并确保 Go 代码尊重请求上下文 deadline。
- 适合:Kubernetes 管理的 Go HTTP 服务健康检查场景。
- 先准备:备份当前 Deployment YAML 并确认 Go handler 使用 r.Context()。
- 验收:通过 kubectl describe pod 查看 Events 无 Liveness/Readiness 超时记录。
命令速用版
直接在 Deployment YAML 中修改探针配置,以下为标准 HTTP 探针片段:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3为什么会这样
Kubernetes kubelet 等待探针响应超过设定时间即判定失败,Go 服务若不主动取消耗时操作会导致线程堆积。
探针超时由控制平面 kubelet 发起计时,若 Go 服务端处理请求耗时超过 timeoutSeconds,kubelet 会断开连接并记录失败。Go 语言默认 HTTP Handler 不会自动取消后台 goroutine,必须显式监听 context.Done() 才能避免资源泄漏。
分步处理
第一步:修改 Kubernetes 资源配置。
编辑 Deployment YAML,调整 timeoutSeconds 数值,建议设置为业务平均响应时间的 2 至 3 倍,但不要超过 periodSeconds。
第二步:优化 Go 代码上下文处理。
在 HTTP Handler 函数开头获取 request context,并在耗时操作前检查 context 状态。
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
select {
case <-ctx.Done():
return
default:
// 执行业务逻辑
}
}第三步:应用变更并观察。
使用 kubectl apply 提交配置,观察 Pod 重启情况。
怎么验证是否生效
使用 kubectl describe pod 命令查看 Events 列表,确认无 Unhealthy 警告。
检查 kubelet 日志或 Pod 状态,若 Last Probe Time 持续更新且 Status 为 True,则配置生效。
常见坑
避免将 timeoutSeconds 设置得比数据库锁等待时间更短,否则高负载下必超时。
不要忽略 Go 程序 GC 停顿时间,STW 期间探针请求可能无法被处理。
谨慎调整 failureThreshold,过低的阈值会导致网络抖动时 Pod 被频繁重启。
常见问题
默认超时时间是多少?
Kubernetes 探针默认 timeoutSeconds 为 1 秒,生产环境通常建议调整为 3 到 5 秒。
Go 代码必须修改吗?
如果 Handler 内有耗时 IO 或计算,必须修改代码以响应 context 取消信号,否则调整 YAML 无效。
如何区分探针超时和服务错误?
探针超时返回 504 或连接重置,服务错误通常返回 500 状态码,可通过日志区分。
参考来源
- Kubernetes Official Documentation, Configure Liveness, Readiness and Startup Probes, https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
- Go Official Documentation, net/http package, https://pkg.go.dev/net/http