# R1.1 NC01 Tekton 大对象事故修复报告

## 结论

2026-07-17，NC01 UniDesk 中断已恢复，造成控制面压力的 HWLAB Tekton PipelineRun 重复内联实现已通过正常 PR 和 PaC 自动事件完成长期减载。新 PipelineRun 总对象缩小约 62%，spec 与 status.pipelineSpec 分别缩小约 75%；真实构建成功，NC01 节点与 UniDesk 原入口持续健康。

## 事故影响与短期恢复

- 事故窗口：2026-07-17 10:15-10:57 CEST。
- 影响：NC01 单节点 k3s 进入 NodeNotReady，unidesk namespace 的 backend-core、frontend、Decision Center 和 Todo Note 被驱逐，backend-core Service 一度无 endpoint，master server/provider ingress 不可用。
- 恢复动作：
  - 清理已被驱逐、卡在删除态及无 sandbox 的遗留 backend-core Pod；
  - 在 Pod 级恢复无效后重启本机 k3s，恢复 API、kubelet 与 containerd 调和；
  - 通过受控 cleanup 删除 7 个已终态 PipelineRun，保留 active run、最新成功证据、业务 PVC、Secret 与 runtime workload。
- 短期缓解不作为最终修复依据；长期修复由后续正常 PR 自动交付事件验收。

## 根因

故障对象 hwlab-ci/hwlab-nc01-v03-ci-poll-p9m8z 的 JSON 约 1.01 MB，其中 spec 约 501 KB，Tekton 又将完整 Pipeline spec 写入 status.pipelineSpec，约 504 KB。HWLAB renderer 为 14 个服务分别生成相同的大型 taskSpec.steps[].script，导致单个 PipelineRun 在 spec/status 双份持久化并随状态更新反复写入。

事故窗口证据：

- Kine compaction 单次持续 8.54 秒；
- node lease 写入延迟约 5.72 秒；
- 853 次 Slow SQL、1430 次 API Handler timeout；
- 633 次 stale resource-version、303 次 kubelet housekeeping timeout；
- k3s cgroup 曾有 1619 个任务，内存峰值约 7.9 GiB，swap 使用约 4.6 GiB；
- state.db 约 400 MB，WAL 约 357 MB。

结论是大型 PipelineRun、高频状态写入与 Kine/SQLite compaction 叠加，阻塞 API、node lease 和 kubelet 调和，最终导致 UniDesk 中断。TaskRun results 不是本次对象膨胀的主因。

## 长效修复

- HWLAB PR #2635，merge commit 7b3c53dde85dc361d71655e12c40dc9096d5aabe：
  - 增加 reusable Task renderer、RBAC 与 reconciler 支持；
  - NC01 v03 当前没有对应 control-plane reconciler，因此 TaskRef 不是本次实际运行路径。
- HWLAB PR #2636，merge commit 6995394830834ad6af1f20d144d5300efa993f69：
  - 将 14 个 per-service build task 收敛为一个 Tekton matrix task；
  - 首次自动事件暴露 service-id 同时由 task params 与 matrix.params 注入的 admission 错误。
- HWLAB PR #2637，merge commit e388061a3b748e05424fe6a293ed6b8a168f32a2：
  - 删除重复参数声明，只由 matrix.params 注入 service-id；
  - 正常 PaC 自动事件 hwlab-nc01-v03-ci-poll-zjdrs 成功，14 个 matrix TaskRun 全部成功。

matrix 是当前实际减载机制：大型脚本只在 PipelineRun 中保留一份，14 个服务仍保持独立执行语义，不依赖人工 PipelineRun、手工 apply、mirror sync 或补链。

## 验证

- renderer 测试：5 pass，0 fail。
- 新 PipelineRun：
  - 状态：Succeeded；
  - commit：e388061a3b748e05424fe6a293ed6b8a168f32a2；
  - 开始：2026-07-17T11:31:45Z；
  - 完成：2026-07-17T11:34:39Z；
  - 受控 history 显示 plan-artifacts、collect-artifacts、gitops-promote 均成功。
- 对象体积：
  - 旧对象：总计约 1,010,000 bytes，spec 约 501,000 bytes，status.pipelineSpec 约 504,000 bytes；
  - 新对象：总计 383,570 bytes，spec 126,076 bytes，status.pipelineSpec 127,871 bytes；
  - 总对象缩小约 62%，两份 Pipeline spec 分别缩小约 75%。
- source artifact：
  - 精确 source commit 与 embedded PipelineRun 对齐；
  - live standalone Pipeline 仍有旧默认 services/provenance 漂移；
  - PaC 实际执行消费 embedded spec，故该漂移记录为 blocking=false 的残余 warning，不阻塞业务。
- 最终 UniDesk 原入口：
  - NC01 node Ready；
  - backend-core、frontend、Decision Center、Todo Note 全部 1/1 Running；
  - backend-core /health 返回 ok=true、dbReady=true；
  - frontend /health 返回 HTTP 200、ok=true；
  - provider ingress /health 返回 ok=true。

## 残余边界

- standalone Pipeline 漂移后续应由正常 source/GitOps 路径自然收敛，不人工 apply。
- reusable Task/TaskRef 基础能力已保留，但在 NC01 v03 reconciler 未成为正式 owner 前不启用第二运行权威。
- 对象体积、Kine/WAL、API 延迟与 retention 继续作为运维 warning 和事故证据，不新增阻塞业务的阈值门禁或自动重启机制。

关联：[UniDesk #2458](https://github.com/pikasTech/unidesk/issues/2458)、[HWLAB #2635](https://github.com/pikasTech/HWLAB/pull/2635)、[HWLAB #2636](https://github.com/pikasTech/HWLAB/pull/2636)、[HWLAB #2637](https://github.com/pikasTech/HWLAB/pull/2637)。
