Appearance
从空环境到一张可核销的模型申请
最后的验收故意从租户那一端开始:能否用同一 ID 重试而不重复花额度,能否在模型真正 Ready 后完成一次请求,又能否在删掉它后把额度还回来?这三项分属不同系统;只看网页绿色状态验不出漏账。
验收有两层:引擎规则可以在单机 go test;真实链路必须让 SQL、API Server、控制器、端点和前端同时说得通。从根目录按顺序执行,依赖和首次下载见开发环境。
sh
./scripts/bootstrap-kind.sh
export KUBECONFIG="$PWD/tmp/handbook.kubeconfig"
./scripts/mysql-lab.sh start
export LAB_MYSQL_DSN="root@unix($PWD/tmp/private-mysql/mysql.sock)/cloudlab"
mkdir -p .bin
(cd modeldock/admission && go build -o ../../.bin/admit .)
python3 scripts/check-admission.py脚本自动生成临时租户凭证,走 Gin POST、重复受理、另一个租户查询被拒、等待 SQL worker 投递、等待 ModelService Running、删除、reconcile、幂等 release。预期末行 PASS tenant auth, duplicate submission, SQL admission, outbox, Ready, reconcile and idempotent release。若超时先查 outbox 是否送达,再查绑定 UID 和 Pod Events;不要反复换新 ID 提交同一计费请求。若测试被打断,先核对脚本本次生成的 gin- ID 和绑定,再删除本次 CR 并对该 ID 运行 reconcile/release。
通过网关验证模型对用户可用
先为网关做本机转发,在新终端从 Secret 读入当前进程,不在日志里打印。然后分别测试接口、模型以及前端代理。
sh
kubectl -n modeldock-lab port-forward svc/modeldock-gateway 18188:8080
# 新终端,先 export 同一个 KUBECONFIG
export GATEWAY_TOKEN="$(kubectl -n modeldock-lab get secret handbook-gateway -o jsonpath='{.data.TENANT_KEYS_JSON}' | base64 -D | python3 -c 'import sys,json; print(json.load(sys.stdin)["team-a"]["Token"])')"
python3 scripts/inference_bench.py --requests 12 --concurrency 4
npm ci
npm run console:devMac 使用 base64 -D;Linux 可用 -d。打开终端显示的控制台地址,使用网关凭据调用 chart-demo。OpsPilot 单独监听 18190,没启动时诊断面板会报错,并不意味着推理失败。完成后停止 port-forward、开发服务器,unset GATEWAY_TOKEN;私有数据库用脚本 stop。若专门为这次练习新建集群,最后可 kind delete cluster --name handbook-lab,复用集群时只删本次资源。
进阶验收。 在固定副本模式按控制器篇触发漂移,观察回到声明;按Agent 实战触发真实调度故障,再区别自动纠偏和必须审批的变更。集群账本、可选 Redis 测试分别验收,有 Redis 并不证明多实例全链路故障转移。