Appearance
开发环境:把本地、Kind 和硬件依赖拆开
从完整实验包解压进入根目录。Go 基础模块要求 1.24+;教材和 Operator 测试基线 Go 1.26.2、darwin/arm64。Docker Desktop 提供 Linux 节点,Kind 构建在 Docker 上,不会让 Mac 自动拥有 CUDA。先确认 Docker 引擎已启动。
sh
brew install go kubectl kind helm uv mysql redis
# 未安装 Docker Desktop 时:
brew install --cask docker
open -a Docker
go version
docker info --format '{{.ServerVersion}}'
kind version
helm version
kubectl version --client
./scripts/bootstrap-kind.sh
export KUBECONFIG="$PWD/tmp/handbook.kubeconfig"
kubectl config current-context
kubectl -n modeldock-lab get msvc,deploy,svc,podsbootstrap 创建或复用 handbook-lab,交叉编译 CPU mock、Operator、网关并载入节点;装 CRD 后用 Helm 部署,等 chart-demo Running。重复运行会重设教学 release 的 values;若正在做弹性实验先保存配置。预期最后看到 chart-demo 一份 Ready。错误 ErrImageNeverPull 或 ImagePullBackOff 时先核对镜像名、节点架构和 kind load 是否完成;不是所有网络代理都能被 Linux 节点继承。
| 路径 | 开发阶段与职责 |
|---|---|
| modeldock/cmd/server、internal/platform、web | 单进程接口和 JSON 状态,可执行 ./scripts/start.sh;与集群 SQL 分离 |
| modeldock/admission | 独立 Go module,Gin 受理申请,MySQL 账本及 K8s 投递 |
| modeldock/operator、operator/cmd/gateway | 独立 Go module,controller-runtime 管资源;网关读 EndpointSlice |
| modeldock/cmd/mock、deploy/gpu | CPU 协议替身与真实 vLLM 声明;后者需权重、PVC、设备驱动 |
| k8s、deploy/chart、deploy/observability | API schema、资源模板、指标和告警 |
| console、scripts | Vue 控制台、集成测试和压测;Vite 开发代理不属于生产认证 |
按实验启用依赖
MySQL 私有 Unix socket:./scripts/mysql-lab.sh start,结束用同一脚本 stop。集群网关默认本地限流;验证 Redis 组件时临时启动只监听回环的 redis-server,并给测试传 LAB_REDIS_TEST_ADDR。不同 Pod 不能用 127.0.0.1 找宿主 Redis;线上要配置可达的 REDIS_URL。Kubebuilder 只在从空项目生成时需要。Prometheus、Grafana 和 KEDA 的安装与收尾按弹性实验进行,不是第一次启动必装项。
单独验证 Redis 共享窗口
在空闲的本机端口运行一个实验进程,不用修改系统 Redis 配置,也不在 Redis 中存长期租户配额。保持第一个终端开启:
sh
redis-server --bind 127.0.0.1 --port 19789 --save '' --appendonly no
# 第二终端,从项目根目录运行
(cd modeldock/operator && LAB_REDIS_TEST_ADDR=127.0.0.1:19789 go test -count=1 -v -run TestSharedLimit ./cmd/gateway)测试交错使用两个 Redis 客户端,断言序号连续且计数键有过期时间。若不设置地址,测试会 SKIP,这不能算验收通过。完成后 Ctrl+C 退出实验 Redis。本测试验证共享计数,不证明 Sentinel 切换时没有误限流或重复放行。