fix(acceptance): 阻断本地控制面漂移污染验收

本地 K3s 节点此前在 Kubelet 中登记为宿主机资源,负载可挤压 etcd 并在 server 重启后继续污染同一 Run。现在为三节点设置真实可调度预算、独立 etcd/数据卷和锁定依赖镜像,并持续核对 server 与 API/etcd 健康。\n\n每次验收生成独立 Run ID,报告使用独占或原子写入,负载错误记录具体阶段;数据库鉴权不可用返回带 Retry-After 的 503,避免基础设施故障被误报为 401。\n\n验证:Go 全量测试、go vet、gofmt、OpenAPI、bash -n、ShellCheck、报告测试和 k3d 配置解析均通过。
This commit is contained in:
2026-07-31 23:07:19 +08:00
parent 015ff8ea6c
commit a95184b5b6
20 changed files with 970 additions and 85 deletions
+24 -1
View File
@@ -25,11 +25,23 @@
| server-1 / hongkong | 4 CPU / 8 GiB | API、Worker、PostgreSQL |
| server-2 / los-angeles | 2 CPU / 4 GiB | 控制面和 etcd`NoSchedule` |
Docker Desktop 必须配置至少 24 GiB 内存;脚本只检查,不修改 Docker 设置。k3d、K3s 和
Docker Desktop 必须配置至少 24 GiB 内存,宿主工作盘必须至少保留 30 GiB 可用空间;
脚本只检查,不修改 Docker 或宿主设置。依赖预载后会先用锁定 K3s 镜像执行 10 秒容器
启动探针,应用镜像构建后再用本次验收的最小镜像复检,确保 Docker daemon 不只是 API
可读、而是真的能创建容器,再进入 K3d。
k3d、K3s 和
CNPG 版本及 SHA-256 位于
`deploy/kubernetes/local-acceptance/dependencies.lock`。高并发阶段使用宿主原生架构镜像,
最后才导入 release manifest 中精确的 `linux/amd64@sha256` 制品做启动、迁移和媒体冒烟。
K3s 启动时会通过 Kubelet `system-reserved`/`kube-reserved` 将两个业务节点的可调度资源
固定为 3 CPU/6656 MiB,将见证节点固定为 1 CPU/2560 MiB;随后 Docker 硬上限分别设置为
4C/8GiB、4C/8GiB、2C/4GiB。API CPU 为 250m/750mWorker 为 750m/1500mWorker
内存仍为 1536Mi/2Gi。etcd 与 PostgreSQL `local-path` 使用不同的命名卷,避免和业务媒体
目录共用 Docker writable layer。依赖镜像会在部署应用前按锁定 digest 预拉取并导入;若
Docker daemon 的系统代理不可用,则使用锁定版本的 `crane` 按同一 digest 拉取 OCI 内容,
再导入本地 Docker/K3s,不会退化为未校验 Tag。
```bash
scripts/acceptance/local-cluster.sh install-tools
scripts/acceptance/local-cluster.sh preflight
@@ -70,6 +82,10 @@ scripts/acceptance/local-cluster.sh up \
scripts/acceptance/run-local-acceptance.sh quick
# P24 基线应使用三个不同 Run ID 连续通过
scripts/acceptance/run-local-acceptance.sh quick
scripts/acceptance/run-local-acceptance.sh quick
scripts/acceptance/run-local-acceptance.sh full \
--release-manifest dist/releases/<完整SHA>.json
```
@@ -85,6 +101,13 @@ scripts/acceptance/run-local-acceptance.sh full \
7. 80% 两小时混合流量和 120% 十分钟主动限流。
8. 精确 amd64 release 镜像的迁移、启动与媒体冒烟。
每次 `quick``full` 或独立 `artifact-smoke` 都会先生成新的 Run ID;前一 Run 只有在队列
和 running 已归零后才会被本地安全终止。负载报告使用独占创建,已有文件不会被覆盖。
负载期间每 2 秒核对三个 K3s server 的容器 ID、restartCount、启动时间、IP、Node UID、
API readiness;任一 server 重启立即以 `local_control_plane_restarted` 终止。etcd 出现严重
心跳、fdatasync、ReadIndex 或请求超时则以 `local_etcd_latency` 阻断。本地 P24 基线先把
6K 图片归一化并发固定为 1,确认稳定后才允许单独测试更高媒体并发。
网络故障只能作用于带 `easyai.io/environment=local-acceptance` 标签的代理 Pod
```bash