Kubernetes Pod 故障归类与排查方法

2023-11-15

1、Pod 概念
Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度。

Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合。

Pod中可以共享网络和存储(可以简单理解为一个逻辑上的虚拟机,但并不是虚拟机)。

Pod被创建后用一个UID来唯一标识,当Pod生命周期结束,被一个等价Pod替代,UID将重新生成。

Docker 是 Kubernetes Pod 中最常用的容器运行时,但 Pod 也能支持其他的容器运行,比如 rkt、podman等。

2、Kubernetes 集群中的 Pod 可被用于以下两个主要用途:

运行单个容器的 Pod。“每个 Pod 一个容器”模型是最常见的 Kubernetes 用例;在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。
运行多个协同工作的容器的 Pod。Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序。这些位于同一位置的容器可能形成单个内聚的服务单元,一个容器将文件从共享卷提供给公众,而另一个单独的“挂斗”容器则刷新或更新这些文件。Pod 将这些容器和存储资源打包为一个可管理的实体。

3、Pod 控制器
控制器可以为您创建和管理多个 Pod,管理副本和上线,并在集群范围内提供自修复能力。例如,如果一个节点失败,控制器可以在不同的节点上调度一样的替身来自动替换 Pod。

包含一个或多个 Pod 的控制器一些示例包括:

Deployment kubernetes中最常用的控制器,用于运行无状态应用
StatefulSet 用于运行有状态应用
DaemonSet 作用就像是计算机中的守护进程,它能够运行集群存储、日志收集和监控等『守护进程』
控制器通常使用您提供的 Pod 模板来创建它所负责的 Pod。

4、Pod 故障归类

Pod状态 一直处于 Pending
Pod状态 一直处于 Waiting
Pod状态 一直处于 ContainerCreating
Pod状态 处于 ImagePullBackOff
Pod状态 处于 CrashLoopBackOff
Pod状态 处于 Error
Pod状态 一直处于 Terminating
Pod状态 处于 Unknown

5、Pod 排查故障命令
kubectl get pod -o yaml # 查看 Pod 配置是否正确
kubectl describe pod # 查看 Pod 详细事件信息
kubectl logs [-c ] # 查看容器日志

6、Pod 故障问题与排查方法

①:Pod 一直处于 Pending 状态

Pending状态,这个状态意味着,Pod 的 YAML 文件已经提交给 Kubernetes,API 对象已经被创建并保存在 Etcd 当中。但是,这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功(可以通过 kubectl describe pod 命令查看到当前 Pod 的事件,进而判断为什么没有调度)。可能原因:资源不足(集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 等资源);HostPort 已被占用(通常推荐使用 Service 对外开放服务端口)。

②:Pod 一直处于 Waiting 或 ContainerCreating 状态

首先还是通过 kubectl describe pod 命令查看到当前 Pod 的事件。可能的原因包括:

1、镜像拉取失败,比如,镜像地址配置错误、拉取不了国外镜像源(gcr.io)、私有镜像密钥配置错误、镜像太大导致拉取超时(可以适当调整 kubelet 的 --image-pull-progress-deadline 和 --runtime-request-timeout 选项)等。

2、CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如:无法配置 Pod 网络、无法分配 IP 地址。

3、容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数。

4、Failed create pod sandbox,查看kubelet日志,原因可能是磁盘坏道(input/output error)。

③:Pod 一直处于 ImagePullBackOff 状态
通常是镜像名称配置错误或者私有镜像的密钥配置错误导致。这种情况可以使用 docker pull 来验证镜像是否可以正常拉取。

如果私有镜像密钥配置错误或者没有配置,按下面检查:

1、查询 docker-registry 类型的 Secret
查看 docker-registry Secret
$ kubectl get secrets my-secret -o yaml | grep ‘dockerconfigjson:’ | awk ‘{print $NF}’ | base64 -d

2、创建 docker-registry 类型的 Secret

首先创建一个 docker-registry 类型的 Secret
$ kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

然后在 Deployment 中引用这个 Secret
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: my-secret

④:Pod 一直处于 CrashLoopBackOff 状态

