第6节 Docker私有仓库Harbor高可用和双向复制

Harbor的自动启动

前一篇发现 reboot宿主后,Harbor的9个吧 容器没有全部起得来,当时处理方式就是

1、docker的daemon.json里要有live-restore:true的配置

2、reboot后由于Harbor的docker-compose.yml里的除了log容器以外,其他都是有depends_on的,所以启动次序没有

image-20240620171456351

image-20240620172915344

image-20240620173026479

image-20240620173210923

这就是我要的效果了👆

到这可以判断下

1、从上往下启动来着

2、harhor-log 首先启动

3、registry,其次启动,但是log启动如果速度慢了,registry也许就启动不了了,因为查看docker-comose.yml里没有延迟设置

4、reboot看看哪些起不来

image-20240620173713751

这次就一个jobservice没起来

再reboot

image-20240620174019388

这次就一个log起来了,你看不稳定的

就是log启动慢了,依赖它的其他服务启动的时候log没起来呢,就gg了。

然后restart docker一下就基本都好了,这是因为有daemon.json里的live-restore和compose里的restart always结合的效果吧。

image-20240620174233665

Harbor安装后启动问题

1、部分启动OK,不稳定

​ 如上所述

2、数据存放默认定义在了/data下

image-20240620174756960

image-20240620174916232

不过openvpn的image只找到找个名称的文件,但是image文件大小对不上,可能还在其他地方

image-20240620175512532

可以自定义harbor的数据持久化目录

image-20240620175833877

然后运行./prepare脚本

image-20240620180537723

就自定了harbor的数据卷的地方,但是需要重新docker-compose down / up了

而且新的数据持久化目录里是空的,

image-20240620180837510

注意down up才行,restart不行

image-20240620181049358

然后就发现之前上传的镜像没了

image-20240620181132515

=============寻找harbor上传的image到底放在哪了👇======================

原来的openvpn还在旧的路径里,当然图中的openpvn只是名称不是image

image-20240620181237889

image在registry里不过名字是hash值了,而且不太好找,比如我上传一个500MB的镜像,他会压缩到141MB👇

image-20240621145250706

然后就是找找个文件到底在什么地方

image-20240621145505224

关注layer层文件

image-20240621145532676

通过搜索,du -sh *观察文件大小,发现141MB也被拆分成分层镜像了

但实际文件确不在这些路径里,在这里👇,上传的镜像整体是在regsitry大文件夹里面

image-20240621145823968

找到一个

image-20240621145930951

所以结论来了:你上传一个500MB的image,harbor首先给你拆分 分层,然后给你压缩分别存放。页面上看到的就是141MB的压缩后大小。传统观念是我上传一个镜像,我可以从后台也就是底层linux去找到这个镜像然后导出来,对不起这种方式harbor不支持了,因为image被拆分了,只能通过cli去pull下来了。

=============寻找harbor上传的image到底放在哪了👆======================

改回去上传的镜像就回来了

image-20240620181512946

可以看出来,down是从yml文件里 ,从下往上down的,up就是从上往下up的。

image-20240620181454232

image-20240620182444676

言归正传开启自启动咋解决

方法1,写个service文件

