核心思路是分层解耦:Nginx负责四层或七层流量转发,Keepalived负责保障Nginx本身的高可用,两者共同为Kubernetes控制面(如kube-apiserver)或数据面(如ingress流量)提供稳定入口;Nginx仅作统一接入点,Keepalived仅通过VRRP漂移VIP,部署推荐独立LB节点以避免资源争抢,配置需协同健康检查与优先级防脑裂,并通过VIP切换、API连通性及日志抓包验证无感故障转移。

核心思路是分层解耦:Nginx 负责四层或七层流量转发,Keepalived 负责保障 Nginx 本身的高可用,两者共同为 Kubernetes 控制面(如 kube-apiserver)或数据面(如 ingress 流量)提供稳定入口。
明确角色分工
Nginx 不直接管理 Pod 或 Service,它只作为外部流量的统一接入点:
-
面向 API Server:配置
stream模块做 TCP 透传,将 VIP:6443 流量轮询或哈希分发到各 master 节点的 6443 端口; -
面向 Ingress 流量:配置
http或stream模块,将 VIP:80/443 流量转发至后端 nginx-ingress-controller 的 Pod IP 或 NodePort; - Keepalived 不接触业务逻辑,仅监控本机 Nginx 进程和网络连通性,通过 VRRP 协议在主备节点间漂移 VIP。
部署位置灵活但需隔离
不强制绑定 Master 节点,推荐独立部署在专用 LB 节点(如 lb01/lb02),好处明显:
- 避免与控制平面争抢资源,提升稳定性;
- 网络策略更清晰,防火墙、安全组只需放行 VIP 和 LB 节点;
- 升级或故障排查不影响 Kubernetes 核心组件运行;
- 若资源受限复用 Master,须确保 keepalived 不抢占 apiserver 所需端口(如 6443),且配置非抢占模式防脑裂。
关键配置协同要点
两个组件必须配合才能真正“无感切换”:
- Nginx 配置中启用
proxy_next_upstream(HTTP)或server ... max_fails=1 fail_timeout=10s(Stream),实现后端健康探测与自动摘除; - Keepalived 的
vrrp_script必须检查 Nginx 进程存活 + 端口监听状态(如killall -0 nginx && ss -tln | grep :6443),不能只依赖进程名; - 主备节点的
priority值需有足够差距(如 100 vs 90),并设置advert_int 1加快故障检测; - VIP 必须是集群内可路由的地址,且不能与任何物理接口 IP 冲突,建议提前在云平台或交换机预留。
验证与可观测性不可少
上线后必须验证切换行为是否符合预期:
- 手动停主节点 keepalived:
systemctl stop keepalived,观察 VIP 是否秒级出现在备节点ip a输出中; - 用
curl -k https://测试 API 可达性,确认连接未中断;:6443/version - 在 LB 节点抓包:
tcpdump -i any host,确认请求始终被当前 MASTER 节点处理; - 日志联动查看:
journalctl -u keepalived -n 50和tail -f /var/log/nginx/access.log对照时间戳与来源 IP。











