**用例名称** 日志或临时文件堆积 导致 Node_磁盘空间不足

**故障现象**：
1. 节点磁盘使用率告警（大于85%）
2. 容器无法写入数据
3. `/var/log`、`/tmp` 目录占用空间大

**资源准备**：
1. 确认应用 A/B 已正常运行
2. 确认节点磁盘空间充足

**演练步骤**：
1. 定位运行应用 A Pod 的节点
2. 使用 chaosblade 或其他故障注入工具向节点 `/var/log` 或 `/tmp` 目录持续写入数据，模拟日志或临时文件堆积
   - **路径语义**：在 K8s CRD 模式下（默认），`--path /tmp` 或 `--path /var/log` 是相对于容器 overlay 文件系统的路径，填充数据**通常**写入 imagefs 分区（需节点有独立 imagefs）；`--path /var/lib/docker` 等宿主机路径**通常**写入 nodefs 分区。实际分区取决于节点配置，验证时需确认检查的分区与填充目标分区一致
3. 观察节点磁盘使用率变化

**CRD 模式路径→分区映射表**：
**注意**：下表为常见配置下的启发式映射。实际分区取决于节点的挂载配置：
- 如果节点没有独立的 imagefs（容器运行时数据在根磁盘），所有路径都在 nodefs 上
- `/var/lib/docker`、`/var/lib/containerd` 在独立磁盘时属于 imagefs（它们定义了 imagefs），不是 nodefs
- 验证时以 `df -h`（无路径参数）的实际输出为准，而非下表

在 K8s CRD 模式下（ChaosBlade Operator），`--path` 参数决定填充数据写入哪个分区。验证时**必须**检查对应分区，否则会产生假阴性。

| `--path` 值 | 目标分区 | 典型后端设备 | 正确验证命令 | 常见假阴性命令 |
|---|---|---|---|---|
| `/tmp`, `/var/log`, `/var/run`, `/run` | imagefs（容器 overlay） | `/dev/vdb` 等独立磁盘 | `df -h`（无路径参数）列出所有挂载点，找 overlay 分区 | `df -h /host`（仅显示 nodefs） |
| `/var/lib/docker`, `/var/lib/containerd`, `/var/lib/kubelet` | nodefs（根文件系统） | `/dev/vda3` 等根分区 | `df -h /host` 显示根分区使用率 | `df -h`（找错 overlay 分区） |
| `/etc`, `/root`, `/home` | nodefs（根文件系统） | `/dev/vda3` 等根分区 | `df -h /host` 显示根分区使用率 | 同上 |
| 其他路径 | 需 `df -h` 列出全部后判定 | 不确定 | `df -h`（无路径参数）识别哪个分区使用率变化 | 仅检查单一分区 |

**注入验证**：
0. **基线完整性检查**（验证阶段第一步，必须先于其他验证步骤执行）：
   - **首条命令必须**是 `df -h`（无路径参数），列出所有分区使用率，标注与注入 `--path` 对应的分区（根据上方路径→分区映射表）。禁止先执行 `df -h /host` 或 `df -h /host/<path>` — 这些命令只显示 nodefs，会在 imagefs 场景下产生错误基线
   - 后续验证中，只对比**同一分区**的使用率变化。禁止将 nodefs 基线与 imagefs 注入后数据做对比
   - 若未在注入前记录目标分区基线，须在验证结论中注明"No pre-injection baseline available for <分区类型>"，并以首次检查值作为参考点
   - 若首次检查值已接近注入参数预期值（如 `--percent 85` 对应 84%），此即故障生效的证据，无需等待"变化"
1. 查看节点磁盘使用率，确认磁盘使用率变化。通过 `kubectl debug` 两步法查看宿主机磁盘使用率：
   - Step 1：`kubectl debug node/<节点名> --image=busybox -- sleep 3600`（必须含 `-- sleep 3600` 保活，裸 busybox 会立即退出）
   - Step 2：从 Step 1 输出找到 debug pod 名称，然后 `kubectl exec <debug-pod> -n default -- df -h`
   - `df -h` 列出所有挂载的文件系统。如果节点有多个磁盘分区（如 nodefs 和 imagefs 分开），需检查**所有分区**的使用率变化。`df -h /host` 仅显示 nodefs（根分区）；imagefs 的变化需通过 `df -h` 列出所有挂载点来识别
   - **注意**：otel-c-tool 不挂载 /host，`kubectl exec <otel-c-tool> -- df -h` 显示的是 overlay 文件系统，不能用于宿主机磁盘验证。禁止仅通过 `kubectl exec <Pod> -- df -h` 验证（容器 overlay 文件系统≠宿主机文件系统）
