“咋回事,我这个服务老是自己重启?”
“明明没改代码,Pod 一小时重启了十次!”
“监控告警了,说服务挂了,其实还在转圈圈重启…”
你有没有遇到过这些让人抓狂的问题?
别急!本文将一次性帮你搞懂 Kubernetes 的重启机制、重启原因、排查方法和优化策略,让你的服务跑得稳、告警少、老板放心!
一、K8s 中的重启策略:你可能从未真正了解过
Kubernetes 为 Pod 提供了三种重启策略(RestartPolicy),但只有两种你经常用到:
重启策略 | 适用场景 | 默认值 |
Always | 所有 Deployments、ReplicaSets | 默认值 |
OnFailure | Job 场景:失败才重启 | |
Never | Pod 失败后直接终止不重启 |
重点:你只要用 Deployment,就一定是 Always。
二、哪些情况下 Kubernetes 会触发重启?
Kubernetes 并不会随便重启容器,只有下面几种情况下才会:
1. 容器运行异常退出(非 0 状态码)
Exit Code: 1
Reason: Error
典型原因:服务抛异常、panic、缺少依赖、环境变量缺失。
2. 被存活探针(liveness probe)判定为“死亡”
Liveness probe failed: HTTP probe failed with statuscode: 500
探针失败次数超过 failureThreshold,Kubelet 会重启容器。
3. 超过内存限制被 OOMKilled
Reason: OOMKilled
Exit Code: 137
内存不够直接 kill 重启! K8s 对内存是零容忍的!
4. 镜像拉取失败也会触发重启(CrashLoopBackOff)
Reason: ImagePullBackOff
虽然不是容器本身 crash,但依然导致 Pod 重启失败。
三、CrashLoopBackOff 是什么?为啥总是你?
这是一种常见且“烦人”的状态,意思是:
容器一直崩 -> K8s 试图重启 -> 又崩 -> 再试 -> 越试越慢!
你会看到这样的状态日志:
Back-off restarting failed container
Kubernetes 会采用指数退避(backoff)策略延迟重启,从 10 秒 20 秒 40 秒 … 最长 5 分钟。
所以 别等着它自动好,得主动排查!
四、实战排查容器频繁重启的 3 个关键命令
1 查看重启次数
kubectl get pod
留意 RESTARTS 列,一小时内几十次就很危险。
2 看容器退出原因
kubectl describe pod <pod-name>
关注 Last State 和 Events 区域。
3 看日志排错
kubectl logs <pod-name> --previous
别忘了加 --previous,否则只能看到刚启动那次的日志!
五、如何避免重启?这里是全网最全优化建议!
正确配置资源限制
resources:
requests:
memory: "512Mi"
limits:
memory: "1Gi"
防止 OOM,记得查看真实内存占用,别拍脑袋写!
谨慎使用 Liveness 探针
- 新手建议先关闭 liveness,仅用 readiness。
- 或设置较宽容的失败阈值:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 5
服务启动慢?用 startupProbe!
startupProbe:
httpGet:
path: /start
port: 8080
failureThreshold: 30
periodSeconds: 10
告诉 K8s:“我启动慢,但别急着判我死”!
避免写死导致崩溃的错误配置
如环境变量没配置导致空指针,DB 连接失败直接 panic 等。
加入容错机制或降级处理,别让小问题变重启风暴!
设置重启上限告警,别让问题无限扩大
结合监控平台(如 Prometheus + Alertmanager)设置告警阈值:
rate(container_restart_count[5m]) > 2
5 分钟内重启超过 2 次就告警,让问题早暴露!
六、结语:重启 ≠ 恢复,频繁重启 = 服务不稳
Kubernetes 给了我们“自动重启”的机制,但这不是“我不管”的借口。
服务频繁重启背后,一定是配置、代码或资源出了问题。
学会正确地识别问题、排查问题、优化问题,才是真正的 DevOps 能力。