Harbor高可用解决方案:基于Keepalived实现VIP漂移
一、Harbor高可用架构概述
在企业生产环境中,Harbor作为核心的容器镜像仓库,其高可用性至关重要。常见的Harbor高可用方案主要有两种:
方案一:共享存储方案
- 多个Harbor节点共享同一后端存储(如NFS、Ceph、S3等)
- 数据库采用外部高可用数据库(如MySQL集群、PostgreSQL集群)
- Redis采用哨兵模式或集群模式
- 通过负载均衡器分发请求
方案二:主从复制方案
- 主Harbor节点负责写入操作
- 从节点通过镜像复制功能与主节点保持同步
- 结合Keepalived实现VIP漂移,提供故障转移能力
本文将重点介绍方案二的实现细节,即基于Keepalived的VIP漂移方案。
二、Keepalived实现VIP漂移实战
2.1 环境准备
| 节点 | IP地址 | 角色 |
|---|---|---|
| docker101 | 10.0.0.101 | Harbor节点1 |
| docker102 | 10.0.0.102 | Harbor节点2 |
| VIP | 10.0.0.250 | 虚拟IP |
2.2 安装Keepalived
在两台节点上安装Keepalived:
apt -y install keepalived
2.3 配置Master节点(docker101)
编辑/etc/keepalived/keepalived.conf:
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalived
global_defs {
router_id 10.0.0.101
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 101
priority 100
advert_int 1
mcast_src_ip 10.0.0.101
nopreempt
authentication {
auth_type PASS
auth_pass yinzhengjie_k8s
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.0.0.250
}
}
EOF
关键配置说明:
state MASTER:标识为主节点priority 100:优先级设置为100(数值越大优先级越高)virtual_router_id 101:虚拟路由ID,集群内必须唯一authentication:节点间认证配置track_script:健康检查脚本
2.4 配置Backup节点(docker102)
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalived
global_defs {
router_id 10.0.0.102
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 101
priority 90
advert_int 1
mcast_src_ip 10.0.0.102
authentication {
auth_type PASS
auth_pass yinzhengjie_k8s
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.0.0.250
}
}
EOF
注意Backup节点与Master节点的差异:
state BACKUP:标识为备份节点priority 90:优先级低于Master节点- 相同的
virtual_router_id:确保属于同一VRRP组
2.5 健康检查脚本
创建端口检查脚本/etc/keepalived/check_port.sh:
#!/bin/bash
CHK_PORT=$1
if [ -z "$CHK_PORT" ]; then
echo "Port not defined."
exit 1
fi
if ! netstat -tlnp | grep -q ":$CHK_PORT "; then
exit 1
fi
exit 0
赋予执行权限:
chmod +x /etc/keepalived/check_port.sh
2.6 启动服务
在两台节点上启动Keepalived:
systemctl restart keepalived
systemctl enable keepalived
2.7 验证VIP分配
在Master节点(docker101)上检查VIP:
ip a show ens33
应看到类似输出:
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:02:80:24 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.101/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet 10.0.0.250/32 scope global ens33
valid_lft forever preferred_lft forever
2.8 故障转移测试
- 停止Master节点的Keepalived服务:
systemctl stop keepalived
- 在Backup节点(docker102)上验证VIP漂移:
ip a show ens33
应看到VIP已转移到备份节点:
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:2b:ac:b6 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.102/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet 10.0.0.250/32 scope global ens33
valid_lft forever preferred_lft forever
- 访问Harbor Web界面(http://10.0.0.250)验证服务可用性
2.9 恢复测试
- 重新启动Master节点的Keepalived:
systemctl start keepalived
- 观察VIP是否自动切回Master节点(取决于是否配置了
nopreempt)
三、生产环境优化建议
-
多级健康检查:
- 不仅检查Nginx端口,还应检查Harbor核心服务状态
- 示例增强检查脚本:
#!/bin/bash # 检查Nginx if ! netstat -tlnp | grep -q ":80 "; then exit 1 fi # 检查Harbor核心服务 if ! docker ps | grep -q "harbor-core"; then exit 1 fi exit 0
-
监控告警:
- 配置Keepalived状态监控
- VIP漂移事件触发告警
-
日志记录:
- 配置Keepalived详细日志
- 记录所有状态变更事件
-
安全加固:
- 使用更复杂的认证密码
- 限制VRRP组播包的访问
-
DNS配置:
- 将Harbor域名解析指向VIP
- 配置合理的TTL值
四、方案优缺点分析
优点:
- 实现简单,维护成本低
- 故障转移快速(秒级)
- 无需额外硬件负载均衡设备
缺点:
- 需要配合共享存储或镜像复制保证数据一致性
- 单活架构,备用节点资源利用率低
- 需要确保网络稳定性,避免脑裂问题
五、常见问题排查
-
VIP不漂移:
- 检查防火墙是否允许VRRP协议(IP协议号112)
- 验证节点间网络连通性
- 检查
virtual_router_id是否一致
-
频繁切换:
- 调整健康检查间隔(
interval参数) - 优化健康检查脚本执行效率
- 检查网络是否存在波动
- 调整健康检查间隔(
-
脑裂问题:
- 配置更严格的健康检查条件
- 考虑使用第三方仲裁机制
六、总结
通过Keepalived实现VIP漂移是构建Harbor高可用环境的有效方案,特别适合中小规模的生产环境。结合镜像复制功能,可以构建完整的容灾体系。在实际部署时,应根据业务需求和数据一致性要求,选择合适的后端存储方案和复制策略。
浙公网安备 33010602011771号