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 故障转移测试

  1. 停止Master节点的Keepalived服务:
systemctl stop keepalived
  1. 在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
  1. 访问Harbor Web界面(http://10.0.0.250)验证服务可用性

2.9 恢复测试

  1. 重新启动Master节点的Keepalived:
systemctl start keepalived
  1. 观察VIP是否自动切回Master节点(取决于是否配置了nopreempt

三、生产环境优化建议

  1. 多级健康检查

    • 不仅检查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
      
  2. 监控告警

    • 配置Keepalived状态监控
    • VIP漂移事件触发告警
  3. 日志记录

    • 配置Keepalived详细日志
    • 记录所有状态变更事件
  4. 安全加固

    • 使用更复杂的认证密码
    • 限制VRRP组播包的访问
  5. DNS配置

    • 将Harbor域名解析指向VIP
    • 配置合理的TTL值

四、方案优缺点分析

优点

  • 实现简单,维护成本低
  • 故障转移快速(秒级)
  • 无需额外硬件负载均衡设备

缺点

  • 需要配合共享存储或镜像复制保证数据一致性
  • 单活架构,备用节点资源利用率低
  • 需要确保网络稳定性,避免脑裂问题

五、常见问题排查

  1. VIP不漂移

    • 检查防火墙是否允许VRRP协议(IP协议号112)
    • 验证节点间网络连通性
    • 检查virtual_router_id是否一致
  2. 频繁切换

    • 调整健康检查间隔(interval参数)
    • 优化健康检查脚本执行效率
    • 检查网络是否存在波动
  3. 脑裂问题

    • 配置更严格的健康检查条件
    • 考虑使用第三方仲裁机制

六、总结

通过Keepalived实现VIP漂移是构建Harbor高可用环境的有效方案,特别适合中小规模的生产环境。结合镜像复制功能,可以构建完整的容灾体系。在实际部署时,应根据业务需求和数据一致性要求,选择合适的后端存储方案和复制策略。

posted on 2025-04-13 17:47  Leo-Yide  阅读(219)  评论(0)    收藏  举报