[root@harbor ~]#vim /lib/systemd/system/harbor.service
[unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr//bin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target


[root@harbor ~]#systemctl daemon-reload
[root@harbor ~]#systemctl enable harbor

如果将上面的up down改成start和stop反而不灵了--就是起不来。

image-20240621100427366

reboot试试

image-20240621101010282

方法2,写rc.loal咯

vim /etc/rc.local
#! /bin/bash
cd /apps/harbor
/usr/bin/docker-compose up

保存退出👇修改执行权限
chmod +x /etc/rc.local

Harbor的HA

Harbor最关键还是镜像别丢了就行。

1、不太完美的共享存储

image-20240621154316783

前面顶一个LB,比如nginx,lvs、httpproxy

后面是几个Harobr做实例,

但是数据不放在Harbor上了,单独放到后面,供几个Harbor共享存储。

数据用NAS,NFS来做;然后NFS要做好备份,比如rsync的实时备份...不知道会不会降低IO降低业务效率啊。

总之这个方案不太优秀~

就是这个data_volume目录是远程挂载的

image-20240621153108398

2、基于镜像复制

image-20240621154424637

就是存储时单独的,但是互相复制的;类似mysql 双主A/A模型。

前端还是LB,比如nginx,

后面是几个Harbor做实例,数据也是跟着Harbor走的。不用共享数据存储。

第一种方案就是共享存储NFS NAS的搭建了,重点时第二种方案的学习

Harbor之间的数据存储的复制,其粒度更精细--就是多个项目,指定哪几个做HA,是可以这样的。

image-20240621154929634

有些测试的可能就没必要做HA。

实验开始

搞第二台Harbor

当然监听端口2台都得改改,第一台页不用改,到时候LB那边顶前面就行了

1、docker 的配置同步下

image-20240621161201567

记得重启服务

systemctl enable docker

systemctl start docker

2、安装docker-compose

wget https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

3、然后就开整harbor


#下载
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz

#解压
tar xf harbor-offline-installer-v2.11.0.tgz

#修改
cd harbor
mv harbor.yml.tmpl harbor.yml

vim harbor.yml
注释下👇:
#https:
#  # https port for harbor, default is 443
#  port: 443
#  # The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path
#  # enable strong ssl ciphers (default: false)
#  # strong_ssl_ciphers: false

...
修改
hostname: harbor.oneyearice.org   # 据说是HA的时候两个Harbor必须用IP,我先不用
data_volume: /data/harbor
...
...

#初始化
./install.sh

# 此时docker-compose ps就可以看到harbor已经起来了,web打开看看是ok的就行
admin/Harbor12345   默认账号密码

#写service实现开启和异常退出时自启动
[root@server ~]# cat /lib/systemd/system/harbor.service
[unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /apps/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target


#加载
systemctl daemon-reload
systemctl enable harbor
docker-compose down  # 先停掉之前的docker-compose手动up的服务,再统一使用s
systemctl restart harbor  # 再统一使用service来启动和停止,否则service还管不了之前手动启动的服务。


#这样就就ok了

4、配置HA

注意,可能需要将2台Harbor的初始化yml里的hostname改成IP地址,当然我觉得没必要,先不改。

如果改就需要./prepare后再systemctl restart harbor的。

现在有两台Harbor 一台192.168.126.132 ;一台192.168.126.133

1、先新建需要同步的项目:两边都要创建,最好同名

image-20240621171325435

image-20240621171514654

注意第二台上的项目名称少写了8,但是不要经,待会132直接可以把K888s连项目带镜像一起推过来👆

2、其次就要做两遍单向复制,实现双向

关键词:仓库管理--什么项目进行同步 、 复制管理--怎么个同步法

image-20240621172824198

可见👆不仅仅支持harbor的同步,还支持从其他地方比如AWS,比如gitlab之间的同步。

也支持docker官方的registry同步--这个是指registry这个私有方案吧,还是说hub.docker.com啊,应该不是说hub.docker.com

其实我倒没希望有一个类似缓存代理的功能,就是从这个harbor下载的公共镜像都缓存,下次其他人下载也能够利用缓存。nexus倒是用的比较多。

目标名就是同步的对方Harbor的项目名

肯定写IP了,否则域名一样就出问题,不过我上面harbor.yml初始化的配置里 都用的一个harbor.oneyearice.org域名我觉得不碍事,所以没改,继续看看呗~~

image-20240621173307800

访问ID和密码,严格来讲,是对方仓库项目里的成员ID和密码来着,不过admin是都有了。

因为没有启动SSL,所以去掉勾选

image-20240621175435914

报错了,回头去修改hostname为IP吧

image-20240621175544466

image-20240621175559056

image-20240621175624082

两台除了IP不同,操作都来一遍👆

你看,192.168.126.133一改为IP,👇132去连接就好了,我估计这个hostname十有八九写到nginx的server块了,你写域名的结果就是你要用域名去访问。

image-20240621175720450

查一下nginx的配置呗

没找到.....

image-20240621180351896

纠错:

算了 两边都改成IP吧,就是说HA的时候两台harbor.yml里都要用IP

现在两遍就都OK了,👇图的项目名称不必事先存在,不过最好不要瞎折腾,这里仅仅顺便讲清楚而已。

image-20240621180558661

好像SSL不去掉也行。。。

image-20240621180728808

还是去掉吧,万一后面复制的时候验证SSL就麻烦了

image-20240621180820722

image-20240621181023720

3、继续配置怎么同步

也就是复制管理

image-20240621181351531

新版是有pull和push的,老版的只有push

还是用push,推,用推可以做到实时同步,因为pull拉应该不能实时的去知道什么时候去拉。就是本地镜像一变就push过去,但是要实时拉,就得知道对端镜像的实时变化了不方便可能。理论上是可以让对端将镜像变化的信息发过来的,但是实际应用就不好说,所以还是朱永push吧。

image-20240624102515003

如图👆可见pull拉是没有触发事件的,没法做到实时

简单配一下

image-20240624094405872

此时已经实现了192.168.126.132--->192.168.126.133的单向复制。

测试下

①再开一个机器192.168.126.134,并修改docker配置文件,加一下没有ssl的忽略配置

image-20240624095413653

这里临时👆配置了两个Harbor的ip地址,后面加了nginx后就删掉2个ip,改成1个nginx的代理ip就行了。

②两个Harbor都登入一下👇

image-20240624100229343

PS:密码是明文存放的

image-20240624100015151

推一个busybox上去

image-20240624100725250

此时133那台harbor也就自动复制过去了

image-20240624100700127

注意133上的K888S是事先不存在的。上文页提到了,而且log也看得到👇,就是仓库管理那里写啥就推了啥估计。

image-20240624101351300

此时由于133没有push到132的 复制规则 ,所以

image-20240624102645013

这个busybox:v002只会存在于133上,但是由于哈希值一样的,只是改了个tag,所以harbor给你合并了

image-20240624102953374

image-20240624103003433

再推一个alpine上到133去

image-20240624103039901

然后将133-->132的反向复制给做了

image-20240624103222864

然后发现此时132上没有立马出现alpine和busybox:v002的两个镜像。

应该是触发动作没有,所以133上push一个再

随便推一个存在都行

image-20240624103533635

此时132就拿到133所有的多出来的镜像了,不对,还少了一个busybox:v002👇

image-20240624103559165

再推一个nginx到133看看

image-20240624103744521

好nginx已经复制到132了

再看看busybox:v002

还是没有

image-20240624103823382

所以复制的事件触发规则是👇

push哪个image就复制哪个image的,不会说一个imageA触发所有的差异化的images

所以再推一次需要同步的那个image到133

image-20240624104005686

此时133就会触发同步到133了

image-20240624104030793

删除,在132上删除镜像

image-20240624104856576

此时133上镜像的名称文件夹还在,但是里面的东西确实没了

image-20240624104935025

image-20240624104944032

Copyright 🌹 © oneyearice@126.com 2022 all right reserved,powered by Gitbook文档更新时间: 2024-07-28 14:47:28

results matching ""

    No results matching ""