CrashLoopBackOff 状态说明容器曾经启动了,但又异常退出。此时可以先查看一下容器的日志。

通过命令 kubectl logs 和 kubectl logs --previous 可以发现一些容器退出的原因,比如:容器进程退出、健康检查失败退出、此时如果还未发现线索,还可以到容器内执行命令来进一步查看退出原因(kubectl exec cassandra – cat /var/log/cassandra/system.log),如果还是没有线索,那就需要 SSH 登录该 Pod 所在的 Node 上,查看 Kubelet 或者 Docker 的日志进一步排查。

⑤:Pod 处于 Error 状态

通常处于 Error 状态说明 Pod 启动过程中发生了错误。常见的原因包括:依赖的 ConfigMap、Secret 或者 PV 等不存在;请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等;违反集群的安全策略,比如违反了 PodSecurityPolicy 等;容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定;

⑥:Pod 处于 Terminating 或 Unknown 状态

从 v1.5 开始,Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或 Unknown 状态。想要删除这些状态的 Pod 有三种方法:

1、从集群中删除该 Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(如 kubectl delete node )。

2、Node 恢复正常。Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。用户强制删除。用户可以执行 kubectl delete pods --grace-period=0 --force强制删除 Pod。除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。特别是 StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题。

3、Pod 行为异常,这里所说的行为异常是指 Pod 没有按预期的行为执行,比如没有运行 podSpec 里面设置的命令行参数。这一般是 podSpec yaml 文件内容有误,可以尝试使用 --validate 参数重建容器,比如:

kubectl delete pod mypod 和 kubectl create --validate -f mypod.yaml,也可以查看创建后的 podSpec 是否是对的,比如:kubectl get pod mypod -o yaml,修改静态 Pod 的 Manifest 后未自动重建,Kubelet 使用 inotify 机制检测 /etc/kubernetes/manifests 目录(可通过 Kubelet 的 --pod-manifest-path 选项指定)中静态 Pod 的变化,并在文件发生变化后重新创建相应的 Pod。但有时也会发生修改静态 Pod 的 Manifest 后未自动创建新 Pod 的情景,此时一个简单的修复方法是重启 Kubelet。

Unknown 这是一个异常状态,意味着 Pod 的状态不能持续地被 kubelet 汇报给 kube-apiserver,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes Pod 故障归类与排查方法 的相关文章

