ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Kubernetes高可用集群架构与Keepalived+Haproxy实战

Kubernetes高可用集群架构与Keepalived+Haproxy实战

1. Kubernetes高可用集群架构解析

在传统单Master节点Kubernetes架构中,API Server作为整个集群的中枢神经系统,一旦发生故障将导致整个集群失联。我们采用Keepalived+Haproxy方案实现双活冗余,其核心设计理念可类比机场塔台系统:即使主塔台因故停用,备用塔台也能立即接管航空管制职能。

典型三节点拓扑中,两个负载均衡节点(LB1/LB2)运行Keepalived竞选VIP,获胜节点通过Haproxy将流量分发到三个Master节点的6443端口。这种设计带来三个关键优势:

  • 任一Master节点故障时,剩余节点仍可维持集群操作
  • 当主LB节点宕机,VIP在秒级自动迁移至备用LB
  • Haproxy的健康检查机制自动屏蔽异常Master节点

2. 基础环境准备与组件选型

2.1 硬件资源配置建议

节点类型CPU内存磁盘网络要求
负载均衡节点2核4GB50GB系统盘千兆网卡x2(心跳线专用)
Master节点4核8GB100GB+千兆网卡
Worker节点按需按需按需千兆网卡

关键提示:生产环境务必为LB节点配置独立心跳网络(使用第二块网卡),避免与业务流量竞争带宽导致脑裂问题。

2.2 关键组件版本匹配

  • Kubernetes: 1.24.x(较新版本已移除dockershim,需注意容器运行时选择)
  • Haproxy: 2.4.x(支持动态配置加载)
  • Keepalived: 2.2.x(稳定版VRRP实现)
  • OS: Rocky Linux 9.x(兼容RHEL生态且无订阅限制)

3. Keepalived深度配置实战

3.1 VRRP协议配置精要

# /etc/keepalived/keepalived.conf 主节点配置 vrrp_instance VI_1 { state MASTER interface eth0 # 监听网卡 virtual_router_id 51 # 集群唯一ID priority 100 # 选举权重 advert_int 1 # 心跳间隔 authentication { auth_type PASS auth_pass 5a1d-789x # 集群通信密码 } virtual_ipaddress { 192.168.1.100/24 dev eth0 # 对外VIP } }

关键参数解析:

  • virtual_router_id必须全集群一致,范围1-255
  • priority主节点建议100,备节点90,差值建议≥10
  • advert_int生产环境建议调至3秒,避免网络抖动误切换

3.2 脑裂防护机制

通过添加以下脚本检测实现双保险:

vrrp_script chk_haproxy { script "killall -0 haproxy" # 轻量级进程检查 interval 2 # 检测频率 weight -20 # 失败时降权值 }

4. Haproxy四层负载均衡配置

4.1 核心配置模板

# /etc/haproxy/haproxy.cfg global log /dev/log local0 maxconn 5000 user haproxy group haproxy defaults mode tcp timeout connect 5s timeout client 50s timeout server 50s frontend k8s-api bind *:6443 default_backend k8s-masters backend k8s-masters balance roundrobin option tcp-check server master1 192.168.1.101:6443 check fall 3 rise 2 server master2 192.168.1.102:6443 check fall 3 rise 2 server master3 192.168.1.103:6443 check fall 3 rise 2

4.2 健康检查优化策略

  • tcp-check:基础端口检测,消耗资源少但无法感知API Server假死
  • 进阶方案:添加HTTP健康检查端点
option httpchk GET /healthz http-check expect status 200

5. 系统调优与排错指南

5.1 内核参数调优

# /etc/sysctl.d/k8s.conf net.ipv4.ip_nonlocal_bind=1 # 允许绑定非本地IP net.ipv4.ip_forward=1 # 启用IP转发 net.ipv4.vs.conn_reuse_mode=0 # 防止TIME-WAIT问题 net.netfilter.nf_conntrack_max=1000000 # 增大连接跟踪表

5.2 常见故障排查

  1. VIP无法访问:
tcpdump -i eth0 vrrp # 检查VRRP通告报文 ip addr show eth0 # 确认VIP绑定状态
  1. Haproxy流量不均:
echo "show stat" | socat /var/run/haproxy/admin.sock stdio # 查看实时流量分布
  1. API Server间歇性超时:
ss -spt | grep 6443 # 检查连接状态统计 dmesg | grep "dropped" # 检查内核丢包记录

6. 生产环境验证方案

6.1 故障转移测试流程

  1. 模拟主LB宕机:
systemctl stop keepalived # 在主LB执行
  1. 观察VIP迁移:
watch -n 1 ip a # 在备LB查看VIP获取
  1. 验证集群功能:
kubectl get nodes --request-timeout=3s # 检查API响应

6.2 性能压测指标

使用kube-bench工具验证配置合规性:

docker run --rm --pid=host -v /etc:/etc:ro \ -v /var:/var:ro -t aquasec/kube-bench:latest master

建议达到的SLA指标:

  • 故障转移时间 < 5秒
  • API请求P99延迟 < 500ms
  • 最大并发连接数 > 5000
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进