Keepalived + LVS-DR 高可用与负载均衡实验

实验目标

  1. k1k2 上部署 Keepalived,实现 VIP 的高可用。

  2. rs1rs2 上部署 Httpd 服务,作为 LVS-DR 模式的后端真实服务器。

  3. 通过 client 测试 VIP 的高可用性和负载均衡功能。

实验环境准备

1. 节点信息

节点 角色 IP地址 说明
k1 Keepalived 主节点 172.25.254.20 负责管理 VIP 和 LVS
k2 Keepalived 备节点 172.25.254.30 负责接管 VIP 和 LVS
rs1 后端服务节点 172.25.254.40 提供 Httpd 服务
rs2 后端服务节点 172.25.254.50 提供 Httpd 服务
client 客户端 172.25.254.60 用于测试访问

2. 网络拓扑

  • 所有节点通过 ens160 网卡连接到同一局域网。

  • VIP 地址为 172.25.254.100(LVS-DR 模式下由 Keepalived 绑定)。

步骤一:系统初始化

1. 时间同步

复制代码
# 在所有节点上安装 chrony 并同步时间
sudo dnf install -y chrony
sudo systemctl enable --now chronyd
sudo chronyd -q

2. 关闭防火墙

复制代码
# 在所有节点上执行
sudo systemctl stop firewalld
sudo systemctl disable firewalld

3. 关闭 SELinux

复制代码
# 在所有节点上执行
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

4. 配置静态 IP

  • 根据节点角色配置静态 IP,确保所有节点在同一子网(172.25.254.0/24)。

  • 示例:

    k1的网络配置(其他节点类似):

    复制代码
    sudo nmcli connection modify ens160 ipv4.method manual ipv4.addresses 172.25.254.20/24
    sudo nmcli connection up ens160

步骤二:安装 Keepalived与ipvsadm

1. 安装 Keepalived

复制代码
# 在 k1 和 k2 上执行
sudo dnf install -y keepalived

2.安装ipvsadm

复制代码
# 在 k1 和 k2 上执行
sudo dnf install -y ipvsadm

步骤三:配置 Keepalived

1.配置文件结构

Keepalived 的配置文件 /etc/keepalived/keepalived.conf 由以下三部分组成:

global_defs { ... } # 全局配置

vrrp_instance VI_1 { ... } # VRRP 实例(高可用)

virtual_server VIP PORT { ... } # 负载均衡(LVS-DR)

2. 配置 k1(主节点)

2.1 全局配置(global_defs

复制代码
sudo vim /etc/keepalived/keepalived.conf

配置内容

复制代码
global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from keepalived@k1
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id k1
}

参数解释

  • notification_email: 故障时发送邮件的地址(可选,需配置 SMTP)。

  • notification_email_from: 发件人邮箱。

  • smtp_server: SMTP 服务器地址(本地默认即可)。

  • smtp_connect_timeout: SMTP 连接超时时间。

  • router_id: 当前节点的唯一标识符(建议与主机名一致)。


2.2 VRRP 实例配置(主节点)

复制代码
vrrp_instance VI_1 {
    state MASTER                 # 角色:主节点
    interface ens160               # 绑定的网卡(需与实际接口一致)
    virtual_router_id 51         # 虚拟路由器 ID(主备节点必须一致)
    priority 100                 # 优先级(主节点 > 备节点)
    advert_int 1                 # 心跳间隔(秒)
    authentication {
        auth_type PASS           # 认证类型(PASS 或 AH)
        auth_pass 1111           # 认证密码(主备节点必须一致)
    }
    virtual_ipaddress {
        172.25.254.100           # 虚拟 IP(VIP)
    }
}

关键参数说明

  • state: 主节点设为 MASTER,备节点设为 BACKUP

  • interface: 指定绑定 VIP 的网卡(使用 ip a 查看接口名称)。

  • virtual_router_id: 虚拟路由器 ID(主备节点必须相同,范围 0-255)。

  • priority: 优先级(主节点设为 100,备节点设为 80)。

  • advert_int: 心跳间隔(单位秒,建议保持默认 1 秒)。

  • authentication: 认证信息(主备节点必须完全一致)。

  • virtual_ipaddress: 虚拟 IP 地址(VIP)。

2.3 LVS-DR 负载均衡配置

复制代码
virtual_server 172.25.254.100 80 {
    delay_loop 6                 # 健康检查间隔(秒)
    lb_algo rr                   # 负载均衡算法(rr=轮询)
    lb_kind DR                   # 转发模式(DR=直接路由)
    protocol TCP                 # 协议(TCP/UDP)
​
    real_server 172.25.254.40 80 {
        weight 1                 # 权重(默认 1)
        TCP_CHECK {
            connect_timeout 3    # 连接超时时间(秒)
            retry 3       # 最大重试次数
            delay_before_retry 3 # 重试间隔(秒)
            connect_port 80      # 检查端口
        }
    }
​
    real_server 172.25.254.50 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

关键参数说明

  • virtual_server: 定义 VIP 和端口。

  • lb_algo: 负载均衡算法(rr=轮询,wrr=加权轮询,lc=最少连接)。

  • lb_kind: 转发模式(DR=直接路由,NAT=网络地址转换,TUN=隧道)。

  • real_server: 后端真实服务器 IP 和端口。

  • TCP_CHECK: 健康检查配置(确保后端服务正常)。


3. 修改 k2(备节点)配置文件

3.1 全局配置(global_defs

复制代码
sudo vim /etc/keepalived/keepalived.conf

配置内容

复制代码
global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from keepalived@k2
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id k2
}

差异说明

  • notification_email_from: 修改为主机名 k2

  • router_id: 修改为 k2


3.2 VRRP 实例配置(备节点)

复制代码
vrrp_instance VI_1 {
    state BACKUP                 # 角色:备节点
    interface ens160
    virtual_router_id 51         # 与主节点保持一致
    priority 80                  # 优先级低于主节点
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111           # 与主节点保持一致
    }
    virtual_ipaddress {
        172.25.254.100
    }
}

