一次 nerdctl prune -a 导致 Kubernetes 节点不可用的复盘

背景

Kubernetes 节点磁盘快满了(90%+),

第一反应非常自然:清理无用容器和镜像。

节点使用的是 containerd,于是直接执行:

js 复制代码
nerdctl prune -a

磁盘立刻释放,看起来一切正常。

几分钟后,Pod 开始起不来了。

问题现象

kubelet 持续报错,所有新 Pod 卡在 ContainerCreating:

js 复制代码
Warning  FailedCreatePodSandBox
Failed to create pod sandbox:
failed to get sandbox image "localhost/kubernetes/pause"
failed to pull image "localhost/kubernetes/pause:latest"
dial tcp 127.0.0.1:443: connect: connection refused

表现:

  • 节点 NotReady
  • Pod 无法创建
  • 老 Pod 不受影响,新 Pod 全挂

紧急恢复操作

执行以下操作后集群恢复:

js 复制代码
sudo sed -i 's|sandbox_image = .*|sandbox_image = "registry.k8s.io/pause:3.9"|' \
  /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl restart kubelet

Pod 能正常创建,但问题本身并没有真正解释清楚。

根因分析

Kubernetes 强依赖 pause 镜像

在 containerd + kubelet 架构中:

  • 每个 Pod 都需要一个 sandbox
  • sandbox 本质是一个 pause 容器
  • 镜像由 containerd 的 CRI 插件管理

containerd 默认配置:

js 复制代码
sandbox_image = "registry.k8s.io/pause:3.9"

nerdctl prune -a 干了什么?

js 复制代码
nerdctl prune -a

实际含义是:

删除所有未被"当前运行容器"使用的资源*

而问题在于:

  • pause 镜像 不是运行容器
  • 但 kubelet 随时需要

结果就是:

Kubernetes 的基础镜像被当成"无用资源"删掉了

为什么会拉 localhost/kubernetes/pause ?

当 sandbox 镜像不存在时:

  • containerd 会尝试 fallback 地址
  • 节点没有本地 registry
  • 最终请求 https://localhost/v2/... 直接失败

这个错误非常迷惑,但根因还是 pause 镜像被删

生产环境安全清理建议

只清理停止容器(推荐)

js 复制代码
nerdctl container prune

只清理悬空镜像

js 复制代码
nerdctl image prune

带时间窗口清理镜像

js 复制代码
nerdctl image prune --all --filter until=240h

磁盘满的"真正大头":日志

这一步经常能直接释放大量空间

js 复制代码
find /var/log/containers -type f -name "*.log" -size +100M -exec truncate -s 0 {} \;
find /var/log/pods -type f -name "*.log" -size +100M -exec truncate -s 0 {} \;
相关推荐
无言听风雨丶1 小时前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
无言听风雨丶5 小时前
Kubernetes GitOps 持续交付实战:用 Argo CD 让 Git 成为集群事实源
git·elasticsearch·kubernetes
无言听风雨丶15 小时前
Kubernetes 控制平面深度剖析:从 kubectl apply 到 etcd 写入的全链路
平面·kubernetes·etcd
openFuyao16 小时前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉16 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
相思难忘成疾19 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
weirong20 小时前
给 K8s 加一个自动值班员:分级故障自愈引擎
kubernetes
云和数据.ChenGuang20 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
weirong1 天前
为什么 HPA 会震荡?手写一个带冷却窗口的伸缩决策引擎
kubernetes
-星空下无敌1 天前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba