跳至主要內容

kubernetes-pod

知识库容器技术kubernetes介绍kubernetes介绍大约 3 分钟

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 状态

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 : 网络插件还没有完全启动

常见问题

Pod 一直处于 Pending 状态

Pending 状态说明 Pod 还没有被调度到某个节点上,需要看下 Pod 事件进一步判断原因,比如

kubectl describe pod tikv-0

下面列举下可能原因

  • 节点资源不够

    • CPU 负载过高
    • 剩余可以被分配的内存不够
    • 剩余可用 GPU 数量不够 (通常在机器学习场景,GPU 集群环境)
  • 不满足 nodeSelector 与 affinity

  • Node 存在 Pod 没有容忍的污点

    如果节点上存在污点 (Taints),而 Pod 没有响应的容忍 (Tolerations),Pod 也将不会调度上去。通过 describe node 可以看下 Node 有哪些 Taints:

    ## 查看节点
    kubectl describe nodes host1
    # Taints: special=true:NoSchedule
    ###### 手动添加的污点
    kubectl taint node host1 special=true:NoSchedule
    ###### 自动添加的污点
    # OutOfDisk           True      node.kubernetes.io/out-of-disk            为 True 表示节点磁盘空间不够了
    # Ready               False     node.kubernetes.io/not-ready              为 False 表示节点不健康
    # Ready               Unknown   node.kubernetes.io/unreachable            为 Unknown 表示节点失联,在 node-monitor-grace-period 这么长的时间内没有上报状态 controller-manager 就会将 Node 状态置为 Unknown (默认 40s)
    # MemoryPressure      True      node.kubernetes.io/memory-pressure        为 True 表示节点内存压力大,实际可用内存很少
    # PIDPressure         True      node.kubernetes.io/pid-pressure           为 True 表示节点上运行了太多进程,PID 数量不够用了
    # DiskPressure        True      node.kubernetes.io/disk-pressure          为 True 表示节点上的磁盘可用空间太少了
    # NetworkUnavailable  True      node.kubernetes.io/network-unavailable    为 True 表示节点上的网络没有正确配置,无法跟其它 Pod 正常通信
    # 另外,在云环境下,比如腾讯云 TKE,添加新节点会先给这个 Node 加上node.cloudprovider.kubernetes.io/uninitialized 的污点,等 Node 初始化成功后才自动移除这个污点,避免 Pod 被调度到没初始化好的 Node 上。
    

Pod 一直处于 Error 状态

通常处于 Error 状态说明 Pod 启动过程中发生了错误。常见的原因包括:

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