Files
teamai-global/skills/reclaim-cluster-disk/SKILL.md
T

46 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: "reclaim-cluster-disk"
description: "集群磁盘占用高/要腾空间时,按安全顺序回收:journal、apt、docker、tmp、用户缓存(三台机通用)。"
---
# 集群磁盘回收
触发:用户说「磁盘占用高」「清一下磁盘」「腾空间」「巡检一下,关注磁盘占用」。
三台机:**襄阳2c4g**(本机直接跑)、**十堰电信4c8g**(`ssh 十堰电信4c8g <cmd>`)、**阿里云**(`ssh aliyun <cmd>`)。
## 1. 先量
```bash
df -h / # 每台,先记基线
du -x -h --max-depth=1 / | sort -rh | head -15 # 一级大目录;很慢(>40s),用后台 process 轮询
du -x -h --max-depth=1 /var/lib /root | sort -rh | head -20
```
典型结论:`/var/lib`(containerd + k3s)是最大头但属运行必需;真正被忽略的是 journal、包缓存、/tmp、用户缓存。
## 2. 按风险从低到高回收
1. **归档日志**:`journalctl --vacuum-size=200M`(实测两台各回收 2.1G / 2.6G,只删已归档的)
2. **包缓存**:`apt-get clean`(实测 ~135M / 196M)
3. **宿主机 docker**(只对跑 docker 的机器;阿里云是 podman 模拟,看 `podman system df`):
`docker system df` 看 RECLAIMABLE → `docker image prune -a -f` → `docker builder prune -a -f`(实测 776M + 1.3G;使用中的镜像会被自动跳过)
4. **/tmp 里的过期包**:确认无用再删(实测 `searxng-image.tar`、`etcd.tar.gz`、`etcdctl`)
5. **用户缓存**:`rm -rf ~/.cache/uv ~/.cache/ms-playwright ~/.npm`(实测 ~1.6G;会重新下载,可接受)
6. **不用的自装服务**(可选):`systemctl --user disable --now <unit>` → `pkill -9 -f <name>` → 删 `/usr/local/lib/<name>`、`/usr/local/bin/<name>*`、`~/.<name>`、`~/.config/systemd/user/<unit>.service`(实测 hermes-agent 按此顺序清干净)
7. **核验**:`df -h /` 前后对比,逐台回报数字(实测 十堰 80%→59%、襄阳 61%→47%;阿里云本来就干净,没动)
破坏性步骤(prune、rm -rf)先列清单、拿到用户确认再执行。
## 3. 不要动
- **K3s 镜像不在 docker 里**:`docker image prune` 动不到 K3s 的 containerd。查 K3s 镜像必须带命名空间:
`ctr -a /run/k3s/containerd/containerd.sock -n k8s.io images list`(漏 `-n k8s.io` 得到空表,实测)。这些镜像都被运行中的 Pod 引用,**没有「闲置镜像」可清**。
- **PVC 数据是活数据**:`/var/lib/rancher/k3s/storage/*`(booklib / gitea / koishi)不能删。
- **别 purge 旧内核**:`apt-get purge linux-image-X-generic` 会连带删 `linux-image-virtual` / `linux-virtual` 元包、还要装 `linux-image-unsigned-X`(实测 dry-run)——每台只留 2 个内核已是精简状态,保持不动。
- **用户手动停的容器别删**(例如十堰的 `serene_northcutt`)。
## 4. 镜像能共享吗(常问)
不能。K3s/containerd 没有共享镜像存储:Pod 调度到哪台,哪台本地 containerd 就必须有一份;`imagePullPolicy: IfNotPresent` + `nodeSelector` 固定调度,能让每个镜像只落在需要的节点。各节点镜像清单用上面的 `ctr -n k8s.io` 命令查(这些机器上没装 `crictl`)。发现非调度节点上的冗余业务镜像(例:阿里云只跑 headlamp 却存着 searxng/blog 镜像)先别自动清——节点本地没镜像时 Pod 起不来,清理前要确认没有调度可能。