2. Harbor 架构解析:组件、数据流向与高可用设计

在生产环境中运行 Harbor 镜像仓库,理解其内部组件协作关系、数据流向以及高可用部署模式是实施自动归档与清理工程的前提。本章从组件职责、请求路径、存储交互三个维度拆解 Harbor 架构,并给出高可用设计的核心要点。

2.1 核心组件与职责

Harbor 采用微服务架构,主要包含以下 6 个核心组件,它们以 Docker Compose 或 Kubernetes Pod 的形式运行:

组件名称 容器/进程名 核心职责 依赖关系
Core harbor-core API 网关、认证鉴权、项目管理、RBAC、Webhook 触发 依赖 Database、Redis
Registry registry Docker 镜像存储与分发(基于 OCI Distribution Spec) 依赖存储后端(S3/NFS/MinIO)
Jobservice harbor-jobservice 异步任务调度:镜像复制、GC 清理、扫描、标签清理 依赖 Core、Redis、Database
Portal harbor-portal Web UI 前端,提供用户操作界面 依赖 Core(API 调用)
Database harbor-db PostgreSQL,存储元数据:项目、用户、标签、策略、审计日志 —
Redis redis 缓存会话、任务队列、Webhook 事件暂存 —
工程提示: 在自动归档与清理场景中,Jobservice 是最关键的组件。所有定时清理策略、镜像复制任务、标签保留规则均由 Jobservice 调度执行。若 Jobservice 异常,清理任务将停止,存储可能持续膨胀。

2.2 组件协作与数据流向

下图展示了 Harbor 内部一次完整的镜像推送与清理触发流程,包含控制流与数据流两条路径:

Harbor 组件协作与数据流向图 Harbor 组件协作与数据流向 用户/客户端 Portal (UI) Core (API) Registry Jobservice Database Redis 存储后端 docker push/pull Web 操作 API 调用 分发请求 元数据读写 缓存/队列 触发清理任务 Blob 读写 GC/删除 任务状态 控制流(API/指令) 异步/后台任务流
数据流向关键路径:
  1. 推送路径: 客户端 → Core(认证) → Registry(存储 Blob) → Database(记录元数据)。
  2. 清理路径: Core(策略触发) → Jobservice(调度) → Registry(删除 Blob) → Database(更新元数据) → 存储后端(释放空间)。
  3. Webhook 路径: Registry 事件 → Core → Jobservice → 外部系统(如通知、自动归档触发)。

2.3 高可用设计要点

生产环境必须消除单点故障。Harbor 官方支持两种高可用模式:多实例主备(基于外部数据库与共享存储)和 Kubernetes 原生部署(Operator)。以下为关键设计原则:

层级 组件 高可用策略 注意事项
接入层 Core / Portal 多副本 + 负载均衡(Nginx/HAProxy) Session 需共享 Redis;CSRF 需一致
任务层 Jobservice 多副本 + Redis 任务队列 同一任务仅被一个 Worker 消费;需幂等设计
存储层 Registry 共享存储后端(S3/MinIO/NFS) 避免使用本地文件系统;S3 需开启版本控制防误删
数据层 Database PostgreSQL 主从复制或云托管 RDS 自动故障切换;连接池配置合理
缓存层 Redis Redis Sentinel 或 Cluster 持久化策略 RDB + AOF;避免大 Key
常见陷阱:
  • 多 Core 实例共用同一 Redis 时,若 Redis 未配置密码或网络隔离不足,可能导致会话串号。
  • Jobservice 多副本下,清理任务可能重复执行。需在清理脚本中实现幂等性(如先检查 Blob 是否已被删除)。
  • 共享存储使用 NFS 时,需注意 NFS 锁与并发写入问题,建议切换为 S3 兼容对象存储。

2.4 高可用部署架构示意

以下为基于 Kubernetes 的 Harbor 高可用部署逻辑架构,展示组件副本与外部依赖关系:

Harbor 高可用部署架构 Harbor 高可用部署架构(Kubernetes) 负载均衡 (Nginx/ALB) Core (副本1) Core (副本2) Core (副本3) Jobservice (W1) Jobservice (W2) Registry (R1) Registry (R2) PostgreSQL Redis Sentinel S3/MinIO
工程建议: 在自动归档场景中,建议将 Jobservice 的副本数设置为 2 以上,并配置独立的 Redis 队列。这样即使一个 Worker 正在执行长时间的大镜像清理任务,另一个 Worker 仍可响应新的归档请求,避免任务积压。

2.5 架构对自动归档与清理的影响

理解架构后,可以明确以下设计约束:

  • 清理任务必须通过 Jobservice 调度,不能直接操作 Registry 或存储后端,否则会导致元数据不一致。
  • 高可用环境下,清理策略配置(如标签保留规则)存储在 Database 中,所有 Core 实例共享同一份配置,无需重复设置。
  • 存储后端必须支持并发读写,否则多 Registry 副本同时执行 GC 时可能产生冲突。推荐使用 S3 兼容对象存储,并开启 --delete-untagged 选项。
  • Webhook 通知 可用于触发外部归档流程:当镜像被删除或标签变更时,Core 通过 Webhook 通知归档服务将镜像备份到冷存储。
架构决策清单(自动归档与清理场景):
决策项 推荐方案 理由
存储后端 S3 / MinIO 支持并发、版本控制、生命周期管理
清理触发方式 Harbor 内置标签保留规则 + Webhook 避免外部脚本直接操作 API 导致竞态
Jobservice 副本数 ≥2 保证清理任务不因单点故障中断
数据库 托管 RDS 或 PostgreSQL 主从 自动备份、故障切换、读写分离