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核 | 8GB | 100GB系统盘 | 双万兆网卡 |
| Master节点 | 8核 | 16GB | 100GB系统盘+500GB数据盘 | 双万兆网卡 |
| Worker节点 | 16核 | 32GB | 100GB系统盘+1TB数据盘 | 双万兆网卡 |
| MinIO存储节点 | 12核 | 32GB | 100GB系统盘+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 chronyd3. 负载均衡层部署
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 EOF3.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 903.3 服务验证
# 查看VIP归属 ip a show eth0 | grep 10.0.0.112 # 测试API访问 curl -k https://10.0.0.112:6443/version4. 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 wide4.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.yaml5. Harbor高可用部署
5.1 准备MinIO存储
# 创建Harbor专用bucket mc mb minio/harbor-registry mc policy set public minio/harbor-registry5.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; done6. 监控与运维
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: harbor6.2 备份策略
# 每日全量备份 0 2 * * * velero backup create harbor-backup-$(date +\%Y\%m\%d) \ --include-namespaces harbor --ttl 72h7. 性能调优经验
HAProxy调参:
# 调整最大连接数 global maxconn 10000 tune.ssl.default-dh-param 2048 defaults timeout http-keep-alive 300sCalico优化:
# 启用BBR拥塞控制 kubectl annotate node --all projectcalico.org/bpfEnabled="true"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%的可用性。关键点在于:
- 负载均衡层与计算层完全解耦
- 存储采用纠删码模式,单节点故障不影响数据完整性
- 所有组件都有健康检查机制和自动恢复能力
实际部署时建议先进行压力测试,使用工具模拟并发镜像推送/拉取场景,根据硬件配置调整各组件参数。