用分布式存储VSAN实现Harbor Registry的高可用方案

用分布式存储VSAN实现Harbor Registry的高可用方案

陈实 张海宁mysql

不久前,VMware发布了Docker容器数据卷的驱动(Docker Volume Driver for vSphere)1.0 beta版本,使得Docker宿主机可以直接在vSphere的数据存储(VSAN,VMFS,NFS等)中建立卷,并直接挂载到Docker容器中,能够解决Docker容器的数据持久化存储的问题。不只能够提供存储,这些卷还能利用vSphere的“基于存储策略的管理(SPBM, Storage Policy Based Management)”, 按需设置更高的“可容忍主机故障数(FTT)”、设置更大的“条带数(SW)”等,以得到更高级别的数据保护和更好的性能。此驱动为开源项目,下载地址:https://github.com/vmware/docker-volume-vspheregit

在容器应用架构中,Registry(容器镜像仓库)是必不可少的组件,负责保存和发布容器镜像,高效可靠的Registry是确保容器应用运行的基础。本文经过详细的步骤,来讲明如何在分布式存储Virtual SAN (VSAN)中建立数据卷,并以开源企业级Harbor Registry为例,把镜像和数据库数据持久化到数据卷中,从而达到更好的数据保护和高可用性(HA)的目的。本文涉及的Harbor Registry是VMware公司的另一个开源项目,由VMware中国研发的团队负责开发。Harbor帮助用户迅速搭建一个企业级的registry 服务,提供了图形管理界面, 访问控制,AD/LDAP集成,镜像同步等企业用户需求的功能,同时还原生支持中文,深受中国用户的欢迎。下载地址:github

https://github.com/vmware/harbor sql

原理详解docker

本文所描述的架构以下图,包含3个ESXi节点组成的VSAN分布式存储集群,以及Harbor Registry运行的一台虚拟机。另外,在Virtual SAN中建立了三个Docker外部卷,用于Harbor中数据的持久化存储。该集群由各节点的本地磁盘提供池化存储,能够承受一个节点失效而不影响可用性。详细配置步骤以下:数据库

1. 先搭建了一个包含3个主机的Virtual SAN集群,在其中一台主机上安装一个Photon OS虚拟机,做为运行Docker的宿主机。固然,读者也能够不用Photon OS,自行安装Ubuntu等其余Linux版本的虚拟机,只要其能正常运行Docker Engine和Docker-Compose等服务便可。架构

 

