目录

一、问题背景

二、问题分析过程

1 首先确认 Pod 状态

2 查看 Events 日志

三、问题原因

四、解决过程

五、验证 Pod 失败日志

六、CrashLoopBackOff 原理

七、本次实验总结

八、Kubernetes 排错小技巧

1 查看 Pod

2 查看详细信息

3 查看日志

4 查看系统组件

九、结语


一、问题背景

最近在做 Kubernetes 实验项目,需要创建一个 故意失败的 Pod,观察 Kubernetes 的自动重启机制。

实验中创建的 Pod 使用如下命令:

command:
- /bin/sh
- -c
- echo 'I am designed to fail!'; exit 1

按照实验要求,Pod 启动后应该不断失败并重启,最终状态会变为:

CrashLoopBackOff

于是我运行了:

watch kubectl get pods

理论上应该看到 Pod 进入 CrashLoopBackOff 状态。

但是实际情况却是:

NAME READY STATUS RESTARTS AGE
crash-app-784d5bfb5c-75zq7 0/1 ContainerCreating 0 10m

Pod 一直卡在 ContainerCreating,完全没有进入 CrashLoopBackOff。

这明显不符合实验预期,于是开始排错。


二、问题分析过程

1 首先确认 Pod 状态

先查看 Pod 详细信息:

kubectl describe pod crash-app-784d5bfb5c-75zq7

发现 Pod 状态为:

Status: Pending
Reason: ContainerCreating
IP: <none>

说明:

  • Pod 已经被调度

  • 但容器还没有成功启动

也就是说 容器根本还没开始运行


2 查看 Events 日志

describe 输出的最后部分发现了关键报错:


FailedCreatePodSandBox
plugin type="calico" failed (add):
error getting ClusterInformation:
connection is unauthorized: Unauthorized

完整报错类似:

Failed to create pod sandbox:
failed to setup network for sandbox
plugin type="calico" failed
connection is unauthorized

到这里基本可以确定问题:

Pod 网络创建失败。


三、问题原因

Kubernetes 创建 Pod 时,流程大致如下:

调度 Pod
↓
创建 Pod Sandbox
↓
配置网络 (CNI)
↓
启动容器

而我的问题卡在:

CNI 网络插件

这里使用的是 Calico 网络插件

报错:

plugin type="calico" failed
connection is unauthorized

说明 Calico 在访问 Kubernetes API 时认证失败,导致无法创建 Pod 网络。

因此:

  • Pod 没有 IP

  • 容器无法启动

  • 状态一直卡在 ContainerCreating

这也是为什么一直无法进入 CrashLoopBackOff

因为:

容器压根没有启动。


四、解决过程

既然问题出在网络插件,就先检查系统组件。

查看 kube-system 命名空间:

kubectl get pods -n kube-system

确认核心组件状态:

calico-node
calico-kube-controllers
coredns
kube-apiserver
kube-scheduler

全部为:

Running

说明组件本身没有崩溃。

直接 重启 Calico Pod。

执行:

kubectl delete pod -n kube-system -l k8s-app=calico-node

再执行:

kubectl delete pod -n kube-system -l k8s-app=calico-kube-controllers

Kubernetes 会自动重新创建。

然后观察:

kubectl get pods -n kube-system

等它们全部变成:

Running


然后重新看你的测试 Pod

这时再次观察 Pod 状态:

kubectl get pods -w

终于看到状态变化:

ContainerCreating
↓
Running
↓
Error
↓
CrashLoopBackOff

最终结果:

NAME READY STATUS RESTARTS
crash-app-784d5bfb5c-75zq7 0/1 CrashLoopBackOff 3

实验目标成功达成。


五、本次实验总结

这次实验最大的收获是理解了 Pod 创建的完整流程

调度
↓
创建 Sandbox
↓
配置网络
↓
启动容器
↓
执行程序

如果 Pod 卡在:

ContainerCreating

通常是:

  • CNI 网络问题

  • Volume 挂载失败

  • 镜像拉取失败

而如果 Pod 状态是:

CrashLoopBackOff

则说明:

  • 容器已经成功启动

  • 但程序执行失败

  • Kubernetes 正在不断重启容器


六、Kubernetes 排错小技巧

遇到 Pod 异常时,推荐排查顺序:

1 查看 Pod

kubectl get pods

2 查看详细信息

kubectl describe pod POD_NAME

重点关注:

Events


3 查看日志

kubectl logs POD_NAME

4 查看系统组件

kubectl get pods -n kube-system

七、结语

这次实验虽然只是一个简单的 CrashLoopBackOff 示例,但在排错过程中让我更清楚地理解了:

  • Kubernetes Pod 创建流程

  • CNI 网络插件的作用

  • CrashLoopBackOff 的触发机制

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