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核 | 4GB | 50GB系统盘 | 千兆网卡x2(心跳线专用) |
| Master节点 | 4核 | 8GB | 100GB+ | 千兆网卡 |
| 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-255priority主节点建议100,备节点90,差值建议≥10advert_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 24.2 健康检查优化策略
tcp-check:基础端口检测,消耗资源少但无法感知API Server假死- 进阶方案:添加HTTP健康检查端点
option httpchk GET /healthz http-check expect status 2005. 系统调优与排错指南
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 常见故障排查
- VIP无法访问:
tcpdump -i eth0 vrrp # 检查VRRP通告报文 ip addr show eth0 # 确认VIP绑定状态- Haproxy流量不均:
echo "show stat" | socat /var/run/haproxy/admin.sock stdio # 查看实时流量分布- API Server间歇性超时:
ss -spt | grep 6443 # 检查连接状态统计 dmesg | grep "dropped" # 检查内核丢包记录6. 生产环境验证方案
6.1 故障转移测试流程
- 模拟主LB宕机:
systemctl stop keepalived # 在主LB执行- 观察VIP迁移:
watch -n 1 ip a # 在备LB查看VIP获取- 验证集群功能:
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