实现跨地域仓库冗余的关键是同步可控、链路可靠、拉取智能:harbor geo-replication主干同步(事件驱动+签名校验),skopeo+对象存储兜底(细粒度过滤+归档中转),k8s registry-proxy就近调度(az感知+dns拆分)。

实现跨地域仓库冗余,关键不是把镜像“多存几份”,而是让备份可验证、切换可信赖、流量可调度。核心落在同步机制可控、网络链路可靠、拉取路径智能三个环节。
用 Harbor Geo-Replication 做主干同步
Harbor 原生的地理复制功能是生产环境首选,它把同步封装成可配置、可审计、可告警的闭环任务:
- 在源 Harbor(如华东)创建复制规则,目标填入华北/深圳等异地 Harbor 地址,使用 robot account 授予最小权限(仅 push/pull)
- 触发模式设为 event_based:镜像一推即同步,避免轮询延迟;补漏场景可用 scheduled 模式按小时执行
- 开启“跳过已存在镜像”并关闭“覆盖同名镜像”,配合语义化 tag(如
v2.4.1-sha256-9a8f)和 OCI Artifact 存签名,确保不可篡改 - 每条同步记录在 UI 中显示耗时、各层 SHA256、HTTP 状态码,失败自动重试 3 次,并支持 Webhook 推送钉钉/企微
用 Skopeo + 对象存储做轻量兜底与细粒度控制
当目标环境无 Harbor,或需过滤 debug 镜像、只同步特定版本时,Skopeo 提供更底层的掌控力:
- 脚本中用
skopeo list-tags获取源 registry 标签列表,再用grep -E 'v[0-9]+\.[0-9]+\.[0-9]+$'筛出稳定版 - 执行
skopeo copy --src-tls-verify=false docker://... docker-archive:/tmp/app.tar导出为归档,上传至跨地域对象存储(如阿里云 OSS 跨区域复制桶) - 各地 registry 通过
skopeo copy docker-archive:/tmp/app.tar docker://...还原,规避公网直连抖动和单点中断风险 - 用 systemd timer 替代 cron,添加
After=network-online.target,确保网络就绪后再执行
让容器启动时自动选最近仓库
同步完成只是第一步,真正落地靠的是运行时智能路由,让 Pod 拉取时天然命中本地副本:
- 在 K8s 各节点部署 registry-proxy sidecar(如 buildkitd),根据所在 AZ 返回对应域名(
harbor-cn-north.myorg.com) - 用 CoreDNS 的
k8s_external插件实现 DNS 拆分:同一请求harbor.myorg.com,华北节点解析为华北 VIP,华南节点返回华南地址 - Azure Container Registry 和 TCR 企业版直接支持“单一域名+多地域副本”,推送一次,自动流式复制到所有启用地理复制的区域,客户端始终用
myreg.azurecr.io/app:tag即可
同步不是终点,而是冗余闭环的起点。验证要每天抽样 manifest、定期 pull inspect;日志要保留 90 天以上;网络 RTT 控制在 200ms 内、带宽不低于 50Mbps —— 这些细节决定切库那一刻,是不是真能稳住。











