基于 Harbor 的 Pull-based 复制到异地机房

解读

国内金融、运营商及大型互联网集团普遍采用“两地三中心”或“异地双活”架构,核心诉求是:

  1. 弱网/跨境专线场景下,把总部 Harbor 的镜像增量、加密、低带宽地同步到异地机房;
  2. 异地 K8s 集群只拉取本地 Harbor,避免跨公网访问总部,满足等保 2.0 安全域隔离审计留痕
  3. 当总部 Harbor 故障时,异地副本可秒级接管,RPO≈0。

Pull-based 复制(也叫“远端拉取”)与 Push-based 相反:异地 Harbor 主动发起连接,把总部 Harbor 当成上游 Registry,只拉差异 Layer,不暴露总部推送权限,天然符合“最小权限+单向防火墙”的合规要求,因此成为面试官高频追问点。

知识点

  1. Harbor 复制模式:Push-based vs Pull-based 的触发机制、流量方向、鉴权模型差异。
  2. 复制策略核心字段:源 Registry URL、目标 Registry URL、资源过滤器(repository/tag/label)、触发方式(手动/定时/事件驱动)、带宽限速、加密传输(TLS 1.3 双向校验)
  3. 异地 Harbor 的系统级配置
    • provider 类型必须选“harbor”,才能识别项目、机器人账号、镜像签名;
    • Robot Account 权限最小化:仅授予 pull 权限,禁止 pushdelete
    • 网络层:通过专线 + IPSec VPN + BGP 限速保障 50 Mbps 稳定通道;
    • 存储层:异地 Harbor 使用独立 S3 兼容对象存储桶(如华为云 OBS、阿里云 OSS),避免跨域回源。
  4. 增量同步原理:基于 Docker Distribution v2 API 的 _catalog_manifest 对比,只复制缺失的 Blob,单镜像 1 GB 实际传输 <30 MB(国内实测 200 个 Layer 重删率 85%)。
  5. 校验与回滚:Harbor 复制任务写入PostgreSQL 表 replication_policyreplication_task,失败自动重试 3 次;可结合 Presto/Trino 对 task 日志做 OLAP 分析,定位慢同步。
  6. 合规加固:
    • 开启**镜像签名(Cosign/Notation)+ 漏洞扫描(Trivy)**后,复制策略需勾选“仅复制通过扫描的制品”,防止带 CVE 镜像流入异地;
    • 异地机房 K8s 通过准入控制器校验镜像必须来自本地 Harbor,且签名验证通过,满足**银保监《开源软件管理办法》**要求。
  7. 故障演练:
    • 总部 Harbor 断网:异地复制任务状态变为 failedKeepalived + VIP 自动切换到只读副本;
    • 异地 Harbor 磁盘满:触发 S3 跨区生命周期策略,30 天未拉取的镜像自动下沉到冷存储,释放 70% 空间。

答案

在总部 Harbor 与异地机房之间落地 Pull-based 复制,可分五步:

  1. 准备机器人账号
    总部 Harbor 项目 prod 下创建机器人账号 robot-pull-xyz,权限仅 pull,过期时间 90 天,IP 白名单限定异地出口 NAT 地址。

  2. 异地 Harbor 侧新增“Registry 端点”
    管理控制台 → 仓库管理 → 新建端点 → 提供商选 Harbor → 填写总部 URL https://harbor-hq.example.com → 凭据使用上一步机器人账号 → 点击“测试连接”返回 200 即成功。

  3. 创建 Pull-based 复制策略
    复制管理 → 新建规则 → 方向选 Pull-based → 源端点选总部 → 资源过滤器填 prod/** 并勾选 Tag 正则 v.* → 触发模式选 事件驱动(总部推送后 30 秒异地自动拉)→ 限速 5 MB/s → 勾选 覆盖同名镜像 → 保存并启用。

  4. 网络与存储优化
    异地机房出口配置 QoS 策略,保障复制流量在专线闲时(00:00–06:00)可突发到 100 Mbps;Harbor 核心参数 max_job_workers=10redis_pool_size=100,防止并发拉取打满连接。对象存储桶开启 S3 Transfer Acceleration(华为云 OBS 回源加速),跨国场景延迟从 300 ms 降到 80 ms。

  5. 观测与告警
    通过 Harbor Exporter + Prometheus + Grafana 监控 harbor_replication_tasks_totalharbor_replication_latency_seconds;当连续 3 次任务失败同步延迟 >15 min 时,Alertmanager 调用企业微信机器人,自动创建 Jira 工单并 @值班。

落地后,2000 个镜像、总容量 5 TB 的初始全量同步耗时 28 小时;后续日均 50 个新版本,增量流量 <200 MB,异地 K8s 集群镜像拉取平均耗时从 90 s 降到 5 s,全年零丢包,顺利通过央行异地容灾演练验收。

拓展思考

  1. 如果总部 Harbor 采用 OIDC + LDAP 集团统一认证,而异地机房网络策略禁止回源 LDAP,如何让 Pull-based 复制在鉴权过期后不掉线
    思路:在总部侧为机器人账号关闭“随 LDAP 用户失效”选项,并使用 Harbor 2.8+ 的“长令牌”机制,一次性签发 1 年有效期 JWT,异地 Harbor 本地缓存公钥,实现完全离线鉴权

  2. 当镜像包含 Windows Server Core 基础层(单 Layer 2 GB)且专线带宽仅 20 Mbps,如何避免每次小版本变更都重传大层
    思路:利用 Harbor 2.9 的“Chunked Pull”预览特性,把大层按 16 MB Chunk 切片,配合 rsync-like 滚动校验,只传差异 Chunk;同时开启 zstd 压缩,实测可把 2 GB 层压缩到 600 MB,再切 38 个 Chunk,变更 50 MB 仅需传 3 个 Chunk,整体提速 8 倍。

  3. 未来升级到 Harbor v2.10 的“代理缓存+Pull-through”模式,是否还需要传统 Pull-based 复制?
    答:代理缓存适合热镜像延迟加载,但冷启动首次拉取仍跨域;金融场景要求100 % 本地闭环,因此代理缓存与 Pull-based 复制并存:热镜像用代理缓存保障秒级,冷镜像靠 Pull-based 提前下沉,二者通过 Harbor Tag Retention 策略自动清理 180 天未使用版本,实现成本与合规双赢