1、前言
在实际生产环境中,Harbor 通常作为企业内部的 Docker/OCI 镜像仓库,为 Kubernetes、Docker、CI/CD 等平台提供统一的镜像存储和分发能力。
如果 Harbor 仅部署在单台服务器上,那么一旦服务器发生故障,整个镜像仓库服务都会受到影响。因此,在生产环境中可以通过 双节点 Harbor + Keepalived VIP 的方式实现基础的高可用访问。
本文采用本地服务器部署方式,整体方案如下:
两台服务器分别部署 Harbor;
两台服务器部署 Keepalived;
通过 VIP 对外提供统一访问地址;
两套 Harbor 之间配置镜像同步;
分别通过 node01、node02 和 VIP 对 Harbor 进行访问测试;
使用离线安装方式部署 Harbor,适用于无法直接访问互联网的环境。
本文使用的 Harbor 项目地址:
项目地址:GitHub Harbor 项目
官方网站:Harbor 官网
2、整体架构
本次实验环境由两台 Harbor 节点组成:
┌──────────────────┐
│ Harbor Client │
│ Docker / K8S /CI │
└────────┬─────────┘
│
│ Harbor VIP
│ 192.168.80.200
▼
┌────────────────────┐
│ Keepalived │
│ VIP 高可用 │
└─────────┬──────────┘
│
┌────────────┴────────────┐
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ node01 │ │ node02 │
│ 192.168.80.46 │ │ 192.168.80.47 │
│ │ │ │
│ Harbor │◄─────►│ Harbor │
│ Keepalived │同步仓库│ Keepalived │
└─────────────────┘ └─────────────────┘3、 下载jar包并安装(两台机器一样)
node01、node02机器同时操作(注意ip地址)
# 1.下载离线包
# 因为网络问题我们通过找到代理下载
wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.6.1/harbor-offline-installer-v2.6.1.tgz
cd harbor/
ls
common.sh harbor.v2.6.1.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
cp harbor.yml.tmpl harbor.yml
# 2.修改配置文件
vim harbor.yml
# hostname需要修改成本机的地址
hostname: 192.168.80.64
# 密码修改,我在这里就不进行修改了
harbor_admin_password:Harbor12345
# 修改存储磁盘,默认是data,具体根据你服务器来修改,
# 应该放置到最大目录下,我在这里就不修改了
data_volume: /data
# harbordb的密码,我在这里也不进行修改了
password: root123
# 把有关https的全部注释掉,否则会报错
# 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
# 3.安装
root@k8s-node01:~/harbor# pwd
/root/harbor
root@k8s-node01:~/harbor# ./install.sh访问地址:http://192.168.80.64、http://192.168.80.65
User:admin Password:Harbor12345

4. keepalived配置
4.1 主一节点
192.168.80.46操作
apt install keepalived -y
#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_harbor.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
# 注意网卡名
interface ens33
mcast_src_ip 192.168.80.46
virtual_router_id 51
priority 100
nopreempt
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.80.200
}
track_script {
chk_apiserver
} }
EOF4.2 主二节点
192.168.80.47操作
apt install keepalived -y
#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_harbor.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
# 注意网卡名
interface ens33
mcast_src_ip 192.168.80.47
virtual_router_id 51
priority 100
nopreempt
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.80.200
}
track_script {
chk_apiserver
} }
EOF4.3 检查脚本
两台主机操作
cat > /etc/keepalived/check_harbor.sh << EOF
#!/bin/bash
#count=$(docker-compose -f /opt/harbor/docker-compose.yml ps -a|grep healthy|wc -l)
# 不能频繁调用docker-compose 否则会有非常多的临时目录被创建:/tmp/_MEI*
count=$(docker ps |grep goharbor|grep healthy|wc -l)
status=$(ss -tlnp|grep -w 443|wc -l)
if [ $count -ne 9 -a ];then
exit 8
elif [ $status -lt 2 ];then
exit 9
else
exit 0
fi
EOF4.4 脚本授权
chmod +x /etc/keepalived/check_harbor.sh
sudo useradd keepalived_script
sudo passwd keepalived_script
sudo chown -R keepalived_script:keepalived_script /etc/keepalived/check_harbor.sh
systemctl daemon-reload
systemctl enable --now keepalived
systemctl start keepalived5. 配置双主策略
两台机器互相pull images策略
5.1 创建仓库
两个harbor统一操作

5.2 创建仓库管理
两个harbor统一操作(注意地址)

3.3 创建用户(非必须)
两个harbor统一操作

将用户变更为仓库成员,权限自定义:

3.4 设置复制规则
将规则修改为push的方式

4. 测试登录harbor
4.1 修改dockers启动配置文件
注:如果docker服务是在k8s集群内的话请思考下能不能随便重启docker,或者考虑换个有docker的机器。
/结尾:因为只是测试只有vip 地址漂移,harbor没有配备高可用服务,如果有需要可以考虑 haproxy服务做负载均衡。🐳