找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5091

积分

0

好友

709

主题
发表于 2 小时前 | 查看: 3| 回复: 0

Keepalived 是一个基于 C 语言编写的路由软件,其主要目标是为 Linux 系统及基于 Linux 的基础设施提供简单而健壮的负载均衡和高可用性功能。其负载均衡框架依赖于著名的 Linux 虚拟服务器(IPVS)内核模块,实现第四层负载均衡。同时,它还能根据后端服务器的健康状况,动态地维护和管理负载均衡的服务器池。而其高可用性功能,则是通过 VRRP 协议 实现的,该协议是路由器故障转移的基石。

在实际生产环境中,如何有效配置和管理 Keepalived,是保障服务连续性的关键。本文将结合实战经验,分享一套从基础配置、主备切换优化到 运维 脚本和 Docker 化部署的完整实践方案。

01 基础配置

清晰、模块化的配置文件是稳定运行的前提。

1.1 主配置文件

保持主配置文件的简洁,通过 include 指令引入具体的业务配置。

$ cat <<EOF | tee /etc/keepalived/keepalived.conf > /dev/null
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server localhost
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

include /etc/keepalived/keepalived-test.conf
EOF

提示:使用 include 引入其他配置文件,能让主配置文件尽可能保持干净。

1.2 业务配置文件(主要)

这是定义 VRRP 实例和虚拟 IP(VIP)的核心配置。

$ cat <<EOF | tee /etc/keepalived/keepalived-test.conf > /dev/null
vrrp_instance test {
# 集群的角色(MASTER, BACKUP)
    state MASTER
# 网卡名称
    interface bond0.4009
# 虚拟路由ID,同网段避免冲突
    virtual_router_id 18
# 权重
    priority 100
# VRRP广播间隔(以秒为单位)
    advert_int 1
# 本机IP地址
    unicast_src_ip x.x.x.x
# keepalived集群其他IP地址
    unicast_peer {
        x.x.x.x
        x.x.x.x
    }
# keepalived集群认证信息
    authentication {
        auth_type PASS
        auth_pass 1111
    }
# VIP地址
    virtual_ipaddress {
        x.x.x.x
    }
}
EOF

提示:生产环境建议尽可能使用 Keepalived 的单播模式,配置上 unicast_src_ipunicast_peer 参数即可。

1.3 docker-compose 启动文件

使用 Docker 容器化部署,便于环境一致性和快速迁移。

$ cat <<EOF | tee /etc/keepalived/docker-compose.yml > /dev/null
services:
  keepalived:
    container_name: keepalived
    image: core.jiaxzeng.com/jiaxzeng/keepalived:2.3.4
    restart: always
    network_mode: host
    volumes:
    - .:/etc/keepalived
    cap_add:
    - NET_ADMIN
    - NET_BROADCAST
    - NET_RAW
EOF

1.4 启动 keepalived 服务

使用 Docker Compose 启动服务。

$ docker-compose up -d
[+] Running 1/1
 ✔ Container keepalived  Started

$ docker-compose ps
NAME         IMAGE              COMMAND                  SERVICE      CREATED         STATUS         PORTS
keepalived   keepalived:2.3.4   "/opt/keepalived/sbi…"   keepalived   5 seconds ago   Up 5 seconds

02 配置主备切换 VIP

VIP 的切换是 Keepalived 高可用能力的直接体现。

2.1 手工切换

在 Keepalived 主节点(即当前 VIP 所在节点)执行,停止或重启 Keepalived 服务都可以触发 VIP 切换。

$ docker-compose down
[+] Running 1/1
 ✔ Container keepalived  Removed

$ docker-compose restart
[+] Restarting 1/1
 ✔ Container keepalived  Started

2.2 自动切换

此场景通常是为本机某个无状态服务(如 Nginx、HAProxy)提供高可用,确保 VIP 漂移到任何节点,服务都能正常访问。下面以 HAProxy 为例。

提示:本示例是为 HAProxy 服务提供高可用。

1. 创建检查 HAProxy 状态脚本

$ cat /etc/keepalived/chk_haproxy.sh
#!/bin/bash

curl localhost:8405/metrics &> /dev/null

if [ $? -eq 0 ]; then
exit 0
else
exit 255
fi

2. Keepalived 业务配置文件添加 VRRP 健康检查脚本配置

vrrp_script haproxy {
  script /etc/keepalived/chk_haproxy.sh # 必须要绝对路径
  user root # 脚本的用户
  interval 1 # 执行脚本间隔,默认是1
  fall 5 # 转换fail状态所需次数,脚本退出状态码不为0
  rise 3 # 转换success所需次数,脚本退出状态码为0
  weight -10 # 将状态转换fail时,vrrp实例权重加该权重
}

3. Keepalived 业务配置文件 VRRP 实例添加健康检查脚本

vrrp_instance haproxy {
# 上述的基础配置内容
  ...
# vrrp实例添加上检测脚本,实现自动切换VIP
  track_script {
    haproxy # vrrp_script名称
  }
}

03 进阶配置

这些优化配置能帮助你在更复杂的网络环境下保持稳定。

3.1 优化 Gratuitous ARPs 配置

原理:默认情况下,Keepalived 切换 VIP 地址后,会广播两次 gratuitous ARP 数据包,通知二层网络中的所有主机更新 ARP 表。

极端情况:在 VIP 地址切换瞬间,若网络繁忙导致 gratuitous ARP 数据包丢包,可能会导致客户端访问 VIP 地址异常,但 ping VIP 地址却正常。这种情况在云上环境中真实遇到过。

