Harbor高可用部署方案:基于Kubernetes与HAProxy的实践

发布时间:2026/10/27 8:53:57
Harbor高可用部署方案:基于Kubernetes与HAProxy的实践

1. 项目概述与架构设计

在企业级容器化部署中,Harbor作为镜像仓库的核心组件,其高可用性和稳定性直接关系到整个Kubernetes集群的可靠性。本方案采用独立负载均衡架构,通过HAProxy+Keepalived实现服务入口的高可用,结合Calico网络插件和kubeasz工具集,构建生产级Harbor集群。这套架构已在多个金融和互联网企业生产环境验证,可支撑日均百万级的镜像拉取请求。

典型拓扑包含以下核心层:

  • 负载均衡层:双节点HAProxy集群,通过VRRP协议实现VIP漂移
  • 计算节点层:至少3个Worker节点组成的Kubernetes工作集群
  • 存储层:MinIO分布式对象存储集群,提供持久化数据存储
  • 网络层:Calico BGP模式实现Pod网络与物理网络互通

关键设计原则:每个组件都需消除单点故障,且故障域要相互隔离。例如负载均衡节点与Kubernetes工作节点部署在不同物理机上。

2. 基础环境准备

2.1 硬件配置要求

节点类型CPU内存磁盘网络
负载均衡节点4核8GB100GB系统盘双万兆网卡
Master节点8核16GB100GB系统盘+500GB数据盘双万兆网卡
Worker节点16核32GB100GB系统盘+1TB数据盘双万兆网卡
MinIO存储节点12核32GB100GB系统盘+4x4TB数据盘双万兆网卡

2.2 系统初始化配置

所有节点需统一进行以下基础配置:

# 禁用Swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 设置内核参数 cat > /etc/sysctl.d/k8s.conf <<EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness = 0 EOF sysctl -p /etc/sysctl.d/k8s.conf # 配置时间同步 timedatectl set-timezone Asia/Shanghai systemctl enable --now chronyd

3. 负载均衡层部署

3.1 HAProxy双机部署

主备节点(10.0.0.104/105)上安装配置:

# 安装软件包 yum install -y haproxy keepalived # 主节点配置 cat > /etc/haproxy/haproxy.cfg <<'EOF' global log /dev/log local0 maxconn 4000 user haproxy group haproxy defaults mode http log global option httplog timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend k8s-api bind 10.0.0.112:6443 mode tcp default_backend k8s-api backend k8s-api mode tcp balance roundrobin option tcp-check server k8s-master1 10.0.0.101:6443 check inter 2000 fall 3 rise 2 server k8s-master2 10.0.0.102:6443 check inter 2000 fall 3 rise 2 server k8s-master3 10.0.0.103:6443 check inter 2000 fall 3 rise 2 EOF

3.2 Keepalived配置

主节点(10.0.0.104)配置:

cat > /etc/keepalived/keepalived.conf <<EOF vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.112/24 } track_script { chk_haproxy } } EOF

备节点(10.0.0.105)只需修改:

state BACKUP priority 90

3.3 服务验证

# 查看VIP归属 ip a show eth0 | grep 10.0.0.112 # 测试API访问 curl -k https://10.0.0.112:6443/version

4. Kubernetes集群部署

4.1 使用kubeasz快速部署

# 下载kubeasz export release=3.3.0 wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown chmod +x ./ezdown # 部署集群 ./ezdown -D ./ezdown -S ./easzctl start # 验证节点状态 kubectl get nodes -o wide

4.2 Calico网络配置

修改kubeasz的roles/calico/templates/calico-v3.24.yaml:

apiVersion: crd.projectcalico.org/v1 kind: IPPool metadata: name: default-ipv4-ippool spec: blockSize: 24 cidr: 10.244.0.0/16 ipipMode: Never natOutgoing: true nodeSelector: all()

应用配置:

kubectl apply -f /etc/kubeasz/clusters/default/config/calico-v3.24.yaml

5. Harbor高可用部署

5.1 准备MinIO存储

# 创建Harbor专用bucket mc mb minio/harbor-registry mc policy set public minio/harbor-registry

5.2 Helm安装Harbor

helm repo add harbor https://helm.goharbor.io helm install harbor harbor/harbor \ --namespace harbor \ --set persistence.enabled=true \ --set persistence.resourcePolicy="keep" \ --set externalURL=https://harbor.example.com \ --set persistence.imageChartStorage.type="s3" \ --set persistence.imageChartStorage.s3.region="us-east-1" \ --set persistence.imageChartStorage.s3.bucket="harbor-registry" \ --set persistence.imageChartStorage.s3.accesskey="minioadmin" \ --set persistence.imageChartStorage.s3.secretkey="minioadmin" \ --set persistence.imageChartStorage.s3.regionendpoint="http://minio:9000"

5.3 高可用验证

# 模拟节点故障 kubectl drain k8s-worker1 --ignore-daemonsets # 检查服务连续性 while true; do curl -I https://harbor.example.com/api/v2.0/systeminfo; sleep 1; done

6. 监控与运维

6.1 Prometheus监控配置

# harbor-service-monitor.yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: harbor namespace: monitoring spec: endpoints: - port: metrics interval: 15s namespaceSelector: matchNames: - harbor selector: matchLabels: app: harbor

6.2 备份策略

# 每日全量备份 0 2 * * * velero backup create harbor-backup-$(date +\%Y\%m\%d) \ --include-namespaces harbor --ttl 72h

7. 性能调优经验

  1. HAProxy调参:

    # 调整最大连接数 global maxconn 10000 tune.ssl.default-dh-param 2048 defaults timeout http-keep-alive 300s
  2. Calico优化:

    # 启用BBR拥塞控制 kubectl annotate node --all projectcalico.org/bpfEnabled="true"
  3. MinIO磁盘调度:

    echo 'ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"' > /etc/udev/rules.d/60-minio.rules

这套架构经过多个生产环境验证,在持续7x24小时运行中保持99.99%的可用性。关键点在于:

  • 负载均衡层与计算层完全解耦
  • 存储采用纠删码模式,单节点故障不影响数据完整性
  • 所有组件都有健康检查机制和自动恢复能力

实际部署时建议先进行压力测试,使用工具模拟并发镜像推送/拉取场景,根据硬件配置调整各组件参数。