关键参数说明

  • state: 备节点设为 BACKUP

  • priority: 优先级设为 80(低于主节点的 100)。

4. 配置文件保存与验证

4.1保存配置文件

4.2语法检查

复制代码
sudo keepalived -t -f /etc/keepalived/keepalived.conf

如果输出无错误,表示配置文件语法正确。

5. 主备配置文件差异

  • Keepalived 的 VRRP 模块 负责管理 VIP 的高可用性(即主备节点切换),而 LVS 的虚拟服务器配置virtual_server)仅在主节点上生效。

  • 当主节点(k1)正常运行时,它会主动维护 LVS 的转发规则(通过 ipvsadm),并将 VIP 绑定到自身。

  • 当主节点故障时,备用节点(k2)会接管 VIP,此时 Keepalived 会自动同步主节点的 LVS 配置 (基于相同的 virtual_server 定义),无需手动在备用节点上重复配置。

步骤四:配置后端服务(rs1 和 rs2)

1. 安装 Httpd

复制代码
# 在 rs1 和 rs2 上执行
sudo dnf install -y httpd
sudo systemctl enable --now httpd

2. 修改 Httpd默认页面

复制代码
# 在 rs1 上执行
echo "This is rs1-172.25.254.40" | sudo tee /var/www/html/index.html
​
# 在 rs2 上执行
echo "This is rs2-172.25.254.50" | sudo tee /var/www/html/index.html

3. 配置 ARP 行为(LVS-DR 模式)

复制代码
# 在 rs1 和 rs2 上执行
sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
sudo sysctl -w net.ipv4.conf.all.arp_announce=2
sudo sysctl -w net.ipv4.conf.default.arp_ignore=1
sudo sysctl -w net.ipv4.conf.default.arp_announce=2
sudo sysctl -w net.ipv4.conf.lo.arp_ignore=1
sudo sysctl -w net.ipv4.conf.lo.arp_announce=2
​
# 持久化配置
echo "net.ipv4.conf.all.arp_ignore = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce = 2" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.arp_ignore = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.arp_announce = 2" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.arp_announce = 2" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_announce = 2" | sudo tee -a /etc/sysctl.conf

4. 添加 VIP 路由

复制代码
# 在 rs1 和 rs2 上执行
sudo ip addr add 172.25.254.100/32 dev lo

步骤五:启动服务并验证

1. 启动 Keepalived

复制代码
# 在 k1 和 k2 上执行
sudo systemctl enable --now keepalived

2. 验证 VIP 是否在 k1 上

复制代码
# 在 k1 上执行
ip a show ens160
# 预期输出: 172.25.254.100 应出现在 ens160 接口

3. 验证 LVS 转发规则

复制代码
# 在 k1 上执行
ipvsadm -L -n
# 预期输出: 显示 rs1 和 rs2 的 IP:Port

步骤六:测试高可用性

1. 模拟故障切换

  • 停止 k1 的 Keepalived 服务:

    复制代码
    sudo systemctl stop keepalived
  • 在 k2 上验证 VIP 是否接管:

    复制代码
    ip a show ens160
    # 预期输出: 172.25.254.100 应出现在 ens160 接口

2. 恢复 k1 服务

  • 重启 k1 的 Keepalived 服务:

    复制代码
    sudo systemctl start keepalived
  • 观察 VIP 是否自动切换回 k1(默认为抢占模式)。


步骤七:客户端测试

1. 访问 VIP

复制代码
# 在 client 上执行
curl http://172.25.254.100
# 预期输出: 轮询显示 "This is rs1-172.25.254.40" 或 "This is rs2-172.25.254.50"

2. 模拟后端服务故障

  • 停止 rs1 的 Nginx 服务:

    复制代码
    sudo systemctl stop httpd
  • 再次访问 VIP:

    复制代码
    curl http://172.25.254.100
    # 预期输出: 只显示 "This is rs2-172.25.254.50"

实验总结

  • 通过本实验,你已经实现了 Keepalived 的高可用和 LVS-DR 模式的负载均衡。

  • Keepalived 通过 VRRP 协议管理 VIP 的高可用性,确保主节点故障时 VIP 自动切换到备节点。

  • LVS-DR 模式通过直接路由转发请求到后端服务器,结合 Keepalived 的健康检查功能,实现了后端服务的故障隔离。