Kubernetes Pod 排错指南

Pod排错


Pod 各种异常现象,可能的原因以及解决方法。

排查过程常用的命名如下 :
  • 查看 Pod 状态: kubectl get pod -o wide
  • 查看 Pod yaml 配置: kubectl get pod -o yaml
  • 查看 Pod 事件: kubectl describe pod
  • 查看容器日志: kubectl logs [-c ]
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 启动过程中发生了错误。常见的原因包括:

  • 依赖的 ConfigMapSecret 或者 PV 等不存在
  • 请求的资源超过了管理员设置的限制,比如超过了 LimitRange
  • 违反集群的安全策略,比如违反了 PodSecurityPolicy
  • 容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定

你可能感兴趣的:(Kubernetes,Pod,kubernetes)