keepalived 是轻量级单节点 vrrp 实现,不适用于大规模 vip 管理;应将其定位为执行层组件,由上层编排系统(如 ansible、consul、operator)负责调度与配置,keepalived 仅精确控制本机 vip 漂移、arp 响应及健康检查行为。

Keepalived 本身不是为“大规模虚拟 IP”设计的集中管理平台,它本质是一个轻量级、面向单节点高可用的 VRRP 实现。所谓“大规模”,比如成百上千个 VIP,或跨数十台节点动态分配 VIP,直接靠原生 Keepalived 配置文件硬编码是不可持续的——配置臃肿、难审计、易出错、无法灰度发布、缺乏状态可视性。真正可行的路径,是用 Keepalived 做底层 VIP 漂移执行器,把“管理”交给上层编排系统。
按角色分层:Keepalived 只负责“漂移”,不负责“调度”
在生产级大规模场景中,Keepalived 应被定位为“执行层组件”:
- Keepalived 管什么? —— 精确控制本机网卡上哪些 VIP 当前应存在、是否响应 ARP、如何参与 VRRP 选举、健康检查失败后是否让出 VIP。
- 谁来管 Keepalived? —— 是外部系统:如 Ansible/Terraform(批量生成配置)、Consul/etcd(服务发现+VIP 绑定决策)、Operator(Kubernetes 中自动注入 VIP 配置)、或自研 CMDB + 配置推送服务。
- 为什么不能全靠 keepalived.conf? —— 一个含 50 个 vrrp_instance 的配置文件已极难维护;若 VIP 数量达 200+,启动慢、reload 易失败、日志难以归因、故障时无法快速定位是哪个 instance 异常。
实用的大规模 VIP 分组策略
不追求“一个 Keepalived 实例管所有 VIP”,而是按业务维度合理切分:
- 按服务生命周期分组:长稳服务(如核心数据库代理 VIP)用独立 vrrp_instance;临时测试服务或灰度环境 VIP 单独一组,便于快速启停,不影响主干。
- 按网络平面分组:内网 VIP(10.0.0.0/8)、管理网 VIP(172.16.0.0/12)、DMZ 区 VIP(192.168.100.0/24)分别绑定到不同物理/逻辑网卡,每个网卡配专属 instance,避免单点网卡故障影响全部 VIP。
-
按故障域隔离:同一物理服务器上运行多个 VIP 时,确保它们所属的 vrrp_instance 设置不同的
virtual_router_id和unicast_peer列表,防止脑裂或误抢占。
配置自动化与热更新是刚需
手动编辑 /etc/keepalived/keepalived.conf 不适用于大规模:
- 用 Jinja2/Templates 生成配置:将 VIP 列表、网卡名、优先级、健康检查脚本路径等参数化,由 CI/CD 流水线渲染后推送到节点。
- 避免 full reload:Keepalived 支持
SIGHUP重载配置,但仅当语法正确且无冲突时才安全。建议每次只变更一个 instance 或一个网卡段的 VIP,配合 pre-check 脚本验证语法和地址冲突。 - 配置版本化:所有生成的 keepalived.conf 必须纳入 Git 管理,带 commit message 说明本次 VIP 变更原因(如“新增支付网关 VIP 10.20.30.100,关联 service-pay-v2”)。
监控与可观测性不能少
大规模下,你无法靠 ip addr 逐台查 VIP。必须建立统一视图:
- 采集每个节点的
keepalived进程状态、VIP 绑定情况(ip -br addr show)、VRRP 状态(kill -USR1 $(pidof keepalived)触发日志输出)。 - 对接 Prometheus:通过自定义 exporter 或 log parsing,暴露指标如
keepalived_vip_status{instance="node1",vip="10.20.30.100"}(1=active, 0=backup/absent)。 - 告警规则示例:连续 30 秒某 VIP 在预期 master 节点上未出现,或同一 VIP 同时出现在两个节点(脑裂),立即触发 PagerDuty。
本质上,Keepalived 大规模 VIP 管理的关键不在“怎么写更多 instance”,而在于“怎么让 instance 的生成、部署、校验、监控变成一条可重复、可审计、可回滚的流水线”。它考验的是工程化能力,不是配置技巧。