随机推荐

  • Alpaca构建方式探秘:低成本构造指令数据增强LLM

    官方介绍 Alpaca A Strong Replicable Instruction Following Model github地址 https github com tatsu lab stanford alpaca Alpaca简介
  • 【STL】list容器的插入与删除

    STL list容器插入与删除 添加或插入新元素 list成员方法 push front 向 list 容器首个元素前添加新元素 push back 向 list 容器最后一个元素后添加新元素 emplace front 在容器首个元素前直
  • 基于LSTM、BP神经网络实现电力系统负荷预测(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 LSTM 2 2 BP 3 Python代码及数据 4 参考文献 1 概述 前馈神经
  • JavaSE加强知识

    tips 在Java中 万物皆对象 不然我们的Java就白学了 本栏文章我们将会陆续上传以下知识 static 单例 代码块 继承 面向对象五大金刚 成员变量 方法 代码块 构造器 内部类 权限修饰符 抽象类 接口 多态 内部类 常用API
  • DDR3 终端参考电阻 rzq

    https blog csdn net chenzhen1080 article details 82951214 问题1 ddr3侧 的参考电阻和 FPGA侧 的参考电阻是不是同一个功能 同一个阻值 DDR3 器件上 要标配 240 参考
  • SGMD辛几何模态分解

    将时间序列分解为一组独立的模态分量 模态混叠情况大幅度降低 SGMD利用辛几何相似度变换来求解哈密顿矩阵的特征值 并利用其 相应的特征向量来重构单分量信号 同时 SGMD可以在没有任何用户定义参数的情况下 有效地重构现有的模式 去除噪声 该
  • Halcon中数据的四舍五入、取整、有效数字以及和字符串之间的转换

    a 3 456 取整 取最近的整数 int a int a 取整数部分 结果是3 round a round a 将输入元组转换为最接近的整数元组 结果是3 四舍五入 结果是字符串 g0 a 0f 保留0位 结果是 3 g1 a 1f 保留
  • js延迟操作

    在写前端代码的时候需要实现某些交互操作 有些效果需要停顿几秒再实现 这时可以用到下面的方法 setTimeout function 5秒后实现的方法写在这个方法里面 5 1000 延迟5000毫秒
  • 第15届全国大学生知识竞赛 2022ciscn初赛 部分wp

    Misc ez usb 1 键盘流量 USB协议数据部分在Leftover Capture Data域中 数据长度为八个字节 其中键盘击键信息集中在第三个字节中 如图 发现击键信息为0x06 即对应的按键为C 2 鼠标流量 USB协议鼠标数
  • 并发编程-Linux环境下C语言并发理解-一

    在centos7上安装gcc 使用yum命令安装还是非常easy的 yum y install gcc gcc c kernel devel 安装gcc c 编译器以及内核文件 使用VI工具编写如下代码 include
  • openssl命令基础用法:哈希

    单向加密需要使用的标准命令为 dgst 用法如下 openssl dgst md5 md4 md2 sha1 sha mdc2 ripemd160 dss1 c d hex binary out filename sign filename
  • 微信小程序项目:粤语教学平台-粤言粤语

    文章目录 1 项目简介 1 1 创意来源 1 2选题意义 2 总体设计 2 1 系统功能 2 1 1 功能概述 2 1 2 功能说明 2 2 系统软硬件平台 2 3 关键接口技术 2 4 作品特色 3 详细设计 3 1 系统结构设计 3 1
  • error C2666: “QByteRef::operator ==”: 2 个重载有相似的转换

    出现这样的问题 就是语法出现问题 以下写就是错的 以下写的就是解决了问题
  • 树莓派使用上spi tft!(fbtft的使用)

    关于树莓派的视频输出除了HDMI和 VNC基本上没有其他的方法 如果你手上刚好有一块TFT模块的话就可以当做系统显示屏 framebuff 虽然分辨率不高 但足以满足一些cmd的需求 github上项目 notro fbtft 很好的实现了
  • MyBatis使用resultMap解决1对多关联映射

    案例 查询MySQL中user表和orders表所有用户信息及用户关联的订单信息 用户信息和订单信息为一对多关系 SELECT u id u username u birthday u sex u address o id oid o nu
  • httprunner startproject.....报错

    httprunner新版本新建框架报错 问题 一开始报 cmd命令输入 httprunner startproject demo cmd结果显示 usage httprunner h V run make 我尝试降低到V2的版本 后面直接输
  • VMware虚拟机添加新硬盘

    在windows Server 2008 R2虚拟机配置中新加一块硬盘 首先在主机配置界面 打开虚拟主机设置 gt 添加一个新的硬盘组件 gt 选择磁盘接口类型 gt 创建新磁盘 gt 分配磁盘空间 gt 下一步安装 具体操作流程看下图 注
  • ARMV8体系结构简介:AArch64系统级体系结构之编程模型(3)- 异常

    1 前言 本文介绍异常相关内容 包括异常类型 异常进入 异常返回 异常层次结构 异常的路由等 2 RESET ARMV8体系结构支持两种类型的RESET Cold reset Reset PE所有的逻辑 包括集成的debug功能 Warm
  • Netty 全网最详细的教程! 没有之一!

    Netty 入门 文章目录 Netty 入门 入门案例 1 服务器端代码 2 客户端代码 3 运行流程 组件解释 使用组件 EventLoop 创建一个EventLoopServer 创建一个Client 细分 EventLoopGroup
  • Kubernetes Pod 故障归类与排查方法

    1 Pod 概念 Pod是kubernetes集群中最小的部署和管理的基本单元 协同寻址 协同调度 Pod是一个或多个容器的集合 是一个或一组服务 进程 的抽象集合 Pod中可以共享网络和存储 可以简单理解为一个逻辑上的虚拟机 但并不是虚拟