文档章节

Harbor: 跨数据中心复制Docker镜像的开源实现

project_harbor
 project_harbor
发布于 2016/08/05 23:29
字数 1738
阅读 3048
收藏 17

容器镜像复制和发布一直缺少良好的工具,是实际开发和运维中的一大痛点。开源Harbor Registry提供强大的镜像复制/同步能力,成为众多用户喜爱的杀手级功能。本文介绍了镜像复制功能的工作原理,作者为Harbor项目核心工程师姜坦、尹文开。

VMware公司3月份开源了企业级Registry项目Harbor,由VMware中国研发的团队负责开发。Harbor可帮助用户迅速搭建企业级的registry 服务。它提供了管理图形界面, 基于角色的访问控制RBAC,镜像远程复制(同步),AD/LDAP集成、以及审计日志等企业用户需求的功能,同时还原生支持中文,深受中国用户的喜爱。该项目推出4多个月以来,在GitHub 获得了超过900多个点赞星星和200多个 forks,Github地址:

https://github.com/vmware/harbor

在最近发布的版本中,Harbor新增了基于策略的Docker镜像复制功能,可在不同的数据中心、不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作,已经有用户部署了远程镜像双向复制的案例。本文将对该功能的实现原理做详细介绍。

Harbor镜像复制的管理界面

功能简介

在功能设计方面,Harbor仍然以“项目”为中心, 通过对项目配置“复制策略”,标明需要复制的项目以及镜像。管理员在复制策略中指明目标实例,即复制的“目的地”,并对它的地址和连接时使用的用户名密码进行设置。当复制策略被激活时,源项目下的所有镜像,都会被复制到目标实例;此外,当源项目下的镜像被添加或删除(push或delete), 只要策略还在激活状态,镜像的变化都会同步到目标实例上去, 如下图所示:

 

在较大的容器集群中,往往需要多个Registry服务器做负载均衡,可以采用主从发布模式,镜像只需要发布一次,就可以推送到多个Registry实例中。同时还支持双主复制和层次型的多级镜像发布,如下图所示: 

设计与实现

在不同的Registry实例之间复制镜像是十分普遍的需求,过去常见的做法是通过拷贝镜像数据,比如定期通过rsync同步文件系统中镜像的数据,或者,对于部署在IaaS服务上的情况,通过对IaaS存储服务一层进行配置实现对象复制,这些方法往往是根据registry使用的存储而采用不同工具。然而对于Harbor来说,我们希望降低这种依赖,并提高灵活性, 比如用户可能有一个开发用的registry使用文件系统作为存储,并希望把镜像同步到基于S3存储的远端发布用的registry上。考虑到这种情况,我们选择通过调用registry本身的API下载并传输镜像,从而做到了与下层存储无关。

在控制方面,我们引入了一个新的组件,Job Service,用来对镜像复制任务进行管理。当以项目为单位进行复制时,会以镜像为单位生成一系列任务(job)由Job Service 调度管理,Job Service在执行任务的过程中将每个任务的状态更新到数据库中, 以便用户通过UI查看。大体结构如下图所示:

下面介绍一下Job Service 的实现,从外部看它也是通过REST API接收请求调度并执行任务,面临的问题主要有两点,首先,接收到大量复制请求时需要进行限流以免消耗过多IO资源;其次,复制策略有可能在任务执行过程中改变,比如失效,这就需要一种机制能从外界对运行中的任务进行干预。

我们通过任务队列,分发器(dispatcher)和worker pool实现了生产者消费者模型,利用Go语言内置的channel,每个任务会通过scheduler放到channel里,dispatcher 通过channel获得任务,同时,worker在工作结束后会被放入另一个channel, dispatcher 通过这个channel与worker配对,于是,空闲的worker通过dispatcher获得任务id并执行任务,这样可以很方便地通过worker pool中 worker数量来控制并发数:

 

对于另一个问题,每一个 worker内部是一个抽象的状态机(state machine),通过给不同状态注册处理器(handler)完成具体工作,同时,状态机可以受到干预,可以中途取消(cancel)任务,或在任务执行发生异常时将任务置为错误(error)状态丢弃或交给调度器(scheduler)重试。 另外由于状态机的状态是可定制的,这样就很方便扩展和调整。对于一个抽象的任务来说,它的状态转移如下图所示: 

而对于具体远程同步镜像的任务来说,Running 状态会被进一步细分成多个子状态,如下图所示:

首先, 从源Harbor实例下载相应tag的manifest,分析其所包含的blob,针对每一个blob,检查其在目标实例中是否已经存在,如果不存在,则同步此blob。最后,检查manifest在目标实例中是否已存在,如果不存在,则上传manifest。检查blob的存在性,可以有效减少不必要的网络流量;而由于manifest的上传有可能会触发镜像的同步,所以对manifest存在性的检查,则可以避免当同步的多个Harbor形成环路时进入不断同步的死循环状态。对同一个镜像中的每一个tag重复以上过程,就可以完成整个镜像的同步工作。

总结与展望

本文介绍了Harbor新版本中远程镜像复制功能的设计与实现。今后我们将对此功能进行扩展,比如在策略(policy)中加入更加丰富的控制和过滤条件方便用户选择需要复制的镜像,以及控制复制的发生时间等。也希望读者和用户们在多向我们提供反馈意见。Harbor项目网址:

https://github.com/vmware/harbor

为便于交流,微信用户可申请加入“Harbor开源项目群”,请先扫描下面二维码关注“亨利笔记”公众号,并在公众号后台发送"入群"信息即可。 

© 著作权归作者所有

project_harbor
粉丝 16
博文 10
码字总数 18030
作品 0
海淀
私信 提问
信用卡鼻祖 Capital One 如何解决私有开源Docker镜像中心瓶颈

背景 Capitaol One 是一家美国的数字化银行,全球有上万的研发,具有非常丰富的 DevOps 的落地经验,该公司开源的 DevOps 报表 Hygieia 也受到大多数公司的关注。在 JFrog 的用户大会上,Cap...

高效运维
08/05
0
0
harbor部署到k8s中使用

一、概述   harbor是什么呢?英文单词的意思是:港湾。港湾用来存放集装箱(货物的),而docker的由来正是借鉴了集装箱的原理,所以harbor是用于存放docker的镜像,作为镜像仓库使用。官方的...

W-D
01/10
0
0
Docker镜像仓库Harbor之搭建及配置

目录 Harbor介绍 环境、软件准备 Harbor服务搭建 Harbor跨数据复制配置 FAQ 1、Harbor 介绍 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从...

aixiaoyang168
2017/06/21
0
0
企业级docker私有仓库harbor在Ubuntu14.04上的部署与使用

一、harbor简介: 简单的说,Harbor 是一个企业级的 Docker Registry,可以实现 images 的私有存储和日志统计权限控制等功能,并支持创建多项目(Harbor 提出的概念),基于官方 Registry V2 ...

黑色时间
2016/10/12
0
0
Harbor技术沙龙活动-北京站

原文链接:https://www.bagevent.com/event/5926895

q48s71bczbeylou9t0n
08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
今天
4
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
今天
5
0
Vue核心概念及特性 (一)

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 > 特点: 易用,灵活,高效,渐进式框架。 > 可以随意组合需要用到的模块 vue + components + vue-router + vuex + v...

前端优选
今天
11
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
今天
11
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部