我起初是用helm在k8s上装的harbor,最近遇到如下故障:就是服务器硬件设备故障突然死机,恰巧是harbor容器所在的服务器,其他在这个服务器上运行的容器,由kubelet调度到其他正常的服务器上重启去了,但harbkor并没有被调度走。移动到其他服务器上的容器,需要重新连接harbor拉取镜像,但私有仓库挂了,镜像也就拉取失败,直接导致所有在这个宕机的服务器上运行的容器全部挂了,无法再次启动。所以就想着把harbor从k8s中替换出来,找两台固定的服务器做一个高可用HA,这样harbor再次失效的可能性就小一些。
我选择的HA架构是如下图所示,如果机器富裕,我感觉不用这种架构,把数据独立共享出来可能会更好一些。
我这张图是下载网上的,这里没有用负载均衡Haproxy,只是用了Keepalived做了一个虚拟地址,然后把域名绑定到虚拟地址上,一旦一台harbor的主机宕机,虚拟地址自动漂移到另一台harbor上,可确保harbor始终在线,这里只要做好两台harbor的数据同步就可以了。如果不是两台主机同时挂,应该不会出现上述故障现象了。如下是操作步骤。
我选择的两台主机ip分别为11.12.3.97和11.12.3.98使用keepalived虚拟出来的地址是11.12.3.99,要确保这些ip地址不会冲突,且网络可达。
在主机上安装docker、docker-compose、python3、pip和keepalived,然后参考CSDN我之前写的这篇文章配置keepalived,停机测试虚拟地址是否可以正常漂移。在安装docker组件的时候要注意版本的问题,不然安装harbor会报错。我这里用的版本是:
docker: Docker version 25.0.1
docker-compose: Docker Compose version v2.24.4
python3: Python 3.8.10
pip: pip 23.3.2
然后去github.com/goharhor/harbor/tags上下载你想安装的harbor版本(如何github不好打开,可以用一下加速器软件,我这里用了Watt Toolkit 做加速),我的服务器是用的ubuntu,我下载的是harbor-offline-installer-v2.4.2.tgz
然后将压缩包解压 tar -zxvf ./harbor-offline-installer-v2.4.2.tgz -C /opt/
再参考官网配置证书Harbor docs | Configure HTTPS Access to Harbor
这里注意一点,使用docker安装harbor,它会在根目录创建一个data的目录,harbor容器是挂载到/data这个目录下,将所有数据在这个目录下持久化保存,官方文档中
这里的目录就是在安装harbor的主机上自行创建的目录,这里要注意/data/cert 目录的用户和用户组必须是10000 ,因为harbor默认访问的用户就是10000,拷贝到该目录下的文件也要
chown -R 10000.10000 /data/cert
不然harbor运行时会报没有权限访问证书的错误。
关于harbor的证书和docker配置可以参考CSDN我之前写的这篇文章。
这里需要注意一点,在配置/etc/docker/daemon.json
添加 "registry-mirrors": ["https://core.harbor.shell.com:443"],
"insecure-registries": ["11.12.3.97","11.12.3.98","11.12.3.99"]
把地址都配进去,并且在创建证书的时候v3.ext文件中的DNS信息也要将这些地址都加上,证书创建完后,可以通过openssl x509 -text -noout -in core.harbor.shell.com.crt命令去验证,看是否有
X509v3 Extended Key Usage: TLS Web Server AuthenticationX509v3 Subject Alternative Name: DNS:core.harbor.shell.com, DNS:core.harbor.shell, DNS:11.12.3.98, DNS:11.12.3.97,DNS:11.12.3.99
证书配置完毕后,到/opt/harbor目录配置安装文件
mv harbor.yml.tmpl harbor.yml
这里端口号根据需求也可以配置,harbor_admin_password:这里是配置harbor登录的初始密码,用户名默认是admin
然后运行install.sh 进行harbor安装,如果中间变更了配置或者已经安装过后想修改,可以运行
sudo docker-compose down -v
sudo ./prepare
安装完毕可以通过 sudo docker-compose ps 查看容器是否都已经起来
启动正常后,可以通过浏览器输入11.12.3.99 地址打开harbor操作界面,配置了证书后,浏览器会自动跳转到https,如何想通过域名core.harbor.shell.com访问,需要在客户端的hosts中添加域名和虚拟ip地址的绑定信息。
现在,访问11.12.3.97和11.12.3.98 是打开了两个不同主机上运行的harbor,我的11.12.3.99虚拟地址在3.97上,所以需要配置3.98的数据同步,可以参考Haproxy 实现 harbor 高可用_harbor 高可用部署 haproxy-CSDN博客
上面的同步是将虚拟地址上运行的harbor通过事件触发,同步到另一台harbor上,但是我这里按照上面的配置行不通,因为我咋3.99也就是3.97这台机器上配置
(98连97是正常的,这里注意自己配置的证书验证远程证书的对勾不能打,否则连接失败。 )
查看日志可以发现,报如下错误
2024-02-04T09:26:10Z [ERROR] [/lib/http/error.go:54]: {"errors":[{"code":"UNKNOWN","message":"unknown: Get \"https://11.12.3.98/api/version\": x509: cannot validate certificate for 11.12.3.98 because it doesn't contain any IP SANs"}]}
而在另外一台机器上做相同配置连接另一台主机就可以配置成功,要是把keepalived的优先级颠倒一下,将3.99漂移到3.98上,和之前配置3.97的情况一样,可以配置成功,但是3.97就会报之前3.98的错误。所以我这里做同步是用pull的方式
这里配置的是定时每天12点执行同步,由3.98向3.97拉去镜像同步。这样,一旦3.97挂了,3.99的地址就会漂移到3.98上,此时容器拉取操作就是在同3.98这台服务器上的harbor交互。
这个方案存在一个问题,就是一旦3.97恢复,如果3.98的镜像和3.97镜像不一致,需要手动再做一下同步,在复制管理里添加一条规则
当3.97恢复,3.99漂移到3.97上,可以在3.98上手动执行该策略,实现3.98到3.97的镜像同步。