第6节 Docker私有仓库Harbor高可用和双向复制
Harbor的自动启动
前一篇发现 reboot宿主后,Harbor的9个吧 容器没有全部起得来,当时处理方式就是
1、docker的daemon.json里要有live-restore:true的配置
2、reboot后由于Harbor的docker-compose.yml里的除了log容器以外,其他都是有depends_on的,所以启动次序没有
这就是我要的效果了👆
到这可以判断下
1、从上往下启动来着
2、harhor-log 首先启动
3、registry,其次启动,但是log启动如果速度慢了,registry也许就启动不了了,因为查看docker-comose.yml里没有延迟设置
4、reboot看看哪些起不来
这次就一个jobservice没起来
再reboot
这次就一个log起来了,你看不稳定的
就是log启动慢了,依赖它的其他服务启动的时候log没起来呢,就gg了。
然后restart docker一下就基本都好了,这是因为有daemon.json里的live-restore和compose里的restart always结合的效果吧。
Harbor安装后启动问题
1、部分启动OK,不稳定
如上所述
2、数据存放默认定义在了/data下
不过openvpn的image只找到找个名称的文件,但是image文件大小对不上,可能还在其他地方
可以自定义harbor的数据持久化目录
然后运行./prepare脚本
就自定了harbor的数据卷的地方,但是需要重新docker-compose down / up了
而且新的数据持久化目录里是空的,
注意down up才行,restart不行
然后就发现之前上传的镜像没了
=============寻找harbor上传的image到底放在哪了👇======================
原来的openvpn还在旧的路径里,当然图中的openpvn只是名称不是image
image在registry里不过名字是hash值了,而且不太好找,比如我上传一个500MB的镜像,他会压缩到141MB👇
然后就是找找个文件到底在什么地方
关注layer层文件
通过搜索,du -sh *观察文件大小,发现141MB也被拆分成分层镜像了
但实际文件确不在这些路径里,在这里👇,上传的镜像整体是在regsitry大文件夹里面
找到一个
所以结论来了:你上传一个500MB的image,harbor首先给你拆分 分层,然后给你压缩分别存放。页面上看到的就是141MB的压缩后大小。传统观念是我上传一个镜像,我可以从后台也就是底层linux去找到这个镜像然后导出来,对不起这种方式harbor不支持了,因为image被拆分了,只能通过cli去pull下来了。
=============寻找harbor上传的image到底放在哪了👆======================
改回去上传的镜像就回来了
可以看出来,down是从yml文件里 ,从下往上down的,up就是从上往下up的。
言归正传开启自启动咋解决
方法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反而不灵了--就是起不来。
reboot试试
方法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、不太完美的共享存储
前面顶一个LB,比如nginx,lvs、httpproxy
后面是几个Harobr做实例,
但是数据不放在Harbor上了,单独放到后面,供几个Harbor共享存储。
数据用NAS,NFS来做;然后NFS要做好备份,比如rsync的实时备份...不知道会不会降低IO降低业务效率啊。
总之这个方案不太优秀~
就是这个data_volume目录是远程挂载的
2、基于镜像复制
就是存储时单独的,但是互相复制的;类似mysql 双主A/A模型。
前端还是LB,比如nginx,
后面是几个Harbor做实例,数据也是跟着Harbor走的。不用共享数据存储。
第一种方案就是共享存储NFS NAS的搭建了,重点时第二种方案的学习
Harbor之间的数据存储的复制,其粒度更精细--就是多个项目,指定哪几个做HA,是可以这样的。
有些测试的可能就没必要做HA。
实验开始
搞第二台Harbor
当然监听端口2台都得改改,第一台页不用改,到时候LB那边顶前面就行了
1、docker 的配置同步下
记得重启服务
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、先新建需要同步的项目:两边都要创建,最好同名
注意第二台上的项目名称少写了8,但是不要经,待会132直接可以把K888s连项目带镜像一起推过来👆
2、其次就要做两遍单向复制,实现双向
关键词:仓库管理--什么项目进行同步 、 复制管理--怎么个同步法
可见👆不仅仅支持harbor的同步,还支持从其他地方比如AWS,比如gitlab之间的同步。
也支持docker官方的registry同步--这个是指registry这个私有方案吧,还是说hub.docker.com啊,应该不是说hub.docker.com
其实我倒没希望有一个类似缓存代理的功能,就是从这个harbor下载的公共镜像都缓存,下次其他人下载也能够利用缓存。nexus倒是用的比较多。
目标名就是同步的对方Harbor的项目名
肯定写IP了,否则域名一样就出问题,不过我上面harbor.yml初始化的配置里 都用的一个harbor.oneyearice.org域名我觉得不碍事,所以没改,继续看看呗~~
访问ID和密码,严格来讲,是对方仓库项目里的成员ID和密码来着,不过admin是都有了。
因为没有启动SSL,所以去掉勾选
报错了,回头去修改hostname为IP吧
两台除了IP不同,操作都来一遍👆
你看,192.168.126.133一改为IP,👇132去连接就好了,我估计这个hostname十有八九写到nginx的server块了,你写域名的结果就是你要用域名去访问。
查一下nginx的配置呗
没找到.....
纠错:
算了 两边都改成IP吧,就是说HA的时候两台harbor.yml里都要用IP
现在两遍就都OK了,👇图的项目名称不必事先存在,不过最好不要瞎折腾,这里仅仅顺便讲清楚而已。
好像SSL不去掉也行。。。
还是去掉吧,万一后面复制的时候验证SSL就麻烦了
3、继续配置怎么同步
也就是复制管理
新版是有pull和push的,老版的只有push
还是用push,推,用推可以做到实时同步,因为pull拉应该不能实时的去知道什么时候去拉。就是本地镜像一变就push过去,但是要实时拉,就得知道对端镜像的实时变化了不方便可能。理论上是可以让对端将镜像变化的信息发过来的,但是实际应用就不好说,所以还是朱永push吧。
如图👆可见pull拉是没有触发事件的,没法做到实时
简单配一下
此时已经实现了192.168.126.132--->192.168.126.133的单向复制。
测试下
①再开一个机器192.168.126.134,并修改docker配置文件,加一下没有ssl的忽略配置
这里临时👆配置了两个Harbor的ip地址,后面加了nginx后就删掉2个ip,改成1个nginx的代理ip就行了。
②两个Harbor都登入一下👇
PS:密码是明文存放的
推一个busybox上去
此时133那台harbor也就自动复制过去了
注意133上的K888S是事先不存在的。上文页提到了,而且log也看得到👇,就是仓库管理那里写啥就推了啥估计。
此时由于133没有push到132的 复制规则 ,所以
这个busybox:v002只会存在于133上,但是由于哈希值一样的,只是改了个tag,所以harbor给你合并了
再推一个alpine上到133去
然后将133-->132的反向复制给做了
然后发现此时132上没有立马出现alpine和busybox:v002的两个镜像。
应该是触发动作没有,所以133上push一个再
随便推一个存在都行
此时132就拿到133所有的多出来的镜像了,不对,还少了一个busybox:v002👇
再推一个nginx到133看看
好nginx已经复制到132了
再看看busybox:v002
还是没有
所以复制的事件触发规则是👇
push哪个image就复制哪个image的,不会说一个imageA触发所有的差异化的images
所以再推一次需要同步的那个image到133
此时133就会触发同步到133了
删除,在132上删除镜像
此时133上镜像的名称文件夹还在,但是里面的东西确实没了