Pod一直处于CrashLoopBackOff状态的排查思路

问题现象

一台宿主机上启动的Pod一直重启,describe报错信息如下

Pod sandbox changed, it will be killed and re-created.

信息在这里插入图片描述

原因分析

  1. Pod处于CrashLoopBackOff状态,第一想到的是Liveness probe failed或者OOM-kill; 测试Pod没有配置存活探测,查看对应机器也没有OOM-kill相关内核日志;
  2. 怀疑是否dockerd进程资源比较紧张,比如被死循环的容器一直消耗资源;查看机器资源都处于正常水平,排除Pod因为资源问题重启;
  3. 修改测试Pod的网络方式改为hostnetwork模式启动Pod,在问题机器上可以正常启动Pod,再次排除资源问题导致;
  4. SandboxChanged:怀疑是CNI 分配IP失败,导致循环分配,看起来比较像;于是查看网络插件canal Pod日志(hostnetwork模式)和kubelet日志查看具体过程;

以下是网络插件的日志信息,可以看到都是INFO日志,分配PodIP成功。

在这里插入图片描述

以下是kubelet对应的日志,也可以看到使用了对应的Pod IP并分配给container

在这里插入图片描述

继续往下看kubelt的日志, 发现了一个可疑的error,使用nsenter 的某个参数失败,然后接下来是Endpoint will be hanled。 下一段日志又到了kubelet重新分配IP和container endpoint,这里和问题现象符合,docker ps可以看到有很多pause容器退出重建; 所以可以初步怀疑就是kubelet在创建Pod过程中卡在nsenter的使用方法上,对比nsenter的版本和help手册发现果然是该机器的nsenter问题。

在这里插入图片描述

修复nsenter相关的bin文件后问题解决,也是第一次碰到,Pod创建过程中居然依赖nsenter工具,于是也去看了下对应的go代码,果然在分配IP后会使用nsenter检索IP,如果检索失败就会退出,对应的源码信息如下:

在这里插入图片描述
在这里插入图片描述

Kubernetes 中的 Pod 处于 `CrashLoopBackOff` 状态时,通常意味着容器在启动后立即崩溃,然后不断地重启,形成一个无限循环。这种情况可能由多种原因引起,包括但不限于: 1. **容器镜像问题**:镜像可能存在启动时的错误,如配置错误、代码bug、依赖缺失或版本不兼容等。 2. **资源不足**:如果Pod的资源请求(CPU、内存)超过了集群中可用的资源,也会导致Pod进入 `CrashLoopBackOff`。 3. **环境变量或配置文件**:环境变量设置不正确,或者配置文件存在问题可能导致应用无法正常初始化。 4. **日志错误**:查看Pod的 logs 可能会发现错误信息,这些信息会帮助定位问题所在。 5. **卷挂载问题**:如果容器依赖外部卷(如持久化存储),卷挂载失败也会造成这种情况。 解决方法可以分为以下几个步骤: - **检查日志**:使用 `kubectl logs <pod-name>` 查看容器的日志输出,找出错误的根源。 - **审查配置**:检查 pod 的定义和容器的启动命令,确保一切配置正确无误。 - **资源调整**:如果资源不足,根据需要调整 Pod 的资源请求和限制。 - **修复镜像**:如果是镜像问题,更新镜像或者修复启动脚本。 - **检查网络**:确认网络配置没有问题,特别是对于需要网络访问的应用。 - **等待事件解决**:有时候,短暂的故障会被自动恢复,可以稍等片刻再观察。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值