随笔 - 378  文章 - 0  评论 - 5  阅读 - 6085

Pod的故障分析和一些状态

Pod的状态

一旦调度器将Pod分派给某个节点,kubelet通过容器运行(CRI接口)时开始为Pod创建容器。容器的状态有三种:Waiting(等待)、Running(运行中)和Terminated(已终止)。

每种状态都有特定的含义:

  1. Running(运行中)

    • Running态表明容器正在执行状态,并且没有问题发生。
  2. Terminated(已终止)

    • 处于Terminated状态的容器,说明该容器正在终止。
  3. Waiting(等待)

    • 如果容器并不处在Running或Terminated状态之一,它就处在Waiting状态。处于Waiting状态的容器仍在执行启动过程中所需的操作,比如从镜像仓库拉取容器镜像。

当使用kubectl查询包含Waiting状态的容器的Pod时,也会看到一个Reason字段,显示容器处于等待状态的原因。


Pod的阶段

  1. Pending(悬决)

    • Pod已被Kubernetes系统接受,但有一个或多个容器尚未创建或运行。此阶段包括等待Pod被调度的时间和下载镜像的时间。
  2. Running(运行中)

    • Pod已经绑定到某个节点,Pod中所有的容器都已创建,并且至少有一个容器仍在运行,或者正在启动或重启。
  3. Succeeded(成功)

    • Pod中的所有容器都已成功终止,并且不会再重启。
  4. Failed(失败)

    • Pod中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或被系统终止,且未设置为自动重启。
  5. Unknown(未知)

    • 由于某些原因无法获取Pod的状态,通常是因为与Pod所在主机通信失败。

Pod在使用中的各种状态和排错技巧

  1. ImagePullBackOff

    • 问题原因: 镜像拉取失败。
    • 可能原因:
      • 网络问题,检查Pod所在节点的网络连接;
      • 镜像名称错误;
      • 镜像来自私有仓库且没有权限拉取。
  2. ContainerCreating

    • 问题分析: 容器正在创建阶段,包含拉取镜像的时间。
  3. Pending

    • 问题分析: 任务已被K8S集群接受,但未调度到指定节点。
    • 可能原因:
      • 集群工作不正常,例如CNI组件未安装;
      • 指定的节点不存在;
      • 端口冲突,调度失败;
      • 所有节点被打上污点,Pod没有配置污点容忍。
  4. CrashLoopBackOff

    • 问题分析: Pod内至少有一个容器正在重启。
    • 可能原因: 容器的守护进程命令结束导致。
  5. Completed

    • 问题分析: 容器正常退出,未被强制中断。
  6. Running

    • 问题分析: 至少有一个容器处于正常运行状态。
  7. Init:1/2

    • 问题分析: Pod处于初始化容器阶段,已完成第一个初始化容器,正在初始化第二个容器。
  8. PodInitializing

    • 问题分析: Pod正处于初始化阶段。
  9. ErrImageNeverPull

    • 问题分析: 镜像拉取策略设置为Never,但本地没有缓存镜像,容器启动失败。
  10. OutOfcpu

    • 问题分析: CPU资源不足。
  11. OutOfmemory

    • 问题分析: 内存不足,无法分配。
  12. NodePorts

    • 问题分析: 当前节点的端口存在冲突。
  13. RunContainerError

    • 问题分析: 运行容器时出错。可以通过kubectl describe pods <POD_NAME>查看详细信息。
  14. ErrImagePull

    • 问题分析: 拉取镜像失败。
    • 可能原因:
      • 镜像名称错误;
      • 没有访问权限。
  15. Terminating

    • 问题分析: Pod的容器正在删除,过程通常不会超过60秒。
  16. CreateContainerConfigError

    • 问题分析: 容器配置错误。
  17. ContainerStatusUnknown

    • 问题分析: 容器重启策略为Never,且节点上容器被删除,无法获取状态。

Pod的故障排查技巧

  1. 准备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]#
  1. 编写资源清单
[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]#
  1. Pod的故障排查之explain文件查看

  2. kubectl explain
    可以查看文档字段的信息。

  3. 常见的数据类型

    • <string>:字符串类型。
    • <Object>:对象类型,字段有下级字段。
    • <map[string]string>:键值对。
    • <boolean>:布尔值(true或false)。
    • <[]Object>:数据对象,将下个各个字段进行分组。
    • <integer>:整型数字。
    • -required-:该字段必须填写。
  4. 查看文档的方式

[root@master231 pods]# kubectl explain pods
[root@master231 pods]# kubectl explain po.metadata

Pod的故障排查之文件拷贝

  1. 作用

    • 实现宿主机和Pod之间进行数据拷贝。
  2. 案例

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的故障排查之日志查看

  1. Pod容器日志查看

    • 查看Pod容器的日志信息。
  2. 常用的案例

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
posted on   Leo-Yide  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示