根因解析 | Kubernetes Pod状态异常九大场景盘点
共 3412字,需浏览 7分钟
·
2021-12-25 05:37
调度
镜像拉取
磁盘挂载
Liveless/Readiness probe
postStart/preStop handler
配置
运行时
常见问题场景
Cloud Native
资源不足,无法调度(Pending),即集群的 Node 没有预留资源能够满足 Pod 的 Request 资源;
镜像拉取失败( ImagePullBackoff ),镜像的仓库地址,tag 出现问题;
磁盘挂载失败(Pending),容器挂载的 PVC 没有 bound;
Liveless probe 探针失败,频繁重启;
Readiness probe 探针失败,无法达到 Ready 状态;
postStart 执行失败,一直无法进入运行状态;
运行时程序崩溃( CrashLoopBackOff ),频繁重启;
配置错误,比如挂载的 Volume 不存在(RunContainerError)。
程序异常退出,比如非法地址访问,比如进入了程序需要退出的条件等;
容器内存使用量超过内存 Limit 量,被 OOMKilled。
请求量突增,程序自身可能触发流控或者其他异常处理,导致请求处理失败率提升;
自身代码处理错误,请求量没有变化,可能是上线新的功能有 bug;
不可压缩资源不足(磁盘,内存),请求处理包含磁盘的写操作,资源不足出现失败;外部依赖服务报错,请求处理需要调用下游服务,他们报错引发请求处理失败。
请求量突增,程序自身处理不过来,导致超时;
自身代码池化资源不足,因为 bug 导致的线程池或者队列满,请求处理不过来,导致超时;
Pod 运行资源不足,请求处理包含 cpu/memory/io 资源的申请,但是资源不足导致处理慢;
外部依赖服务响应时间高,请求处理需要调用下游服务,他们的响应时间高会导致请求处理慢;
自身代码内存泄露;
Pod 内存 Request 值偏低,如果该值偏低的情况下配置 HPA,会频繁触发扩容,同时具有被驱逐的风险;
自身代码内存泄露;
Pod 内存 Limit 值偏低,容器内存使用量超过 Limit 值会被 OOMKilled 掉;
自身代码效率不足,业务处理的时间复杂度太高,需要找到热点方法进行优化;
Pod CPU Request 值偏低,如果该值偏低的情况下配置 HPA,会频发触发扩容,同时具有被驱逐的风险;
自身代码效率不足,业务处理的时间复杂度太高,需要找到热点方法进行优化;
Pod CPU Limit 值设置太低,CPU 使用量超过该值,对应容器的 CPU 会被 Throttled;
容器运行时自身问题,更具体来说个别内核版本即使在 CPU 没有超过 Limit 的时候也会对容器进行 CPU Throttled;
自身代码文件读写过于频繁,可以考虑批量化读写;
节点本身的 IO 高影响 Pod,节点的 IO 是共享资源,部分高 IO 的 Pod 可能影响其他 Pod;
最佳实践
Cloud Native