2. 在“Docker Volume Driver for vSphere”项目的release页面(https://github.com/vmware/docker-volume-vsphere/releases),分别下载安装于ESXi主机和虚拟机上的插件,例如,对于1.0Beta版本,文件名分别为:app

vmware-esx-vmdkops-1.0.beta.zip分布式

docker-volume-vsphere-1.0.beta-1.x86_64.rpm性能

 

3. 在ESXi主机上,用如下命令安装插件,安装完成后,不须要从新启动。

# esxcli software vib install -d "/vmware-esx-vmdkops-1.0.beta.zip" --no-sig-check –f

 

4. 在Photon OS虚拟机上,安装RPM包。对于基于Debian的系统,请安装对应的deb包。

# rpm -ivh docker-volume-vsphere-1.0.beta-1.x86_64.rpm

 

5. ESXi主机上插件安装完成后,在主机上会安装一个管理脚本,位于/usr/lib/vmware/vmdkops/bin/vmdkops_admin.py,这个脚本能够帮助vSphere管理员对建立的Docker外部卷进行管理。例如,能够建立不一样的存储策略。在Virtual SAN中,默认的存储策略条带数为1(即SW=1),做为示例,咱们建立一个条带数为2的策略。SSH 到集群中任意一个ESXi主机,运行如下命令:

# /usr/lib/vmware/vmdkops/bin/vmdkops_admin.py policy create --name SW=2 --content '(("stripeWidth" i2))'

 

其中FTT=0是这个策略的名字,其中的关键点在于设置策略的内容,在这里是'(("stripeWidth" i2))'。其它可设置的参数与Virtual SAN的标准参数相同,它们的参数名和说明以下:

 

6. 此时,即可以在Photon虚拟机上,经过命令建立Docker卷。咱们首先建立两个使用默认存储策略的卷,再建立一个使用SW=2的卷,以做示例。

# docker volume create --driver=vmdk --name=vsanvol1 -o size=50gb

vsanvol1

# docker volume create --driver=vmdk --name=vsanvol2 -o size=20gb

vsanvol2

# docker volume create --driver=vmdk --name=vsanvol3 -o size=20gb -o vsan-policy-name=SW=2

vsanvol3

经过指定--driver=vmdk参数,便可在vSphere数据存储中建立一个卷。建立出的卷存储位置与Photon虚拟机的位置相同。由于Photon OS虚拟机放置在Virtual SAN存储上,因此建立出的卷也放置在Virtual SAN存储上。此卷以VMDK的形式存在,值得注意的是,由于此VMDK此时没有挂载到任何虚拟机上,因此在浏览vSphere客户端时,经过虚拟机页面找不到关于此卷的信息。

可是,这些VMDK在vsanDatastore的dockvols目录下面能够看见: 

在下文中,咱们能够看到,当此卷挂载到某个运行的容器时,在vSphere客户端中就能经过关联的VM找到相应的VMDK。

 

7. 下载Harbor源代码,在安装以前,为了使用咱们新建立的卷,须要修改Harbor配置中的harbor/Deploy/docker-compose.yml文件。在这以后,再参考Harbor安装文档进行安装。

打开docker-compose.yml文件,找到‘registry’部分,将如下配置:

volumes:

      - /data/registry:/storage

      - ./config/registry/:/etc/registry/

修改成:

volumes:

      - vsanvol1:/storage

      - ./config/registry/:/etc/registry/

其中,‘vsanvol1’就是咱们刚刚建立的外部卷。

另外,找到‘mysql’部分,相似地,将如下配置:

volumes:

      - /data/database:/var/lib/mysql

修改成:

volumes:

      - vsanvol2:/var/lib/mysql

一样,‘vsanvol2’是咱们刚刚建立 的另外一个外部卷。

另外,找到‘jobservice’部分,相似地,将如下配置:

volumes:

      - /data/job_logs:/var/log/jobs

      - ./config/jobservice/app.conf:/etc/jobservice/app.conf

修改成:

volumes:

      - vsanvol3:/var/log/jobs

      - ./config/jobservice/app.conf:/etc/jobservice/app.conf

一样,‘vsanvol3’是咱们刚刚建立 的另外一个外部卷。

 

在文件的最后,加上如下配置:

volumes:

  vsanvol1:

    external: true

  vsanvol2:

external: true

vsanvol3:

    external: true

以指示这三个卷已经在外部(external)建立成功,不须要另行建立。其它配置不变。而后,按照Harbor的安装教程进行安装。

 

8. Harbor启动后,查看vSphere客户端,发现这三个外部卷都已经挂载到Photon虚拟机上了,做为‘Hard Disk 2’,‘Hard Disk 3’和‘Hard Disk 4’。在此版本中,彷佛还有一些bug,例如这三个VMDK的存储策略显示为‘None’,可是可看出Hard Disk3的组件在Virtual SAN中是以SW=2的形式被建立的,另外两个卷在建立的时候是使用了默认的存储策略,例如Hard Disk 4:

这应该是Virtual SAN在识别” Docker Volume Driver for vSphere”建立的策略时仍有一些问题,但愿后续的版本能够解决。

 

9. 上传两个测试image,以测试数据是否会丢失。 

10. 测试HA:首先,在集群上将vSphere HA启用,全部配置选择默认配置便可。而后确认Photon虚拟机目前在10.162.102.130这一主机上。 

 

11. 关闭这台主机的电源,等待一段时间等HA重启虚拟机之后,查看Photon虚拟机的状态。 

能够看出,它已经在另一台健康主机上被重启了。

原来的三个外部卷也已经被挂载到了重启后的虚拟机上。由于咱们关闭了一台主机的电源,因此对于每个VMDK,都显示有一个丢失的组件(Absent Component),可是VSAN的默认存储策略可以容忍一个主机的故障,因此数据仍是能正常访问。 

 

12. 虚拟机重启后,查看Harbor的状态,显示全部的容器都已经自动正常运行。 

查看Harbor管理界面,两个测试Image均正常,说明没有数据丢失的状况发生。 

当vSphere HA在其它主机上重启Harbor虚拟机之后,Harbor中的全部容器从新启动,可是所链接的外部卷不变,如图所示:

小结

本文介绍了用分布式存储VSAN来实现Harbor Registry高可用性的例子。因为Harbor就是一个标准的多容器应用,所以,该方法也可以用于其余容器应用。欢迎文后留言交流。

Harbor项目网址:

https://github.com/vmware/harbor


若是你对Harbor项目感兴趣,可申请加入“Harbor开源项目群”,请先扫描下面二维码关注“亨利笔记”公众号,并在公众号后台发送"入群"信息便可。 

相关文章
相关标签/搜索