Keepalived + LVS-DR 高可用与负载均衡实验
实验目标
在
k1
和k2
上部署 Keepalived,实现 VIP 的高可用。在
rs1
和rs2
上部署 Httpd 服务,作为 LVS-DR 模式的后端真实服务器。通过
client
测试 VIP 的高可用性和负载均衡功能。
实验环境准备
1. 节点信息
节点 | 角色 | IP地址 | 说明 |
---|---|---|---|
| Keepalived 主节点 |
| 负责管理 VIP 和 LVS |
| Keepalived 备节点 |
| 负责接管 VIP 和 LVS |
| 后端服务节点 |
| 提供 Httpd 服务 |
| 后端服务节点 |
| 提供 Httpd 服务 |
| 客户端 |
| 用于测试访问 |
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@k1smtp_server 127.0.0.1smtp_connect_timeout 30router_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 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3connect_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@k2smtp_server 127.0.0.1smtp_connect_timeout 30router_id k2
}
差异说明:
notification_email_from
: 修改为主机名k2
。router_id
: 修改为k2
。
3.2 VRRP 实例配置(备节点)
vrrp_instance VI_1 {state BACKUP # 角色:备节点interface ens160virtual_router_id 51 # 与主节点保持一致priority 80 # 优先级低于主节点advert_int 1authentication {auth_type PASSauth_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 的健康检查功能,实现了后端服务的故障隔离。