2. Harbor 架构解析:核心组件与整体架构

Harbor 采用微服务架构设计,将制品管理、安全扫描、复制、认证等能力拆分为独立的组件,通过 API 网关统一对外暴露服务。理解每个组件的职责与交互关系,是制定保留策略和清理窗口的前提——因为策略的执行引擎(Jobservice)与制品存储(Registry)之间的协作方式,直接决定了清理任务的调度粒度与执行效率。

2.1 整体架构图

下图展示了 Harbor 各组件之间的核心交互关系。用户请求首先到达 Nginx 反向代理,由 Core 服务进行认证与路由,Registry 负责制品存储,Jobservice 执行异步任务(包括清理与复制),ChartMuseum 管理 Helm Chart,Trivy 提供漏洞扫描能力。

Harbor 微服务架构组件交互图 用户 / 客户端 Nginx 反向代理 Core 服务 认证 · 授权 · API 路由 · 项目管理 推送/拉取 调度任务 Registry Docker V2 / OCI 制品存储 Jobservice 异步任务 · 清理 · 复制 · GC 后端存储 S3 / GCS / Azure / 本地文件系统 清理/GC 指令 ChartMuseum Helm Chart 存储 Trivy 扫描器 漏洞扫描 · CVE 报告 PostgreSQL / Redis 元数据 · 缓存 · 任务队列 说明 实线表示请求/数据流,虚线表示控制/调度流。保留策略与清理窗口由 Jobservice 驱动,直接操作 Registry 中的制品。

2.2 核心组件详解

组件 职责 与保留策略/清理窗口的关系
Core 服务 认证、授权、项目管理、API 路由、Webhook 触发 提供保留策略的配置 API,存储策略规则到数据库
Registry Docker V2 / OCI 制品存储,支持清单、层、标签 清理操作的目标组件,Jobservice 通过 Registry API 删除制品
Jobservice 异步任务调度与执行,支持重试、超时、并发控制 保留策略的执行引擎,负责调度清理任务和 GC
ChartMuseum Helm Chart 的存储、版本管理、上传/下载 保留策略可针对 Chart 版本进行清理
Trivy 扫描器 容器镜像漏洞扫描,生成 CVE 报告 扫描结果可作为保留策略的过滤条件(如“保留无高危漏洞的镜像”)
PostgreSQL / Redis 元数据存储、任务队列、缓存 存储策略规则、任务状态、制品元数据
Nginx 反向代理 请求路由、TLS 终止、速率限制 不直接参与清理,但影响清理 API 的访问控制

2.3 组件交互流程(以保留策略执行为例)

  1. 策略配置:管理员通过 Harbor UI 或 API 在 Core 服务中创建保留策略(如“保留最近 30 天的镜像”)。
  2. 策略存储:Core 将策略规则写入 PostgreSQL 数据库。
  3. 任务调度:Core 根据策略的定时规则(cron)或手动触发,向 Jobservice 提交清理任务。
  4. 任务执行:Jobservice 从数据库读取策略规则,调用 Registry API 查询制品列表,筛选出符合清理条件的制品。
  5. 制品删除:Jobservice 调用 Registry 的删除 API(DELETE /v2/<name>/manifests/<reference>)移除清单和层。
  6. 垃圾回收(GC):清理任务完成后,Jobservice 触发 Registry 的 GC 流程,回收未被引用的存储层。
  7. 状态更新:Jobservice 将执行结果写回数据库,Core 服务通过 API 返回给用户。

关键点:保留策略的“清理窗口”概念与 Jobservice 的并发控制直接相关。Jobservice 默认使用工作池模式,max_workers 参数控制同时执行的清理任务数。如果清理窗口设置过短(例如 5 分钟),而镜像数量巨大,Jobservice 可能无法在窗口内完成所有删除操作,导致部分制品残留。

2.4 组件部署拓扑

Harbor 支持多种部署模式,不同模式下组件的分布方式会影响清理任务的执行路径:

部署模式 组件分布 对清理的影响
单节点(默认) 所有组件运行在同一 Docker 主机上 清理任务本地执行,延迟最低
高可用(HA) Core / Jobservice 多副本,Registry 共享存储 Jobservice 多实例需协调清理任务,避免重复删除
分布式(跨地域) 每个地域独立部署,通过复制同步制品 保留策略需在每个地域单独配置,清理窗口需考虑网络延迟

2.5 组件间通信协议

  • Core ↔ Registry:通过 Registry 的 REST API(HTTP/HTTPS),使用 JWT 认证。
  • Core ↔ Jobservice:通过内部 gRPC 或 HTTP API,传递任务定义和状态。
  • Jobservice ↔ Registry:直接调用 Registry API,无需经过 Core。
  • Core ↔ Database:通过 GORM(Go ORM)操作 PostgreSQL。
  • Jobservice ↔ Redis:使用 Redis 作为任务队列(如 redis:// 协议)。

实践建议:在配置保留策略的清理窗口时,建议先通过 GET /api/v2.0/jobs 接口监控 Jobservice 的任务队列长度。如果队列积压超过 100 个任务,说明清理窗口过短或 max_workers 配置不足,需要调整。

2.6 组件配置关键参数(与清理相关)

# harbor.yml 中与清理相关的配置片段

# Jobservice 配置
jobservice:
  max_job_workers: 10          # 最大并发清理任务数
  job_logger_severity: INFO    # 任务日志级别,调试时可改为 DEBUG

# Registry 配置
registry:
  storage:
    delete:
      enabled: true            # 必须为 true,否则无法删除制品
    maintenance:
      uploadpurging:
        enabled: true          # 自动清理未完成的上传
  gc:
    enabled: true              # 启用垃圾回收
    interval: 24h              # GC 执行间隔

# 数据库连接
database:
  type: postgresql
  max_idle_conns: 50
  max_open_conns: 100

注意:registry.storage.delete.enabled 必须设置为 true,否则保留策略的删除操作会静默失败。该参数在 Harbor 2.x 中默认开启,但在升级迁移时可能被重置为 false,建议每次升级后检查该配置。