网关高可用架构设计与实践:多活部署与流量控制
2026/10/28 14:55:50
## 1. 项目背景与架构设计 在容器化技术普及的今天,企业级容器镜像仓库与Kubernetes集群的高可用部署已成为生产环境刚需。本次实施的Harbor+K8s高可用集群方案,采用独立负载均衡层(HAProxy+Keepalived)配合Calico网络插件,基于kubeasz工具实现快速部署。这套架构特别适合需要稳定运行容器化应用的中大型企业,能同时满足镜像管理、容器编排、存储分离等核心需求。 > 关键设计原则:每个组件都实现多节点冗余,且流量路径完全分离。这种"鸡蛋不放同一个篮子"的设计,避免了单点故障导致整个平台崩溃的风险。 ### 1.1 核心组件选型解析 **负载均衡层**: - HAProxy 2.6:支持四层(TCP)和七层(HTTP)代理,实测单节点可处理10万+并发连接 - Keepalived 2.2:实现VIP漂移,故障切换时间<3秒 **容器编排层**: - Kubernetes 1.28:采用kubeasz部署的二进制版本,相比kubeadm更易定制 - Calico 3.26:BGP模式实现Pod网络高性能通信,支持NetworkPolicy **存储层**: - MinIO 4节点集群:对象存储用于Harbor后端,EC编码实现数据冗余 - 本地NVMe缓存:热点镜像数据加速读取 **镜像仓库**: - Harbor 2.8:企业级镜像仓库,集成漏洞扫描和签名验证 ## 2. 基础环境准备 ### 2.1 服务器规划 | 角色 | 数量 | 配置示例 | IP范围 | 备注 | |---------------|------|-------------------|---------------|--------------------------| | K8s Master | 3 | 8C16G 500GB NVMe | 10.0.0.101-103| 复用ETCD和Control Plane | | K8s Worker | 2 | 16C32G 1TB NVMe | 10.0.0.104-105| 同时运行Harbor和HAProxy | | MinIO节点 | 4 | 12C24G 10TB HDD | 10.0.0.106-109| 每个节点挂载12块HDD | | 负载均衡VIP | - | - | 10.0.0.110-112| 分别对应K8s/Harbor/MinIO | ### 2.2 系统统一配置 #### 2.2.1 内核参数优化 ```bash # /etc/sysctl.d/99-k8s.conf # 连接追踪表大小 net.netfilter.nf_conntrack_max = 1048576 # 端口范围扩展 net.ipv4.ip_local_port_range = 1024 65535 # ARP缓存优化 net.ipv4.neigh.default.gc_thresh1 = 2048 net.ipv4.neigh.default.gc_thresh2 = 4096 net.ipv4.neigh.default.gc_thresh3 = 8192# /etc/security/limits.conf * soft nofile 1048576 * hard nofile 1048576 root soft nofile 1048576 root hard nofile 1048576| 特性 | 四层(TCP)模式 | 七层(HTTP)模式 |
|---|---|---|
| 适用场景 | K8s API | Harbor Web/MinIO Console |
| 性能损耗 | 约5% | 约15% |
| 会话保持 | 源IP哈希 | Cookie插入 |
| 健康检查 | TCP端口检测 | HTTP状态码校验 |
listen k8s-api-6443 bind 10.0.0.110:6443 mode tcp option tcplog balance leastconn # 适合长连接场景 server master1 10.0.0.101:6443 check inter 3s rise 2 fall 3 server master2 10.0.0.102:6443 check inter 3s rise 2 fall 3 server master3 10.0.0.103:6443 check inter 3s rise 2 fall 3生产环境建议:为K8s API单独配置2台物理负载均衡器,避免与业务流量竞争资源
#!/bin/bash # 新增API端点可用性检查 if ! curl -k -m2 https://127.0.0.1:6443/healthz &>/dev/null; then logger "K8s API health check failed" exit 1 fi| 方案 | 性能损耗 | 网络策略 | 适用规模 | 调试复杂度 |
|---|---|---|---|---|
| Calico BGP | 8% | 支持 | 大 | 高 |
| Flannel | 15% | 不支持 | 中 | 低 |
| Cilium | 5% | 支持 | 任意 | 中 |
最终选择Calico的原因:
# /etc/kubeasz/clusters/k8s-ha/config.yml kube_network_plugin: calico calico_network_backend: bird kube_proxy_mode: ipvs ipvs_scheduler: "wrr" # 加权轮询# 随机停止一个Master节点的kube-apiserver ssh master2 "docker stop k8s_kube-apiserver" # 观察服务恢复情况 watch -n1 kubectl get nodes预期现象:
用户上传镜像 -> Harbor -> MinIO集群(4节点) -> 按对象拆分为32个分片 -> 使用EC(8+4)编码存储 -> 分散在12块硬盘# harbor.yml storage_service: s3: chunksize: 16777216 # 从5MB调整为16MB multipartcopychunksize: 33554432 multipartcopymaxconcurrency: 20Prometheus -> K8s核心指标 -> Node Exporter -> MinIO集群指标 -> HAProxy统计 AlertManager -> 企业微信告警 -> 邮件通知 -> PagerDuty集成# minio.rules - alert: MinIONodeDown expr: minio_cluster_nodes_offline_total > 1 for: 5m labels: severity: critical annotations: summary: "MinIO节点宕机 (instance {{ $labels.instance }})" description: "超过1个MinIO节点不可用,当前值:{{ $value }}"证书更新:
# 批量更新K8s证书 kubeasz ezctl renew-cert k8s-ha all节点隔离:
kubectl cordon node-1 kubectl drain node-1 --ignore-daemonsetsAPI访问失败? ├─ 检查VIP是否漂移 (ip addr show) ├─ 检查HAProxy日志 (journalctl -u haproxy) └─ 测试后端直接连接 (curl -k https://master1:6443/healthz)| 场景 | 请求量 | 平均延迟 | 99分位 | 备注 |
|---|---|---|---|---|
| 镜像推送(单个1GB) | 50并发 | 12.3s | 15.8s | MinIO集群带宽饱和 |
| Pod创建(1000个Nginx) | 100并发 | 1.2s | 2.5s | etcd写入性能成为瓶颈 |
| API查询(/api/v1/pods) | 1000QPS | 23ms | 56ms | 开启API聚合缓存后 |
特别提醒:Keepalived的virtual_router_id必须在同一VLAN内唯一,曾经因重复配置导致VIP漂移失败