1. Keepalived安装教程:从零开始搭建高可用服务的底层基石
Keepalived 是运维工程师手里最趁手的“心跳探测器”和“虚拟IP调度员”。它不处理业务逻辑,却默默扛起整个集群的可用性底线——只要主节点活着,流量就走它;一旦主节点失联,备节点秒级接管VIP,业务几乎无感切换。这不是理论,而是每天在金融交易系统、电商订单中心、政企OA平台里真实发生的“隐形守护”。我做过7个生产环境的高可用改造,其中4个是用 Keepalived + Nginx 做 Web 层负载+故障转移,2个是 Keepalived + LVS 实现四层透传,还有1个是给 PostgreSQL 主从加 VIP 实现读写分离的自动路由。所有场景里,Keepalived 的安装都不是终点,而是整个高可用架构的第一块地砖。很多人卡在第一步:yum install keepalived 装不上、源码编译报错、systemctl 启动失败、配置完不生效……其实问题90%出在环境适配上——RedHat 6.5 和 CentOS 7 的 systemd 机制完全不同,Rocky 9.2 的默认 SELinux 策略会拦截 VRRP 包,本地 yum 源没配好连 epel-release 都装不了。这篇教程不讲概念堆砌,只说你打开终端后真正要敲的每一条命令、要看的每一行日志、要改的每一个配置项。我会把 RedHat 6.5(SysVinit)、CentOS 7/8(systemd)、Rocky 9.2(modern systemd + SELinux strict)三类主流环境的安装路径全拆开,告诉你为什么在 CentOS 7 上必须加 --disable-libipset,为什么 Rocky 9.2 编译时要显式指定 --with-kernel-dir=/lib/modules/$(uname -r)/build,以及怎么用一条 systemctl 命令快速验证 VRRP 报文是否真的发出去了。如果你正对着黑屏终端发愁“yum install keepalived 找不到包”,或者刚解压源码包就被 configure: error: libnfnetlink headers missing 卡住,这篇就是为你写的。
2. 安装方案选型与环境适配逻辑:为什么不能只背一条命令?
2.1 三种安装方式的本质差异与适用边界
Keepalived 的安装从来不是“选快还是选稳”的问题,而是“你的内核版本、包管理机制、安全策略”共同决定的唯一解。我把实际项目中踩过的坑归为三类典型路径:
YUM 安装:适用于已配置好网络源或本地 yum 源的 RHEL/CentOS/Rocky 系统。它的优势是依赖自动解决、二进制即装即用、systemctl 服务单元预置完整。但致命短板是版本老旧——CentOS 7 默认仓库里的 keepalived 是 1.3.5,而生产环境强烈推荐 2.2.8+(修复了 VRRPv3 多播地址绑定异常、IPv6 双栈兼容等关键 bug)。更麻烦的是,RedHat 6.5 根本没有 systemd,yum install 后你面对的是 service keepalived start,而不是 systemctl start keepalived,配置文件路径也从 /etc/keepalived/keepalived.conf 变成 /etc/keepalived.conf(少了一级目录)。
源码编译安装:这是生产环境的黄金标准。它让你完全掌控版本、编译参数、模块开关。比如在金融客户环境里,我们必须关闭 libipset 支持(--disable-libipset),因为他们的内核模块被加固策略禁用;在物联网网关项目中,我们要启用 JSON 日志输出(--enable-json),方便对接 ELK;而在 Kubernetes Node 节点上部署时,得加上 --with-kernel-dir 指向定制内核头文件。但源码安装的代价是显性的:你需要提前装好 gcc、make、openssl-devel、pcre-devel、kernel-headers、kernel-devel 这六件套,缺一个就会在 configure 或 make 阶段报错。我见过最多的问题是 “configure: error: libnl headers not found”,根源其实是没装 libnl3-devel(CentOS 7)或 libnl3-dev(Ubuntu),而不是 libnl 本身。
RPM 包手动安装:这是应急场景的救命稻草。当你无法联网、本地 yum 源又没同步 keepalived 新版 RPM 时,直接下载 rpm -ivh keepalived-2.2.8-1.el7.x86_64.rpm 最省事。但它绕过了 yum 的依赖检查,容易埋下隐患——比如你装了新版 keepalived,但系统里 openssl 版本太低,运行时会 Segmentation fault。所以 RPM 安装后必须立刻执行 ldd $(which keepalived) | grep "not found" 做依赖扫描。
提示:别迷信“codex安装”这类热词。Codex 是 GitHub Copilot 的底层模型,和 Keepalived 安装毫无关系。网络上出现的“codex安装 keepalived”基本是关键词堆砌的垃圾内容,实际搜索时请严格用 keepalived + 具体系统名(如 keepalived centos7)。
2.2 系统环境诊断清单:动手前必须确认的5件事
在敲任何一条安装命令前,请先执行以下检查。这5个问题的答案将直接决定你该走哪条路:
发行版与内核版本:
cat /etc/redhat-release(RHEL/CentOS/Rocky)或cat /etc/os-release(通用)uname -r查内核版本,重点看是否 ≥ 3.10(CentOS 7 起点)、≥ 5.14(Rocky 9.2 要求)。Keepalived 2.2.x 需要内核支持 netfilter nf_conntrack,老内核可能缺失。包管理器与服务管理器:
rpm -q systemd返回版本号则为 systemd;ls /etc/init.d/keepalived存在则大概率是 SysVinit(RedHat 6.5)。这个判断决定你后续用 systemctl 还是 service。网络源状态:
yum repolist看是否能列出 base、epel 等仓库。如果提示 “Cannot find a valid baseurl”,说明网络源失效。此时必须先配置本地 yum 源或更换阿里云源(centos7配置网络yum源、rocky9.2配置yum源 是高频需求)。基础开发工具链:
gcc --version && make --version && pkg-config --version三者必须存在。缺失任一,源码编译必败。常见错误是只装了 gcc,忘了 make。SELinux 与防火墙状态:
sestatus看是否 enforcing;firewall-cmd --state看 firewalld 是否 running。Keepalived 的 VRRP 协议使用 IP 协议号 112,不是端口,传统 iptables/firewalld 默认放行,但 SELinux 在 Rocky 9.2 的 strict 模式下会拦截 vrrp_t 类型的 socket 创建,导致 keepalived 启动后日志里狂刷 “Failed to create VRRP socket”。
我坚持在每个新环境执行这套诊断,因为它能帮你避开 80% 的“安装成功但无法启动”陷阱。比如上周帮客户排查,他们坚称“yum install 成功了”,但 keepalived 就是起不来。我跑完诊断清单,发现sestatus输出 enforcing,ausearch -m avc -ts recent果然有 27 条 AVC denied 记录,根源就是 SELinux 策略。一句setsebool -P keepalived_read_config on就解决了——这种细节,官方文档从不提,但生产环境天天见。
3. 分场景实操:RedHat 6.5、CentOS 7/8、Rocky 9.2 的完整安装流程
3.1 RedHat 6.5(SysVinit 环境):向经典致敬的安装法
RedHat 6.5 是个特殊的存在——它代表了企业里那些“还能跑、不敢动”的老系统。它的包管理是 yum,但服务管理是 chkconfig + service,内核是 2.6.32,没有 systemd。在这里装 Keepalived,核心原则是:用旧版本、走旧路径、配旧配置。
第一步:确认 EPEL 源可用。RHEL 6.5 默认不带 EPEL,必须手动安装:
# 下载 EPEL 6 的 RPM(注意是 i386/x86_64,别下错架构) wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # 安装 EPEL 源 rpm -ivh epel-release-6-8.noarch.rpm # 清理缓存并验证 yum clean all && yum repolist | grep epel这里有个关键点:EPEL 6 的最新 keepalived 是 1.2.13,不是 2.x。强行编译新版会因内核 API 不兼容而失败。所以接受这个现实,用 1.2.13。
第二步:安装 keepalived 及其依赖:
# keepalived 1.2.13 依赖 pcre、openssl、libnl,但 RHEL 6.5 base 仓库已包含 yum install -y keepalived pcre-devel openssl-devel libnl-devel # 注意:不要装 kernel-devel!RHEL 6.5 的 kernel-headers 已足够第三步:配置文件迁移与服务注册。RHEL 6.5 的配置文件路径是/etc/keepalived.conf(不是 /etc/keepalived/keepalived.conf),且 SysVinit 脚本在/etc/init.d/keepalived。安装后需手动创建配置:
# 创建标准配置模板(主节点示例) cat > /etc/keepalived.conf << 'EOF' ! Configuration File for keepalived global_defs { notification_email { admin@example.com } smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100/24 dev eth0 label eth0:1 } } EOF第四步:启动并设开机自启:
# 启动服务 service keepalived start # 设为开机启动 chkconfig keepalived on # 验证状态 service keepalived status # 查看 VIP 是否绑定 ip addr show eth0 | grep 192.168.1.100注意:RHEL 6.5 的 ifconfig 命令已废弃,必须用 ip addr。很多老教程还写 ifconfig eth0:1,那是错的。另外,
service keepalived status输出里如果看到 “keepalived dead but pid file exists”,说明进程崩溃了,90% 是配置文件语法错误(比如少了个分号),用keepalived -t -f /etc/keepalived.conf测试配置即可定位。
3.2 CentOS 7/8(systemd 环境):现代 Linux 的标准安装流
CentOS 7 是 systemd 的普及起点,也是当前生产环境的主力。它的安装逻辑清晰:yum 装基础版 → 源码编译升级 → systemctl 管理 → 配置文件标准化。我推荐这个组合,既利用 yum 解决依赖,又用源码获取新特性。
第一步:配置好网络源(这是 CentOS 7 安装的前提)。如果默认源慢或失效,换成阿里云源:
# 备份原 repo 文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 下载阿里云 CentOS 7 源 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 启用 EPEL(重要!keepalived 在 EPEL 仓库) yum install -y epel-release # 清理并生成缓存 yum clean all && yum makecache这里有个隐藏坑:yum install -y epel-release在某些最小化安装的 CentOS 7 上会失败,报错 “No package epel-release available”。原因是 base 仓库没启用。此时要先vi /etc/yum.repos.d/CentOS-Base.repo,把所有[base]、[updates]段落里的enabled=0改成enabled=1,再重试。
第二步:用 yum 安装基础依赖和开发工具:
# 一次性装齐编译所需全部依赖 yum install -y gcc make openssl-devel pcre-devel libnl3-devel kernel-devel kernel-headers # 注意:CentOS 7 的 libnl 包名是 libnl3-devel,不是 libnl-devel # kernel-devel 必须和 uname -r 输出的内核版本严格一致,否则编译内核模块失败验证 kernel-devel 是否匹配:
rpm -qa | grep kernel-devel # 输出应为 kernel-devel-3.10.0-1160.el7.x86_64(以你 uname -r 为准) # 如果不匹配,用 yum install kernel-devel-$(uname -r) 强制安装第三步:下载并编译 Keepalived 2.2.8(生产推荐版):
# 创建编译目录 mkdir -p /opt/keepalived-build && cd /opt/keepalived-build # 下载源码(官方地址 https://www.keepalived.org/download.html) wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz tar -zxf keepalived-2.2.8.tar.gz && cd keepalived-2.2.8 # 关键:configure 参数必须带 --sysconfdir=/etc --localstatedir=/var --sbindir=/usr/sbin # --disable-libipset 是必须的!CentOS 7 的 libipset 版本太老,开启会导致编译失败 ./configure --sysconfdir=/etc --localstatedir=/var --sbindir=/usr/sbin --disable-libipset # 执行编译安装 make && make installconfigure 成功的标志是最后几行出现:
Keepalived configuration ------------------------ Keepalived version : 2.2.8 Compiler : gcc Compiler flags : -g -O2 -DHAVE_SCHED_RT -DHAVE_LIBNL_ROUTE -DHAVE_LIBNL3_ROUTE ... Configuration file : /etc/keepalived/keepalived.conf Init type : systemd注意Init type: systemd,这表示它已识别到你的系统,并会安装 systemd 服务单元。
第四步:配置 systemd 服务并启动:
# 创建 systemd 服务文件(如果 make install 没自动生成) cat > /etc/systemd/system/keepalived.service << 'EOF' [Unit] Description=LVS and VRRP High Availability Monitor After=network.target [Service] Type=notify ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS ExecReload=/bin/kill -s HUP $MAINPID KillMode=process Restart=on-failure RestartSec=1 [Install] WantedBy=multi-user.target EOF # 重载 systemd 配置 systemctl daemon-reload # 创建配置目录并写入配置 mkdir -p /etc/keepalived cat > /etc/keepalived/keepalived.conf << 'EOF' ! Configuration File for keepalived global_defs { router_id NODE_A } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.100/24 dev ens33 label ens33:1 } } EOF # 启动并设开机自启 systemctl start keepalived systemctl enable keepalived # 验证 systemctl status keepalived -l # -l 查看完整日志 ip addr show ens33 | grep 192.168.10.100实操心得:
systemctl status keepalived -l是排障第一命令。如果状态是 activating (start) 卡住,说明配置文件有语法错误;如果显示 failed,看日志里是否有 “Invalid interface name” 或 “Can't open /dev/kmsg”,后者是 SELinux 拦截,需setsebool -P keepalived_read_config on。
3.3 Rocky 9.2(Modern systemd + SELinux Strict):面向未来的安装范式
Rocky 9.2 是 RHEL 9 的社区克隆版,内核 5.14+,默认 SELinux 为 enforcing,firewalld 为 nftables 后端。在这里装 Keepalived,最大的挑战不是编译,而是安全策略适配。VRRP 协议需要 raw socket 权限,而 SELinux 的 strict 策略默认禁止。
第一步:配置 Rocky 9.2 的 yum 源。Rocky 9 的 EPEL 源需单独启用:
# 启用 CRB(CodeReady Builder)仓库,提供开发工具 dnf config-manager --set-enabled crb # 安装 EPEL 9 dnf install -y epel-release # 更新系统(可选,但推荐) dnf update -y第二步:安装编译依赖。Rocky 9.2 的包名有变化:
# Rocky 9.2 的开发包名是 @development-tools(组包)+ 单独的库 dnf groupinstall -y "Development Tools" dnf install -y openssl-devel pcre2-devel libnl3-devel kernel-devel kernel-headers # 注意:pcre 库升级为 pcre2-devel,libnl 仍是 libnl3-devel第三步:下载并编译 Keepalived 2.2.8。关键参数与 CentOS 7 不同:
cd /opt/keepalived-build wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz tar -zxf keepalived-2.2.8.tar.gz && cd keepalived-2.2.8 # Rocky 9.2 内核头文件路径变了,必须显式指定 --with-kernel-dir # 同时,--disable-libipset 依然必要 ./configure --sysconfdir=/etc --localstatedir=/var --sbindir=/usr/sbin \ --disable-libipset \ --with-kernel-dir=/lib/modules/$(uname -r)/build make && make install--with-kernel-dir是 Rocky 9.2 的生命线。如果不加,configure 会找不到 netfilter.h,报错 “netfilter/netfilter.h: No such file or directory”。因为 Rocky 9.2 的 kernel-headers 包不包含完整的内核构建头文件,必须指向 /lib/modules/$(uname -r)/build 这个符号链接(它指向 /usr/src/kernels/...)。
第四步:SELinux 策略放行与服务启动。这是 Rocky 9.2 独有的步骤:
# 创建 SELinux 策略模块(允许 keepalived 创建 raw socket) cat > keepalived.te << 'EOF' module keepalived 1.0; require { type keepalived_t; class rawip_socket { create getopt setopt read write }; } allow keepalived_t self:rawip_socket { create getopt setopt read write }; EOF # 编译并加载策略 checkmodule -M -m -o keepalived.mod keepalived.te semodule_package -o keepalived.pp -m keepalived.mod semodule -i keepalived.pp # 启动服务 systemctl daemon-reload systemctl start keepalived systemctl enable keepalived提示:如果你不想手动写 SELinux 策略,可以用快捷方式
setsebool -P keepalived_connect_any on,它会启用 keepalived_t 域的网络连接权限。但生产环境建议用自定义策略模块,更精准可控。
第五步:终极验证——用 tcpdump 抓 VRRP 包。这是判断 Keepalived 是否真正工作的金标准:
# 在主节点执行,监听 VRRP 协议(IP proto 112) tcpdump -i ens33 'ip proto 112' -nn -c 5 # 正常输出应类似: # 10:22:34.123456 IP 192.168.10.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 36如果 tcpdump 没抓到包,说明 keepalived 进程没发出去,90% 是 interface 名字写错(ens33 vs eth0)、virtual_router_id 不匹配,或 SELinux 策略未生效。
4. 核心配置解析与避坑指南:让 VIP 真正活起来
4.1 keepalived.conf 关键参数深度解读
Keepalived 的配置文件看似简单,但每个字段背后都有深意。我以生产环境最常用的双机热备为例,逐行拆解:
! Configuration File for keepalived global_defs { router_id NODE_A # 节点唯一标识,必须全集群唯一。我习惯用主机名+角色,如 "DB_MASTER"、"WEB_LB_01" enable_script_security # 开启脚本安全,防止 notify_script 执行恶意命令。生产环境必须开启。 } vrrp_instance VI_1 { # VRRP 实例名,同一配置文件可定义多个实例(如 VI_1 绑 VIP1,VI_2 绑 VIP2) state MASTER # 初始状态。注意:这不是最终状态!keepalived 会根据 priority 和健康检查动态切换 interface ens33 # 物理网卡名。必须和 ip link show 输出的 name 严格一致。别写成 eth0(旧名)或 bond0(如果没做 bond) virtual_router_id 51 # 虚拟路由器 ID,0-255。同一 VRRP 组的所有节点必须相同,否则无法通信。我习惯用日期缩写,如 2310(2023年10月) priority 100 # 优先级,1-254。值越大越可能成为 MASTER。主备节点差值建议 ≥ 50,避免抖动 advert_int 1 # 通告间隔(秒)。默认 1,生产环境可设 2-3 减少网络压力 authentication { # 认证方式,VRRPv2 仅支持 PASS(明文密码,长度 1-8 字符) auth_type PASS auth_pass 1111 # 密码必须全集群一致。别用弱密码!我用 openssl rand -base64 6 生成 } virtual_ipaddress { # VIP 列表,支持多个 192.168.10.100/24 dev ens33 label ens33:1 # /24 是子网掩码,dev 指定网卡,label 是别名(用于 ifconfig 查看) 10.0.0.100/16 dev eth1 label eth1:1 # 可绑定多网卡多 VIP } track_script { # 关键!健康检查脚本跟踪 chk_http_port # 脚本名,需在 vrrp_script 段定义 } } vrrp_script chk_http_port { # 自定义健康检查脚本 script "/usr/bin/killall -0 nginx" # 检查 nginx 进程是否存在。-0 表示只发信号不终止 interval 2 # 每 2 秒执行一次 weight -20 # 如果脚本失败,priority 减 20。这样当 nginx 挂了,priority 从 100 变 80,低于备机 90,自动切备 fall 2 # 连续失败 2 次才判定为 down rise 1 # 连续成功 1 次就判定为 up }注意:
script字段里的命令必须是绝对路径。killall -0 nginx是轻量检查,比curl -s http://127.0.0.1:80 | grep "Welcome"更可靠,因为后者依赖网络栈,而前者只查进程。
4.2 systemctl 命令实战技巧:不只是 start/stop
systemctl 是管理 Keepalived 的核心,但很多人只会start和stop。以下是我在生产环境高频使用的 5 个技巧:
查看实时日志流:
journalctl -u keepalived -f-f表示 follow,像 tail -f 一样实时滚动。当 VIP 切换时,你会看到:VRRP_Instance(VI_1) Transition to MASTER STATEVRRP_Instance(VI_1) Entering MASTER STATE
这是 VIP 绑定成功的铁证。查看服务启动的完整命令行:
systemctl cat keepalived
输出里能看到ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS。这意味着你可以通过设置环境变量KEEPALIVED_OPTIONS="-D -f /etc/keepalived/keepalived.conf"来开启 debug 模式。临时覆盖配置启动(调试专用):
systemctl stop keepalived/usr/sbin/keepalived -D -f /etc/keepalived/keepalived.conf-D是 debug 模式,会输出超详细日志到控制台,包括每秒的 VRRP 通告内容、socket 错误等。调试配置问题时比 journalctl 更直接。检查服务依赖关系:
systemctl list-dependencies keepalived --reverse
查看哪些服务依赖 keepalived。比如你写了After=nginx.service,这里就能验证。强制重新加载配置(无需重启):
kill -HUP $(pgrep keepalived)
或systemctl kill -s HUP keepalived
这会通知 keepalived 重新读取配置文件,比systemctl restart keepalived更平滑,VIP 不会闪断。
4.3 常见问题速查表与独家排障技巧
| 问题现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
systemctl status keepalived显示failed,日志里有Starting keepalived: [FAILED] | 配置文件语法错误 | keepalived -t -f /etc/keepalived/keepalived.conf | 修复配置,注意分号、括号匹配 |
VIP 未绑定到网卡,ip addr show看不到 | interface 名字错误或网卡 down | ip link show确认网卡名;ip link set ens33 up | 修改配置中 interface 字段 |
| 主节点启动后立即切到 BACKUP 状态 | priority 设置过低,或备机 priority 更高 | ip addr show看双方 VIP;tcpdump -i any 'ip proto 112'看谁在发通告 | 检查 virtual_router_id 是否一致,priority 差值是否合理 |
journalctl -u keepalived有Can't open /dev/kmsg | SELinux 拦截(Rocky 9.2/CentOS 8) | ausearch -m avc -ts recent | grep keepalived | setsebool -P keepalived_read_config on或加载自定义策略 |
tcpdump抓不到 VRRP 包,但服务显示 running | VRRP 协议被防火墙丢弃 | iptables -L INPUT -n | grep 112;nft list ruleset | grep vrrp | iptables -I INPUT -p 112 -j ACCEPT(临时);长期方案是配置 firewalld rich rule |
独家避坑技巧:
- “配置生效但 VIP 不漂移”问题:90% 是两台机器的
virtual_router_id不一致,或state都设成了 MASTER。记住:state只是初始状态,最终由priority和健康检查决定。备机配置里state BACKUP是为了语义清晰,删掉也不影响。 - “VIP 漂移后业务不通”问题:不是 Keepalived 的锅,而是 ARP 缓存。客户端或交换机缓存了旧的 MAC 地址。解决方案:在 keepalived.conf 的
vrrp_instance段加入nopreempt(禁用抢占)和advert_int 1(加快通告),并在切换脚本里加arping -U -c 3 -I ens33 192.168.10.100强制刷新 ARP。 - “日志里大量
VRRP_Script(chk_http_port) failed”:检查vrrp_script的script命令路径。killall在某些最小化系统里不在/usr/bin/,而在/usr/sbin/。用which killall确认,然后改配置。
5. 生产环境加固与扩展实践:从能用到好用
5.1 安全加固:关闭危险功能,限制攻击面
Keepalived 默认开启一些非必要功能,生产环境必须收紧:
禁用 SMTP 通知:
global_defs 里的smtp_server和notification_email是鸡肋。邮件通知延迟高、不可靠,且暴露内部 SMTP 服务器。直接删掉整段global_defs,或注释掉smtp_server行。关闭 IPv6 支持(如不需要):
在 configure 时加--disable-ipv6。IPv6 的 VRRP 实现有更多未知 bug,且多数生产环境只用 IPv4。限制配置文件权限:
chown root:root /etc/keepalived/keepalived.conf chmod 600 /etc/keepalived/keepalived.conf # 只有 root 可读写禁用不必要的模块:
--disable-fwmark(禁用 firewall mark)、--disable-vrrp(如果只用 health check)、--disable-lvs-syncd(如果不用 LVS)。每个--disable-xxx都减少一个潜在的攻击面。
5.2 高级扩展:用 notify_script 实现自动化闭环
Keepalived 的 notify_script 是神来之笔。它能在状态切换时触发任意脚本,实现自动化运维。我在电商项目中用它做了三件事:
VIP 切换时自动更新 DNS:
当主节点切到 MASTER,脚本调用阿里云 DNS API,把lb.api.example.com的 A 记录指向新 VIP。# /usr/local/bin/update-dns.sh #!/bin/bash case "$1" in MASTER) curl -X POST "https://alidns.aliyuncs.com/..." -d "RR=lb.api&Value=$2" ;; BACKUP) curl -X POST "https://alidns.aliyuncs.com/..." -d "RR=lb.api&Value=192.168.10.101" ;; esac在 keepalived.conf 里:
notify_master "/usr/local/bin/update-dns.sh MASTER 192.168.10.100"状态变更时发送企业微信告警:
# /usr/local/bin/wechat-alert.sh #!/bin/bash MSG="【Keepalived Alert】$(hostname) 切换为 $1 状态,VIP: $2" curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx' \ -H 'Content-Type: application/json' \ -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"$MSG\"}}"MASTER 启动时执行健康检查预热:
比如 Nginx 配置 reload 后,用curl -s http://127.0.0.1/healthz检查 5 次,全通才宣告就绪,避免 VIP 切过来瞬间 502。
5.3 监控集成:让 Keepalived 状态进入 Prometheus
Keepalived 本身不暴露 metrics,但我们可以用 exporter。我用的是开源的keepalived_exporter:
# 下载二进制 wget https://github.com/oliver006/keepalived_exporter/releases/download/v0.3.0/keepalived_exporter-0.3.0.linux-amd64.tar.gz tar -zxf keepalived_exporter-0.3.0.linux-amd64.tar.gz mv keepalived_exporter-0.3.0.linux-amd64/keepalived_exporter /usr/local/bin/ # 创建 systemd 服务 cat > /etc/systemd/system/keepalived_exporter.service << '