kubernetes-pod
大约 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 配置角色绑定