8.8 KiB
8.8 KiB
WddSuperAgent DDS(现代化改造草案)
背景与总体目标
- WddSuperAgent 由多个 Go 模块组成:
agent-wdd(通用 CLI 工具)、agent-common(工具库/常量/镜像命名转换等)、agent-deploy(K8s 部署模板生成)、agent-operator(运维中枢:镜像同步、K8s 操作、Harbor/MinIO 交互)。目前模块耦合度高、流程以脚本式函数为主,缺少统一 API 与测试保障。 - 目标:以“运维服务化”为方向,引入 Gin 提供标准接口,按领域拆分服务层/适配层,完善配置、安全与测试体系,并为后续 UI/自动化编排提供稳定基础。
现状梳理(按模块)
agent-common:提供 logger、断言、文件/字符串等工具,镜像命名转换(image包)、项目镜像列表(real_project/*),缺少接口抽象和错误语义。agent-deploy(依赖 agent-common):生成/应用 CMII 相关的 K8s 资源模板(Dashboard、NFS、Middlewares、App、Ingress、Env Config),通过CommonEnvironmentConfig拼装 YAML/Apply 文件;存在大量硬编码路径与全局变量。agent-operator(依赖 agent-common、agent-deploy):运维中枢,职责包含:- 镜像同步 DCU/DLTU 流程(
CmiiImageSyncOperator):Download → Compress → Upload/Push;支持从 Demo/RKE/Middle/版本号拉取,MinIO 上传,Harbor 直推(tag + push)。 - Docker/Harbor/MinIO 适配(
image、minio包),K8s 适配(CmiiK8sOperator,Deployment/Pod/Node 的查询、缩容、重启、打 tag 等),部分函数含硬编码认证信息。 - main 以交互式模式运行(mode=image/operator),无 HTTP API,流程控制与状态管理零散。
- 镜像同步 DCU/DLTU 流程(
agent-wdd(独立):Cobra CLI 瑞士军刀(zsh、proxy、acme、Cloudflare、host info 等),与 CMII 运维解耦。
关键现有流程
- 镜像同步(DCU/DLTU):
ImageSyncEntity描述 Download/Compress/Upload 条件,A_DownloadCompressUpload执行拉取→压缩→上传,A_DownloadLoadTagUpload负责离线包加载+重 tag + 推送;大量文件系统操作与全局路径(OfflineImageGzipFolderPrefix)。 - K8s 操作:
CmiiK8sOperator封装 client-go,基于 namespace 切换进行 Deployment/StatefulSet/Pod/Node 的查询、扩缩容、重启、删 pod/evict 等。 - 部署生成:
OctopusDeploy依靠模板包组合环境,按镜像 map 生成并 apply。
主要痛点
- 架构层次不足:领域逻辑、基础设施操作、流程编排混杂在同一包内;全局变量与硬编码路径/凭据多。
- 可测试性弱:测试多为打印/人工验证,
SaveImageListToGzipFile等函数甚至返回 stub;缺少接口注入、mock 与集成回归。 - 接口形态单一:仅 CLI/交互模式,缺少 HTTP API/任务编排,不利于自动化或 UI 集成。
- 配置与安全:凭据明文/硬编码(Harbor RegistryAuth、kubeconfig 路径等),无统一配置加载与密钥管理。
- 可靠性/可观察性:缺少健康探针、审计日志、指标/追踪;IO/网络无超时控制,错误语义不清晰。
目标架构(分层与模块化)
- 项目结构(示例)
/cmd/operator (HTTP + CLI 入口) /cmd/wdd (保留独立 CLI) /pkg/domain (实体与用例协议:ImageSyncSpec、DeployPlan、ClusterTarget 等) /pkg/service (应用层:ImageSyncService、DeployService、K8sService、RegistryService、StorageService) /pkg/infra (适配层:Docker/Harbor client、MinIO client、K8s client、Template renderer、Config) /pkg/transport/http (Gin handler,DTO 校验,统一响应) /pkg/transport/cli (Cobra 命令适配,复用同一 service) /pkg/obs (日志/指标/追踪/审计) /configs (环境化配置,区分 dev/test/prod) - 依赖关系:
transport -> service -> infra,domain为纯模型;agent-wdd继续独立,但可共用pkg/infra的下载/文件工具。 - 并发/任务模型:对长耗时的镜像同步/压缩/上传采用异步任务(队列或 goroutine + work pool),任务状态持久化(可选 Bolt/SQLite/Redis),Gin 提供查询/取消接口。
组件设计与接口草案
- Domain 模型
ImageSyncSpec:源列表(cmiiNameTags/fullNames/projectVersion/sourceAuth)、压缩策略(split/monolithic、目标目录)、上传策略(minio bucket/oss prefix)、推送策略(target harbor/cred)、更新策略(是否更新集群 tag)。DeployPlan:目标集群/namespace、镜像 map、模板参数(NFS/Ingress/SRS 等)。ClusterTarget:kubeconfig/上下文/namespace,执行策略(超时、并发度)。
- Service 层
ImageSyncService:封装 Download→Compress→Upload→Push,用接口注入RegistryClient、StorageClient、Compressor、ImageNamer;支持幂等与断点续跑(跳过已存在 gzip)。DeployService:生成/渲染/Apply K8s 清单;可选 dry-run;依赖K8sApplier(kubectl/go-client)。K8sService:Deployment/StatefulSet/Pod/Node 读写操作,暴露给 HTTP/CLI;支持批量重启/cordon/evict。ConfigService:集中配置加载(Viper),支持 env 覆盖与 secret 挂载。ObsService:日志封装(zap sugared logger)、Prometheus 指标(请求量/耗时/失败率/队列长度)、OpenTelemetry trace。
- Transport(Gin)
/api/v1/images/syncPOST:提交ImageSyncSpec,返回任务 id。/api/v1/images/tasks/:idGET:查询任务状态/日志片段。/api/v1/registry/pushPOST:源→目标 Harbor 的 tag/push。/api/v1/deploy/applyPOST:提交DeployPlan,可选择dryRun。/api/v1/k8s/deployments/:ns/:name/tagPUT:更新镜像 tag。/api/v1/healthz、/metrics:健康检查与指标暴露。
- CLI(Cobra)
- 复用同一 service:
wdd image sync ...,wdd deploy apply ...,与 HTTP 行为保持一致。
- 复用同一 service:
关键改造点与落地方案
- 解耦与接口化:为 Docker/Harbor/MinIO/K8s 定义接口(
RegistryClient,StorageClient,K8sClient),在服务层通过依赖注入;现有实现迁移至infra,便于 mock。 - 配置/密钥:移除硬编码(RegistryAuth、kubeconfig 路径等),采用
configs/*.yaml+ 环境变量覆盖;敏感信息通过文件挂载或 Secret 管理,Gin 层仅传递引用。 - 路径与存储:统一离线镜像根路径(可配置),将 txt/gzip 列表输出迁移到任务上下文目录;为分片压缩/单包压缩提供策略接口。
- 错误与重试:下载/上传/推送增加上下文超时与可配置重试;对局部失败的镜像保留失败列表与诊断信息。
- 并发与资源控制:镜像拉取/压缩采用 worker pool(并发上限可配置),避免当前全局 goroutine + 共享 slice 可能的竞态。
- 可观察性:统一日志格式;Gin middleware 注入 request-id;暴露 Prometheus 指标与 pprof;长任务输出阶段进度。
- 安全:移除代码中的 base64 凭据;K8s 操作增加 RBAC 范围与 kubeconfig 选择;上传/下载校验 hash(md5/sha256)。
- 兼容性:保留现有 DCU/DLTU 能力,通过 CLI 子命令封装新的 service,实现“新 API + 旧脚本可用”。
测试与质量保障
- 单元测试:引入
testify/gomock,对核心服务(ImageSyncService/K8sService/DeployService)做 mock 测试;覆盖命名转换、列表生成、失败分支。 - 集成测试:使用 kind + 本地 registry(或 test Harbor mock)、本地 MinIO 容器,跑镜像下载→压缩→推送→K8s apply 的端到端流程;提供
make test-integration。 - 契约测试:Gin API 使用
httptest覆盖请求校验/错误码;CLI 使用 golden 测试。 - 静态检查:启用
golangci-lint(vet, ineffassign, errcheck, revive),go test ./...作为最小门槛。
迁移路线(建议三步)
- 基础设施抽象:提炼 Registry/K8s/Storage/Compressor 接口,将现有实现迁入
pkg/infra,补齐SaveImageListToGzipFile等 stub,清理硬编码凭据/路径。 - 服务化与测试: 新建
pkg/service,重写 DCU/DLTU 流程为可注入的ImageSyncService;构建 Gin 入口与 API DTO,补足单元/集成测试与 CI 流水线。 - 运维增强: 引入任务队列/状态持久化、指标/日志/trace,完善 K8s 操作 API,逐步替换旧 CLI 逻辑为 service 调用,并整理配置与文档。
成功度量
- 关键流程 API 化:镜像同步/推送、部署 apply、K8s tag 更新均有 Gin 接口与 CLI 对应子命令。
- 质量门槛:
go test ./...绿色,集成测试可在本地 one-command 运行;lint 无高危告警。 - 运维可用性:无硬编码密钥,配置可按环境切换;指标可在 Prometheus 抓取,健康检查可被 K8s 探针消费。