优化方案

  • 调大两次 gratuitous ARP 数据包的广播间隔(默认为 1 秒)。
  • 开启持续发送 gratuitous ARP 数据包广播。
# 全局生效
global_defs {
# 转换MASTER后,第1,2次发送gratuitous ARP包个数。默认: 5个
  vrrp_garp_master_repeat 3
# 转换MASTER后,第1次发送gratuitous ARP包与第2次间隔时长。默认: 5s
  vrrp_garp_master_delay 10
# 定期发送vrrp间隔。默认:0s(转换MASTER,除了发送两次gratuitous ARP后。不再定期发送gratuitous ARP包)
  vrrp_garp_master_refresh 60
}

# 特定vrrp实例
vrrp_instance 实例名 {
# 转换MASTER后,第1,2次发送gratuitous ARP包个数
  garp_master_repeat 3
# 转换MASTER后,第1次发送gratuitous ARP包与第2次间隔时长
  garp_master_delay 10
# 定期发送vrrp间隔。默认:0s(转换MASTER,除了发送两次gratuitous ARP后。不再定期发送gratuitous ARP包)
  garp_master_refresh 60
}

抓包分析验证
为了验证上述配置是否生效,我们可以进行 网络抓包 分析。

Wireshark免费ARP数据包抓包截图

提示:在 Wireshark 中,可以通过过滤器 arp.isgratuitous 来过滤出 free arp 数据包。

3.2 LVS 配置

如果你同时使用 Keepalived 的负载均衡功能,可以参考以下 LVS 配置示例。

virtual_server VIP地址 端口 {
# 用于检查器轮询的延迟计时器,默认60s
    delay_loop 60
# LVS调度
    lvs_sched rr
# LVS转发方法,默认NAT
    lvs_method DR
# L4协议
    protocol TCP

# 真实服务器条目【tcp检查】
    real_server 172.139.20.121 31919 {
# 真实服务器权重,默认是1
        weight 1
# 当健康检查器检测到故障时,将权重设置为0
        inhibit_on_failure
# tcp检查是没有参数
        TCP_CHECK {}
    }

# 真实服务器条目【http_get检查】
    real_server 172.139.20.176 31919 {
        weight 1
        inhibit_on_failure
# http_get检查参数
        HTTP_GET {
# http协议版本,默认1.1
            http_protocol 1.1
            url {
# 请求路径
                path /ping
# 健康检查摘要
# 示例:genhash -s 172.139.20.176 -p 31919 -u /ping
# digest f0a687a32fb5f06a7253e259126fe05a
                status_code 200-299
            }
        }
    }
}

提示http_get 健康检查可以选择使用 digeststatus_code 作为判断依据。推荐使用 status_code

如果没有 genhash 命令,可以手动创建一个软链接。

$ ln -s /usr/local/sbin/keepalived /usr/local/bin/genhash

04 终极武器(tcpdump)

当出现问题时,抓包是定位问题最直接的手段。

4.1 心跳检测

抓取 VRRP 协议的心跳包,检查主备节点间通信是否正常。

sudo tcpdump -i any -enn vrrp

命令解析

  • -i any: 抓取所有网卡的流量
  • -enn: 显示 MAC 地址且不解析主机名
  • vrrp:过滤 VRRP 协议的流量。

4.2 免费 ARP

抓取 gratuitous ARP 包,验证 VIP 切换后是否正常发送了 ARP 通告。

sudo tcpdump -i any -enn 'arp and arp[14:4] == arp[24:4]'

命令解析

  • -i any: 抓取所有网卡的流量
  • -enn: 显示 MAC 地址且不解析主机名
  • 'arp and arp[14:4] == arp[24:4]': 抓取 ARP 协议中,源 IP 地址与目标 IP 地址相同的数据包,即 gratuitous ARP 数据包。

05 附录:Dockerfile

最后,附上用于构建 Keepalived 镜像的 Dockerfile,方便你进行自定义。

FROM ubuntu:24.04 AS build

ARG VERSION=2.3.4

RUN sed -ri 's/(archive|ports).ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources && \
  apt-get update && apt-get install -y curl gcc make libssl-dev libnfnetlink-dev libnl-genl-3-dev libnl-3-dev

RUN curl -O https://keepalived.org/software/keepalived-${VERSION}.tar.gz && \
  tar xf keepalived-${VERSION}.tar.gz && cd keepalived-${VERSION} && ./configure && make && make install

FROM ubuntu:24.04 AS keepalived

LABEL author=jiaxzeng

COPY --from=build /usr/local/sbin/keepalived /usr/local/sbin/keepalived

RUN sed -ri 's/(archive|ports).ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources && \
  apt-get update && apt-get upgrade -y && apt-get install -y curl libnfnetlink-dev libnl-genl-3-dev libnl-3-dev && \
  apt-get -y clean autoclean && rm -rf /var/lib/apt /var/cache/apt /var/log/apt /var/log/dpkg.log

WORKDIR /etc/keepalived

ENTRYPOINT ["/usr/local/sbin/keepalived"]

CMD ["--dont-fork", "--log-console", "--log-detail", "--dump-conf"]

希望这份结合了生产环境经验的 Keepalived 配置指南,能帮助你构建更稳定可靠的高可用服务。如果在实践中遇到其他问题,也欢迎到 云栈社区 与大家一起探讨。

起飞




上一篇:Grafana 监控平台从入门到实践:基于 K8s 与 Helm 的企业级部署与配置指南
下一篇:AI竞品分析模板实战指南:3种方法快速生成专业报告
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-11 07:57 , Processed in 0.585145 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表