当前位置: 首页 > 科技观察

说说全球镜像分发网

时间:2023-03-21 01:40:23 科技观察

1。全球网络规划许多面向全球的多区域基础设施在设计之初并没有花太多心思在网络规划上。当业务复杂到一定程度,就不得不对网络进行调整和优化。而网络上的任何重大调整都会对业务产生巨大的影响。最终,我们将陷入两难境地,只能投入更多的人力,背负着历史的包袱,一次次走在悬崖峭壁上。下图是我认为比较理想的网络拓扑结构:网络规划主要包括以下几点:网段划分在全球业务形态中,网络分为海外和中国大陆两部分。我更倾向于建立两个中心。国内核心节点设置在北京,主要面向国内业务;海外核心节点设在新加坡,主要做海外业务。所以10.128.0.0/16及以上网段分配给海外,10.127.0.0/16及以下网段分配给国内。同时,每个区域的网段间距为8,预留了一定的扩展空间。实现连通性,如果是同一个VPC,那么内网是可达的。但是如果是在不同VPC、不同厂家、不同地域之间,我们通常会采用一定的方式来实现连通:公网或者专线。公网是一种比较常用的方法。我们可以在公网的基础上搭建VPN内网,实现网络连通。但是公网的连接质量无法保证,所以另一种方式是专线。专线可以实现跨区域的网络连接,但云专线通常仅限于同一云提供商。也就是说,华为云北京的云专线只能连接华为云新加坡,不能连接AWS新加坡。配置路由实现连通性就相当于插了一根网线,但是在转发数据包的时候,并不清楚IP包的下一跳在哪里,所以需要配置路由。由于有两个网络核心,海外区域需要与海外核心节点通信,国内区域需要与国内核心节点通信。至于其他地区能不能互通,就看有没有需求了。比如我们需要在内网进行镜像数据的P2P分发,那么各个region之间就需要互通。2.构建全球镜像分发能力全球镜像分发能力是建立在全球IDC内网互通的前提下。我们不能将基础设施暴露在公网中,所有的镜像数据都是通过内网流量传输的。下图是一个全球镜像分发系统:我们的研发部门在中国,部署的服务在全球。镜像数据的传输会经过以下过程:在中国建立镜像,推送到中国的Harbor。国内Harbor同步镜像到海外Harbor。在某区域部署海外应用,拉取镜像。由于Dget的地址在每个Docker中都配置为registry-mirrors,所以应用镜像缓存在Dget中。同一个region,部署多个副本时,会直接拉取Dget中的镜像。3、Habor的部署与高可用3.1部署HaborHarbor的部署方式主要有两种,HelmChart和DockerCompose。这里推荐使用DockerCompose,因为VM作为一种不经常变化且对稳定性要求高的服务,相比Kubernetes更适合作为Habor的基础设施。3.2Harbor的高可用Harbor的高可用主要有两种方式:共享存储。高一致性需要部署双活/主备存储后端。多个Harbors之间的同步。一致性不高,镜像同步需要时间。我推荐的解决方案是共享存储。不需要等Harbor同步完成,推送的镜像就可以立即使用。如下图,在共享存储方案下,存储组件需要以主/主/主/备的形式部署:这里需要共享的组件有:共享PGSQL可以直接向云厂商购买服务,然后初始化和创建表。创建数据库notary_server;创建数据库notary_signer;创建数据库harbor编码“UTF8”;创建用户harbor;使用加密密码“123456”更改用户harbor;将数据库notary_server上的所有权限授予harbor;将数据库notary_signer上的所有权限授予harbor;授予所有数据库注册表上的权限Harbor;GRANTALLPRIVILEGESONDATABASEharborTOharbor;GRANTALLPRIVILEGESONDATABASEclairTOharbor;external_database:harbor:host:1.1.1.1port:5432db_name:harborusername:harborpassword:123456ssl_mode:disablemax_idle_conns:10max_open_conns:100notary_server:主机:1.1.1.1端口:5432db_name:notary_server用户名:harbor密码:123456ssl_mode:禁用max_idle_conns:10max_open_conns:30notary_signer:主机:1.1.1.1端口:5432db_name:notary_signer用户名:harbor密码:123456ssl_mode:禁用max_idle_conns:10max_open_conns:30SharedRedisHarbor的Redis主要存放session信息,会影响HarborUI页面的登录。如果可用性要求不是太高,可以使用自建的Redis实例,因为即使Redis存储的数据丢失了,Harbor的数据完整性也没有影响。共享S3对象存储,我使用的是华为OBS对象存储,需要给AKSK全权限。storage_service:s3:accesskey:xxxsecretkey:xxxregion:ap-southeast-3regionendpoint:https://obs.ap-southeast-3.myhuaweicloud.combucket:xxxencrypt:falsesecure:truev4auth:truechunksize:5242880multipartcopychunksize:33554432multipartcopymaxconcurrency:100multipartcopythresholdsize:33554432rootdirectory:/registry/如果担心S3的单点问题,可以买两个Bucket互相同步镜像数据。这样当其中一个Bucket出现异常时,可以快速切换到另一个Bucket来恢复服务。4.使用Dragonfly节省带宽为什么需要Dragonfly分发图片?其中一个重要原因是为了节省带宽,并避免对Habor造成过大的负载。如果不使用Dragonfly镜像分发,每次拉取镜像都会向Habor请求数据。如下图:使用Dragonfly后,同一个区域只需要请求Harbor一次,其他请求可以通过该区域的流量完成。这种方式大大加快了镜像拉取过程,节省了跨地域带宽,减轻了Harbor的负载压力。5.总结最近,我们正在重新规划和部署一个业务的图像管理系统。本文是相关思考和实践的总结。本文主要从网络规划入手,讲一下全局镜像的分布。网络规划主要包括三个部分:网段规划、连通性实现和路由配置。镜像分发主要采用Habor+Dra??gonfly的方案。同时推荐使用共享存储部署高可用的Harbor。其实在部署Harbor之后,我也测试了各个区域拉取镜像的速度。此外,还需要对影响Habor服务的依赖项进行配置和监控,并持续改进,以打造良好的镜像仓库和分发系统。6.参考https://github.com/dragonflyoss/Dragonfly2https://github.com/goharbor/harbor