2. 检查 `/var/log`、`/tmp` 目录大小，确认占用显著。需通过 kubectl debug 两步法进入 debug pod，路径加 `/host/` 前缀（如 `du -sh /host/tmp`、`du -sh /host/var/log`）

   **CRD 模式重要提醒**：`du -sh /host/<path>` 检查的是宿主机文件系统（nodefs）。如果注入使用了 `--path /var/log` 或 `--path /tmp`（在 CRD 模式下写入容器 overlay/imagefs），`du` 将看到宿主机路径的**原始大小**，不会反映 fill 数据。此时 `df -h`（bare, 无路径参数）展示的 overlay/imagefs 使用率变化才是 fill 效果的正确证据。

   - 若 `df -h` 已确认目标分区使用率达到预期 → Step 2 可标记为 `expected: du checks host nodefs, fill in imagefs overlay (confirmed by df -h)`，不要标记为 `failed`
   - 若 fill 路径映射到 nodefs（如 `--path /var/lib/docker`）→ `du -sh /host/<path>` 应能观察到增长
3. 使用容器运行时工具查看容器、镜像和日志占用
4. 使用 `kubectl describe node <节点名>` 检查 DiskPressure 条件，确认 K8s 层面已检测到磁盘压力

**验证语义说明**：区分两个概念：(1) 注入验证——填充数据是否写入成功（通过填充文件或磁盘增量判断）；(2) 场景验证——磁盘使用率是否达到 85%。注入验证通过但场景验证未达标时，Layer 2 应报告 'passed' 并在 Warnings 中注明阈值未达到。如果使用率未达 85%，说明 --size 参数过小，应增加 size 或改用 percent 参数。这不代表注入失败。

**注入恢复**：
1. 销毁 chaosblade 实验
2. 停止数据写入或删除创建的大文件
3. 清理日志文件

**恢复验证**：
1. 查看节点磁盘使用率，确认恢复到正常水平。使用 kubectl debug 两步法（同注入验证），执行 `df -h`（无路径参数）检查所有磁盘分区均恢复
2. 确认应用 A/B 可正常写入数据
3. 确认 `/var/log`、`/tmp` 目录大小恢复正常（需通过宿主机文件系统访问方式验证）

**基准事实**：
- **根因**：容器日志或临时文件未清理，导致磁盘空间被占满
- **必现现象**：节点磁盘使用率大于85%，`/var/log` 或 `/tmp` 目录占用空间大

---

**降级方案（kubectl-native）**

> 当 ChaosBlade 不可用时，可使用以下 kubectl 原生命令实现等效节点磁盘填充。

前提条件：集群需支持 `kubectl debug node` 功能（K8s 1.18+）；选择已验证可拉取且含 `chroot`/`sh` 的镜像；宿主机变更必须 `--profile=sysadmin`；禁用 `-it`

注入命令（填充量必须按**增量**计算，先经 debug pod 测目标分区基线）：
```bash
# 0) 先测目标分区基线：总容量、已用量（df 的路径用宿主机真实路径）
kubectl debug node/<node-name> --profile=sysadmin --image=<verified-cluster-image> -- chroot /host df -h /var/log

# 1) 填充量 = 分区总容量 × 目标使用率(如 85%) − 当前已用量
#    例：分区 100G、已用 50G、目标 85% → 100×0.85 − 50 = 35G

# 2) 通过 kubectl debug node 在 /var/log 或 /tmp 目录填充数据
kubectl debug node/<node-name> --profile=sysadmin --image=<verified-cluster-image> -- chroot /host sh -c \
  'dd if=/dev/zero of=/var/log/app-archive.log bs=1M count=<算出的填充量换算的MB数>'
# 或使用 fallocate（更快）：
kubectl debug node/<node-name> --profile=sysadmin --image=<verified-cluster-image> -- chroot /host sh -c \
  'fallocate -l <算出的填充量>G /tmp/app-archive.log'
```

恢复命令：
```bash
# 删除填充文件
kubectl debug node/<node-name> --profile=sysadmin --image=<verified-cluster-image> -- chroot /host sh -c \
  'rm -f /var/log/app-archive.log /tmp/app-archive.log'
# 删除 debug Pod
kubectl delete pod <debug-pod-name> --force --grace-period=0
```

注意事项：
- 填充路径对应的分区取决于节点配置，需参考上方「CRD 模式路径→分区映射表」
- 与 ChaosBlade `--percent` 不同，此方式需按**增量**手动计算填充字节数（填充量 = 分区总容量 × 目标使用率 − 当前已用量）；量太小达不到 85% 告警阈值，量太大把分区填满会触发非预期的 DiskPressure/驱逐
- 无自动超时恢复，必须手动删除填充文件
