前言
在 k8s 中 pod 常见的状态有:Running Pending Succeeded Failed Unkonwn
还有另外一种状态 CrashLoopBackOff 也是比较常见的,这个状态说明 pod 中至少有一个容器健康检查失败,但是只是这点还是不足以出现 CrashLoopBackOff
那么什么情况下会出现 CrashLoopBackOff 状态呢?在说明这个状态之前,需要提前了解一下 pod 的重启策略
pod 的重启策略
Always: 当容器失效时, 由kubelet自动重启该容器
OnFailure: 当容器终止运行且退出码不为0时, 由kubelet自动重启该容器
Never: 不论容器运行状态如何, kubelet都不会重启该容器
kubelet 在重启容器时采用的指数退避策略,最多不超过 5min,并且在 10min 之后重置该时间
CrashLoopBackOff 状态出现的条件
该状态主要是因为 pod 中的容器频繁失效,导致触发 kubelet 连续重启容器,kubelet 每次重启容器时会去检查间隔时间是否超过了指数退避的间隔时间,如果已经超过,那么 kubelet 会立即重启容器,此时 pod 的状态一直为 Running。如果发现没有超过,那么 kunelet 不会重启该容器,并且会将该 pod 的状态设置为 CrashLoopBackOff。
因此一般情况下 pod 前几次重启,都会显示 Running 状态,之后才会出现 CrashLoopBackOff 状态。并且在 Running 状态时 pod 会持续接收流量,而变为 CrashLoopBackOff 状态后,则不再接收流量
下图为 kubelet 相关源码,先判断是否在指数退避的时间内,如果在,则会返回 ErrCrashLoopBackOff 异常状态
