Pod排错
Pod 各种异常现象,可能的原因以及解决方法。
排查过程常用的命名如下
:
- 查看 Pod 状态: kubectl get pod <pod-name> -o wide
- 查看 Pod 的 yaml 配置: kubectl get pod <pod-name> -o yaml
- 查看 Pod 事件: kubectl describe pod <pod-name>
- 查看容器日志: kubectl logs <pod-name> [-c <container-name>]
Pod
有多种状态,这里罗列一下
:
Error
: Pod
启动过程中发生错误
NodeLost
: Pod
所在节点失联
Unkown
: Pod
所在节点失联或其它未知异常
Waiting
: Pod
等待启动
Pending
: Pod
等待被调度
ContainerCreating
: Pod
容器正在被创建
Terminating
: Pod
正在被销毁
CrashLoopBackOff
: 容器退出,
kubelet
正在将它重启
InvalidImageName
: 无法解析镜像名称
ImageInspectError
: 无法校验镜像
ErrImageNeverPull
: 策略禁止拉取镜像
ImagePullBackOff
: 正在重试拉取
RegistryUnavailable
: 连接不到镜像中心
ErrImagePull
: 通用的拉取镜像出错
CreateContainerConfigError
: 不能创建
kubelet
使用的容器配置
CreateContainerError
: 创建容器失败
RunContainerError
: 启动容器失败
PreStartHookError
:
执行
preStart hook
报错
PostStartHookError
: 执行
postStart hook
报错
ContainersNotInitialized
: 容器没有初始化完毕
ContainersNotReady
: 容器没有准备完毕
ContainerCreating
:容器创建中
PodInitializing
:
pod
初始化中
DockerDaemonNotReady
:
docker
还没有完全启动
NetworkPluginNotReady
: 网络插件还没有完全启动
Failed
失败(Failed):Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止。即容器以非0状态退出或者被系统禁止。 (容器进程主动退出)
容器进程如果是自己主动退出
(
不是被外界中断杀死
)
,退出状态码一般在
0-128
之间,根据约定,正 常退出时状态码为 0
,
1-127
说明是程序发生异常,主动退出了,比如检测到启动的参数和条件不满足要求,或者运行过程中发生 panic
但没有捕获处理导致程序退出。除了可能是业务程序
BUG
,还有其它许多可能原因,这里我们一一列举下。
DNS 无法解析
可能程序依赖集群
DNS
服务,比如启动时连接数据库,数据库使用
service
名称或外部域名都需
要
DNS
解析,如果解析失败程序将报错并主动退出。解析失败的可能原因
:
- 集群网络有问题,Pod 连不上集群 DNS 服务
- 集群 DNS 服务挂了,无法响应解析请求
- Service 或域名地址配置有误,本身是无法解析的地址
程序配置有误
- 配置文件格式错误,程序启动解析配置失败报错退出
- 配置内容不符合规范,比如配置中某个字段是必选但没有填写,配置校验不通过,程序报错主动退出
Pod 一直处于 Unknown 状态
通常是节点失联,没有上报状态给 apiserver,到达阀值后 controller-manager 认为节点失联并将其状态置为 Unknown 。
可能原因
:
- 节点高负载导致无法上报
- 节点宕机
- 节点被关机
- 网络不通
Pod 一直处于 Error 状态
通常处于 Error 状态说明 Pod 启动过程中发生了错误。常见的原因包括:
- 依赖的 ConfigMap、Secret 或者 PV 等不存在
- 请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等
- 违反集群的安全策略,比如违反了 PodSecurityPolicy 等
- 容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定