1. Keepalived基础概念与核心价值
在分布式系统架构中,高可用性(High Availability)是工程师们永恒的追求。Keepalived作为一款轻量级的高可用解决方案,通过VRRP协议实现IP地址的自动漂移,确保服务在节点故障时无缝切换。我第一次在生产环境使用Keepalived是在2016年,当时我们需要为Nginx负载均衡器构建双机热备方案,这个经历让我深刻体会到它的稳定性和简洁之美。
Keepalived的核心工作原理其实非常巧妙——它通过多播通信(默认224.0.0.18)在集群节点间传递VRRP通告报文。每个节点都会根据优先级(priority)参与Master选举,优先级高的节点会成为Master并持有虚拟IP(VIP)。当Master节点不可达时,Backup节点会通过抢占或非抢占模式接管VIP。这种机制看似简单,但在实际部署时有许多细节需要注意,比如vrrp_script的健康检查配置、脑裂问题的预防等。
提示:VRRP协议默认使用112作为协议号,在实际网络环境中需要确保防火墙放行相关通信,这是许多初学者容易忽略的关键点。
2. 实验环境搭建与基础配置
2.1 实验拓扑设计
我们先规划一个典型的双节点Keepalived实验环境:
- 两台CentOS 7/8服务器(node1和node2)
- 虚拟IP(VIP)设置为192.168.1.100
- 每台服务器配置独立的业务IP(如node1:192.168.1.101, node2:192.168.1.102)
- 关闭SELinux和防火墙(生产环境需配置精确规则)
bash复制# 基础环境检查(所有节点执行)
ping -c 4 192.168.1.101
ping -c 4 192.168.1.102
arping -I eth0 -c 3 192.168.1.100
2.2 Keepalived安装与配置文件解析
在CentOS系统上安装Keepalived非常简单:
bash复制yum install -y keepalived
systemctl enable keepalived
主配置文件通常位于/etc/keepalived/keepalived.conf,其核心结构分为三部分:
conf复制global_defs {
router_id LVS_DEVEL # 节点标识符,建议使用主机名
}
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx" # 检查nginx进程是否存在
interval 2 # 检查间隔
weight -20 # 检查失败时优先级调整值
}
vrrp_instance VI_1 {
state MASTER # 初始状态
interface eth0 # 绑定的网卡
virtual_router_id 51 # 虚拟路由ID,集群内必须一致
priority 100 # 初始优先级(1-254)
advert_int 1 # 通告间隔(秒)
authentication {
auth_type PASS
auth_pass 1111 # 密码建议更复杂
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 label eth0:1
}
track_script {
chk_nginx # 关联健康检查脚本
}
}
3. 高级功能实现与排错指南
3.1 多VIP与多实例配置
在实际生产环境中,单VIP往往不能满足需求。Keepalived支持通过多个vrrp_instance实现多VIP管理:
conf复制vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.1.200/24 dev eth0 label eth0:2
}
}
3.2 常见故障排查方法
当Keepalived出现异常时,可按以下步骤排查:
- 检查日志:
bash复制journalctl -u keepalived -f --no-pager
- 验证VRRP通信:
bash复制tcpdump -i eth0 vrrp -n
- 手动触发主备切换:
bash复制systemctl stop keepalived # 在Master节点执行
- 检查IP地址绑定情况:
bash复制ip addr show eth0
注意:当遇到"脑裂"问题时(即两个节点都认为自己是Master),首先检查网络连通性,其次确认virtual_router_id是否冲突,最后检查防火墙规则是否阻止了VRRP通信。
4. 生产环境优化实践
4.1 安全加固措施
- 修改默认的VRRP组播地址(需所有节点一致):
conf复制global_defs {
vrrp_mcast_group4 224.0.0.188
}
- 使用更复杂的认证密码:
conf复制authentication {
auth_type AH
auth_pass "Zhy9@kLp$2!xQ5mN"
}
- 限制VRRP通信的源地址:
bash复制iptables -A INPUT -p vrrp -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p vrrp -j DROP
4.2 与LVS的集成方案
Keepalived最初是为LVS设计的,二者结合可以实现完整的高可用负载均衡方案:
conf复制virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.2.10 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
这种架构下,Keepalived既管理VIP漂移,又通过LVS实现流量分发,是许多大型网站的基础架构选择。
5. 容器化环境下的Keepalived部署
随着Kubernetes的普及,传统Keepalived部署方式也需要适应新环境。以下是使用DaemonSet在K8s中部署Keepalived的示例:
yaml复制apiVersion: apps/v1
kind: DaemonSet
metadata:
name: keepalived
spec:
selector:
matchLabels:
app: keepalived
template:
metadata:
labels:
app: keepalived
spec:
hostNetwork: true
containers:
- name: keepalived
image: osixia/keepalived:2.0.20
securityContext:
capabilities:
add: ["NET_ADMIN", "NET_BROADCAST", "NET_RAW"]
volumeMounts:
- name: config
mountPath: /container/service/keepalived/assets
env:
- name: KEEPALIVED_INTERFACE
value: "eth0"
- name: KEEPALIVED_VIRTUAL_IPS
value: "192.168.1.100/24"
- name: KEEPALIVED_UNICAST_PEERS
value: "192.168.1.101,192.168.1.102"
volumes:
- name: config
configMap:
name: keepalived-config
这种部署方式需要注意:
- 必须使用hostNetwork模式
- 需要赋予容器NET_ADMIN等网络权限
- 在云环境中可能需要禁用源/目的检查
我在实际项目中发现,容器化部署时特别容易遇到VRRP报文被过滤的问题。这时候可以通过在Keepalived配置中添加以下参数解决:
conf复制vrrp_instance VI_1 {
...
dont_track_primary
garp_master_refresh 60
garp_master_repeat 2
}
这些参数可以确保VIP变更时的GARP报文能正确发送,避免其他节点或交换机保留旧的ARP缓存。
