我们在日常Docker容器使用和管理过程中,渐渐发现部署企业私有仓库往往是很有必要的, 它可以帮助你管理企业的一些敏感镜像, 同时由于Docker Hub的下载速度慢的原因, 往往需要将一些无法直接下载的镜像导入本地私有仓库. 而Harbor就是部署企业私有仓库的一个不二之选。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,Harbor主要提供Dcoker Registry管理UI,提供的功能包括:基于角色访问的控制权限管理(RBAC)、AD/LDAP集成、日志审核、管理界面、自我注册、镜像复制和中文支持等。Harbor的目标是帮助用户迅速搭建一个企业级的Docker registry服务。
这里我们从零开始搭建一个高可用Harbor集群部署

部署方案
Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制;2)多harbor实例共享后端存储。
我们这里选择第一种方案:双主复制。
所谓的双主复制其实就是复用主从同步实现两个harbor节点之间的双向同步,来保证数据的一致性,然后在两台harbor前端顶一个负载均衡器将进来的请求分流到不同的实例中去,只要有一个实例中有了新的镜像,就是自动的同步复制到另外的的实例中去,这样实现了负载均衡,也避免了单点故障,在一定程度上实现了Harbor的高可用性:

话不多说,开始动手。
环境准备
服务器准备:
| 序号 | 节点 | IP地址 |
|---|---|---|
| 1 | Harbor01 | 192.168.188.134 |
| 2 | Harbor02 | 192.168.188.135 |
| 3 | VIP | 192.168.188.136 |
注:这里的VIP是keepalived的高可用IP地址,非物理节点,所有节点使用的操作系统为Redhat7.6。
为两台物理服务器关闭防火墙,安装docker18.09
[root@harbor01 yum.repos.d]# systemctl stop firewalld && systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@harbor01 yum.repos.d]# setenforce 0
[root@harbor01 yum.repos.d]# yum install -y docker-ce
[root@harbor01 docker]# systemctl daemon-reload
[root@harbor01 docker]# systemctl start docker && systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
Harbor安装
1)将harbor-offline-installer-v1.8.1.tgz解压至/usr/local/harbor/
2)将docker-compose移动至/usr/local/bin/docker-compose/
[root@harbor02 tmp]# mv docker-compose /usr/local/bin/docker-compose
3)增加权限
[root@harbor02 tmp]# chmod +x /usr/local/bin/docker-compose
4)修改harbor.yml
将其中的hostname改为hostname: 192.168.188.135
5)启动harbor
[root@harbor02 harbor]# ./prepare
[root@harbor02 harbor]# sh /usr/local/harbor/install.sh
两个物理节点相同的操作,将Harbor启动起来
此时此刻Harbor已经安装完成并启动起来,赶紧去测试一下:
在浏览器中测试,输入http://192.168.188.135,使用默认密码登陆进去
默认用户名:admin
默认密码:Harbor12345
这个时候在浏览器中看到画面如下:

再用docker登陆试一下:
[root@harbor01 harbor]# docker login 192.168.188.134
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
这里有个坑,会出现如下报错:
[root@harbor01 harbor]# docker login 192.168.188.134
Username: admin
Password:
Error response from daemon: Get https://192.168.188.134/v2/: dial tcp 192.168.188.134:443: connect: connection refused
这是因为docker默认使用安全认证登录方式,这里则是使用http方式,因此需要添加insecure-registry,解决方法如下:
vim usr/lib/systemd/system/docker.service
增加:--insecure-registry这一行
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.188.134
好了,Harbor已经能正常运作了,下面开始部署双主复制的高可用方案
Harbor高可用设置
登录至Harbor网页
设置仓库管理


设置复制管理


基本设置已经完成,我们可以推个镜像上去试一试,看看是否同步过去。
[root@harbor02 harbor]# docker tag busybox:lastest 192.168.188.135/library/busybox_test
[root@harbor02 harbor]# docker push 192.168.188.135/library/busybox_test
The push refers to repository [192.168.188.135/library/busybox_test]
1da8e4c8d307: Pushed
latest: digest: sha256:679b1c1058c1f2dc59a3ee70eed986a88811c0205c8ceea57cec5f22d2c3fbb1 size: 527
这里上传镜像时也会有个坑
出现如下报错:
The push refers to repository [192.168.188.135/library/busybox]
1da8e4c8d307: Preparing
denied: requested access to the resource is denied
解决方案如下:
应修改如下文件:
[root@harbor02 harbor]# vim ~/.docker/config.json
{
"auths": {
"192.168.188.135": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.5 (linux)"
}
}
将其中的“auth”键值对删除即可
这个时候用网页登录到harbor上,看一下harbor02中的library项目是否已经有这个busybox镜像了
然后登录另一个节点harbor01,看一下项目下的library是否已经同步过来。
注:这里设置的是30秒同步,等不及的同学请直接点手动同步。

已经同步过来了,接下来,我们完成VIP的安装配置
Keepalived安装配置
安装Keepalived:
[root@harbor02 harbor]# yum install -y keepalived
修改Keepalived配置文件
! Configuration File for keepalived
global_defs {
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL1
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user root
enable_script_security
}
vrrp_script check_harbor {
# script "/opt/harbor.sh"
script "curl -k https://192.168.188.136:6443"
interval 2
weight 20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
mcast_src_ip 192.168.188.135
authentication {
auth_type PASS
auth_pass 1111
}
unicast_peer {
#注释掉本地IP,增加集群IP
#192.168.188.135
192.168.188.134
}
virtual_ipaddress {
192.168.188.136/24 dev ens33 label ens33:vip
}
track_script {
check_harbor
}
}
同时将192.168.188.136加入docker的insecure-registry。
然后登陆测试下:
[root@harbor02 harbor]# docker login 192.168.188.136
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
我们再传个镜像上去
[root@harbor02 harbor]# docker tag busybox:lastest 192.168.188.136/harbor01/busybox:lastest
[root@harbor02 harbor]# docker push 192.168.188.136/harbor01/busybox:lastest
The push refers to repository [192.168.188.136/harbor01/busybox]
1da8e4c8d307: Mounted from harbor02/busybox
lastest: digest: sha256:679b1c1058c1f2dc59a3ee70eed986a88811c0205c8ceea57cec5f22d2c3fbb1 size: 527
我们再登录到网页端看一下,发现已经同步





