Pod的故障分析和一些状态
Pod的状态
一旦调度器将Pod分派给某个节点,kubelet通过容器运行(CRI接口)时开始为Pod创建容器。容器的状态有三种:Waiting(等待)、Running(运行中)和Terminated(已终止)。
每种状态都有特定的含义:
-
Running(运行中)
- Running态表明容器正在执行状态,并且没有问题发生。
-
Terminated(已终止)
- 处于Terminated状态的容器,说明该容器正在终止。
-
Waiting(等待)
- 如果容器并不处在Running或Terminated状态之一,它就处在Waiting状态。处于Waiting状态的容器仍在执行启动过程中所需的操作,比如从镜像仓库拉取容器镜像。
当使用kubectl
查询包含Waiting状态的容器的Pod时,也会看到一个Reason字段,显示容器处于等待状态的原因。
Pod的阶段
-
Pending(悬决)
- Pod已被Kubernetes系统接受,但有一个或多个容器尚未创建或运行。此阶段包括等待Pod被调度的时间和下载镜像的时间。
-
Running(运行中)
- Pod已经绑定到某个节点,Pod中所有的容器都已创建,并且至少有一个容器仍在运行,或者正在启动或重启。
-
Succeeded(成功)
- Pod中的所有容器都已成功终止,并且不会再重启。
-
Failed(失败)
- Pod中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或被系统终止,且未设置为自动重启。
-
Unknown(未知)
- 由于某些原因无法获取Pod的状态,通常是因为与Pod所在主机通信失败。
Pod在使用中的各种状态和排错技巧
-
ImagePullBackOff
- 问题原因: 镜像拉取失败。
- 可能原因:
- 网络问题,检查Pod所在节点的网络连接;
- 镜像名称错误;
- 镜像来自私有仓库且没有权限拉取。
-
ContainerCreating
- 问题分析: 容器正在创建阶段,包含拉取镜像的时间。
-
Pending
- 问题分析: 任务已被K8S集群接受,但未调度到指定节点。
- 可能原因:
- 集群工作不正常,例如CNI组件未安装;
- 指定的节点不存在;
- 端口冲突,调度失败;
- 所有节点被打上污点,Pod没有配置污点容忍。
-
CrashLoopBackOff
- 问题分析: Pod内至少有一个容器正在重启。
- 可能原因: 容器的守护进程命令结束导致。
-
Completed
- 问题分析: 容器正常退出,未被强制中断。
-
Running
- 问题分析: 至少有一个容器处于正常运行状态。
-
Init:1/2
- 问题分析: Pod处于初始化容器阶段,已完成第一个初始化容器,正在初始化第二个容器。
-
PodInitializing
- 问题分析: Pod正处于初始化阶段。
-
ErrImageNeverPull
- 问题分析: 镜像拉取策略设置为Never,但本地没有缓存镜像,容器启动失败。
-
OutOfcpu
- 问题分析: CPU资源不足。
-
OutOfmemory
- 问题分析: 内存不足,无法分配。
-
NodePorts
- 问题分析: 当前节点的端口存在冲突。
-
RunContainerError
- 问题分析: 运行容器时出错。可以通过
kubectl describe pods <POD_NAME>
查看详细信息。
- 问题分析: 运行容器时出错。可以通过
-
ErrImagePull
- 问题分析: 拉取镜像失败。
- 可能原因:
- 镜像名称错误;
- 没有访问权限。
-
Terminating
- 问题分析: Pod的容器正在删除,过程通常不会超过60秒。
-
CreateContainerConfigError
- 问题分析: 容器配置错误。
-
ContainerStatusUnknown
- 问题分析: 容器重启策略为Never,且节点上容器被删除,无法获取状态。
Pod的故障排查技巧
- 准备Dockerfile测试
[root@worker233 dockerfile]# cat Dockerfile
FROM harbor.oldboyedu.com/oldboyedu-linux/alpine:3.20.2
RUN mkdir /oldboyedu-xixi
CMD ["ls","-l","/oldboyedu-xixi"]
[root@worker233 dockerfile]#
[root@worker233 dockerfile]# docker build -t harbor.oldboyedu.com/oldboyedu-troubleshooting/oldboyedu-xixi:v0.1 .
[root@worker233 dockerfile]#
[root@worker233 dockerfile]# docker push harbor.oldboyedu.com/oldboyedu-troubleshooting/oldboyedu-xixi:v0.1
[root@worker233 dockerfile]#
- 编写资源清单
[root@master231 pods]# cat 05-pods-Troubleshooting.yaml
apiVersion: v1
kind: Pod
metadata:
name: www.oldboyedu.com-linux92-002
spec:
nodeName: worker232
containers:
- image: harbor.oldboyedu.com/oldboyedu-troubleshooting/oldboyedu-xixi:v0.1
name: mylinux
command:
- tail
- -f
args:
- /etc/hosts
[root@master231 pods]#
-
Pod的故障排查之explain文件查看
-
kubectl explain
可以查看文档字段的信息。 -
常见的数据类型
<string>
:字符串类型。<Object>
:对象类型,字段有下级字段。<map[string]string>
:键值对。<boolean>
:布尔值(true或false)。<[]Object>
:数据对象,将下个各个字段进行分组。<integer>
:整型数字。-required-
:该字段必须填写。
-
查看文档的方式
[root@master231 pods]# kubectl explain pods
[root@master231 pods]# kubectl explain po.metadata
Pod的故障排查之文件拷贝
-
作用
- 实现宿主机和Pod之间进行数据拷贝。
-
案例
2.1 将Pod容器的目录拷贝到宿主机的"./xixi"
[root@master231 ~]# kubectl cp www.oldboyedu.com-linux92-002:/oldboyedu-xixi/ ./xixi
tar: removing leading '/' from member names
[root@master231 ~]#
2.2 将Pod容器的文件拷贝到宿主机的路径并更名
[root@master231 ~]# kubectl cp www.oldboyedu.com-linux92-002:/oldboyedu-xixi/os-release ./xixi
2.3 将宿主机的文件拷贝到容器的指定目录
[root@master231 ~]# kubectl cp kube-flannel.yml www.oldboyedu.com-linux92-002:/
2.4 将宿主机的目录拷贝到容器的指定目录
[root@master231 ~]# kubectl cp download www.oldboyedu.com-linux92-002:/
2.5 将宿主机的目录拷贝到指定容器的指定目录并更名
[root@master231 ~]# kubectl cp -c mylinux download www.oldboyedu.com-linux92-002:/haha-download
Pod的故障排查之日志查看
-
Pod容器日志查看
- 查看Pod容器的日志信息。
-
常用的案例
2.1 实时查看当前容器的日志
[root@master231 pods]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v1 1/1 Running 0 6s 10.100.1.23 worker232 <none> <none>
[root@master231 pods]#
[root@master231 pods]# kubectl logs -f xiuxian-v1
2.2 查看Pod重启之前上一个日志信息
[root@master231 pods]# kubectl logs -f xiuxian-v1 -p
2.3 查看指定时间之后的并显示时间戳
[root@master231 pods]# kubectl logs -f xiuxian-v1 --since-time=2024-07-31T03:45:41.070228614Z --timestamps
2024-07-31T03:45:41.070228614Z 10.100.0.0 - - [31/Jul/2024:03:45:41 +0000] "GET / HTTP/1.1" 200 357 "-" "curl/7.81.0" "-"
2024-07-31T03:45:44.685178096Z 10.100.0.0 - - [31/Jul/2024:03:45:44 +0000] "GET / HTTP/1.1" 200 357 "-" "curl/7.81.0" "-"
温馨提示:
如果容器重启之前的容器被删除,则无法查看之前的日志信息。
[root@master231 pods]# kubectl logs -f xiuxian-v1 -p
Error from server (BadRequest): previous terminated container "xiuxian" in pod "xiuxian-v1" not found
总结:故障排查技巧
- kubectl describe → 查看事件(由kubelet上报,前提是Pod已经成功调度)
- kubectl logs → 根据日志判断容器的运行状态
- kubectl exec → 执行容器命令
- 若容器启动失败,可以暂时启动容器,修改command或args字段,将容器强行启动,启动后再进入容器进行排查
- kubectl cp → 容器数据拷贝
- 字段写错,尤其是元数据的名称,只能是小写字母,包括特殊字符:
"-"
,"."
- kubectl explain → 查看文档的信息
- 环境变量传递:
env
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)