核心摘要
- AWS VPC作为软件定义网络不支持VRRP组播和免费ARP,需将keepalived配置为单播模式并通过AWS API实现VIP漂移
- 推荐使用辅助IP(Secondary IP)而非ENI弹性网卡实现VIP,操作更简单、API调用幂等、无需操作系统配合
- 完整方案涵盖IAM权限配置、安全组规则、keepalived脚本编写及故障切换验证,支持跨子网和公网服务扩展
AWS VPC中keepalived高可用配置完整指南:辅助IP实现VIP漂移
Keepalived是Linux环境中广泛应用的网络高可用组件,基于VRRP协议实现主备节点间的自动故障切换。在数据库集群、DNS服务器、网络防火墙等关键业务场景中,keepalived能够确保服务的持续可用性。然而,将keepalived部署到AWS VPC环境时,由于云网络与传统数据中心网络存在本质差异,需要针对性地调整配置策略。
在深入配置细节之前,建议优先评估AWS原生高可用服务是否能满足业务需求。Application Load Balancer (ALB)、Network Load Balancer (NLB)、Gateway Load Balancer (GWLB)以及基于Route 53的DNS故障切换方案,都能提供更高的可靠性和更简化的运维体验。只有当业务场景确实需要VRRP协议特性时,才建议采用keepalived方案。
AWS VPC网络特性与keepalived适配要点
VPC软件定义网络的核心差异
AWS VPC是完全的软件定义网络(SDN),其设计理念与传统物理网络有显著区别。理解这些差异对于正确配置keepalived至关重要:
- 路由机制:VPC内的IP转发完全依据子网路由表,每个路由表预置目标为VPC CIDR的本地路由且不可修改
- 广播限制:VPC不支持二层/三层广播,这直接影响VRRP协议的默认组播通信方式
- ARP代答:ARP请求由VPC网络代为响应,实际报文并未在网络内传递,这意味着免费ARP无法生效
VPC路由转发的三大原则
深入理解VPC路由行为对keepalived配置有直接影响:
原则1:子网路由表仅作用于出子网方向,对入方向流量不起作用。这一特性在设计跨子网高可用方案时尤为关键。
原则2:路由查找采用最长前缀匹配方式,与传统网络路由查找逻辑一致。
原则3:投递IP报文到VPC内网络接口时,除非另有路由配置,VPC仅投递到已分配的IP地址——包括ENI的主IP、辅助IP和委托前缀(Prefix Delegation)。目标地址不在已分配范围内的报文将被丢弃。
EC2网络接口的灵活性
EC2实例支持绑定多个弹性网络接口(ENI),每个ENI在所在子网分配一个主IP,生命周期与ENI相同且不可修改。此外,每个ENI可绑定多个辅助IP或委托前缀,这些地址支持动态绑定和解绑。需要注意的是,辅助IP和委托前缀不通过DHCP配置,需要在操作系统内部手动生效。
ENI绑定的约束条件包括:EC2实例可绑定不同子网、不同VPC的ENI,但必须位于相同可用区;辅助IP或前缀IP必须与该ENI的主IP位于同一子网。
VIP实现方案对比与选型建议
在VPC中实现keepalived的VIP,主要有两种技术路径:使用ENI主IP或使用辅助IP。经过对比分析,辅助IP方案在实际部署中具有明显优势:
ENI主IP方案的局限性
- ENI绑定/解绑涉及操作系统网卡热插拔,流程复杂且存在失败风险
- 必须先完成解绑才能执行绑定,操作顺序严格
- 并非所有操作系统都支持网卡热插拔,异常状态下可能无法响应热插拔事件
- 强制绑定/解绑API无法确保网卡在操作系统中正常工作
- 绑定/解绑操作不具有幂等性,重复操作会导致API调用失败
辅助IP方案的优势
- 单个API调用即可完成辅助IP的重新绑定,操作简洁
- 解绑/绑定API不依赖操作系统配合,即使系统异常也能完成切换
- 绑定操作具有幂等性,重复操作不会导致API失败
- 切换速度更快,对业务影响更小
基于以上分析,强烈推荐采用辅助IP方案实现keepalived的VIP漂移。
keepalived状态转换与VIP联动机制
keepalived支持在状态转换时执行自定义脚本,这为VIP漂移提供了触发机制。当节点成为VRRP master时,通过notify_master配置项调用VIP绑定脚本:
在脚本中使用AWS EC2 CLI命令实现VIP漂移,核心命令为aws ec2 assign-private-ip-addresses,配合–allow-reassignment参数可将VIP从原节点直接迁移到新master节点,无需先执行解绑操作。
完整部署流程详解
以下通过一个最小化环境演示keepalived在AWS VPC中的完整配置过程。环境包含两台EC2实例运行keepalived和nginx,另一台实例作为客户端验证VIP漂移效果。
注意:本文所有示例基于Amazon Linux 2023操作系统,其他发行版请根据实际情况调整命令。
环境准备与软件安装
启动两台t3.micro实例分别作为Master和Backup节点,确保两台实例位于同一子网。在两台实例上执行以下安装命令:
sudo dnf install -y keepalived
sudo dnf install -y awscli
sudo dnf install -y nginx
另启动一台t3.micro实例作为客户端,Amazon Linux 2023已预装curl,无需额外安装。
IAM权限配置
为keepalived实例配置操作辅助IP的权限,创建包含以下策略的IAM角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:AssignPrivateIpAddresses",
"ec2:UnassignPrivateIpAddresses"
],
"Resource": "*"
}
]
}
角色信任关系需包含EC2服务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
在AWS控制台为Master和Backup实例分别绑定该IAM角色。对于需要灵活管理多云环境的团队,可以参考多云账单代付解决方案简化跨平台的账户和权限管理流程。
安全组规则配置
keepalived节点间使用VRRP协议通信,IP协议号为112。推荐使用VPC的default安全组实现节点间无限制通信——该安全组包含一条入站规则,允许来自本安全组的所有流量,特别适用于集群节点间的相互通信。
为Master、Backup节点和客户端节点添加绑定default安全组,同时保留原有安全组。
VIP分配脚本创建
在两台keepalived实例上创建脚本目录和VIP切换脚本:
sudo mkdir -p /etc/keepalived/scripts
生成VIP切换脚本文件(需替换实际的VIP和ENI ID):
cat <<'EOF' | sudo tee /etc/keepalived/scripts/vip_master.sh
#!/bin/bash
VIP="10.0.1.100"
ENI_ID="eni-xxxxxxxxxxxxxxxxx" # 替换为本节点的ENI ID
REGION="ap-northeast-1" # 替换为实际区域
# 将VIP绑定到本节点
aws ec2 assign-private-ip-addresses \
--network-interface-id $ENI_ID \
--private-ip-addresses $VIP \
--allow-reassignment \
--region $REGION
# 在操作系统中配置VIP
ip addr add $VIP/32 dev ens5 2>/dev/null || true
EOF
赋予脚本可执行权限:
sudo chmod +x /etc/keepalived/scripts/vip_master.sh
重要:Master和Backup节点都需执行上述操作,并将ENI ID替换为各自节点的实际值。
keepalived配置文件
Master节点配置(/etc/keepalived/keepalived.conf):
vrrp_instance VI_1 {
state MASTER
interface ens5
virtual_router_id 51
priority 100
advert_int 1
unicast_src_ip 10.0.1.101 # Master节点IP
unicast_peer {
10.0.1.102 # Backup节点IP
}
authentication {
auth_type PASS
auth_pass your_password
}
notify_master "/etc/keepalived/scripts/vip_master.sh"
}
Backup节点配置:
vrrp_instance VI_1 {
state BACKUP
interface ens5
virtual_router_id 51
priority 90
advert_int 1
unicast_src_ip 10.0.1.102 # Backup节点IP
unicast_peer {
10.0.1.101 # Master节点IP
}
authentication {
auth_type PASS
auth_pass your_password
}
notify_master "/etc/keepalived/scripts/vip_master.sh"
}
在两个节点上启动服务:
sudo systemctl start keepalived
sudo systemctl enable keepalived
sudo systemctl start nginx
sudo systemctl enable nginx
VIP漂移验证
确认VIP初始绑定状态:在Master节点执行以下命令:
ip addr show ens5 | grep 10.0.1.100
预期输出:
inet 10.0.1.100/32 scope global ens5
创建测试页面:
Master节点:
echo "Hello from node 101" | sudo tee /usr/share/nginx/html/index.html
Backup节点:
echo "Hello from node 102" | sudo tee /usr/share/nginx/html/index.html
验证服务访问:在客户端节点执行:
curl 10.0.1.100
预期输出:Hello from node 101,表明VIP当前绑定在Master节点。
模拟故障切换:在Master节点停止keepalived服务:
sudo systemctl stop keepalived
再次从客户端访问VIP:
curl 10.0.1.100
预期输出:Hello from node 102,确认VIP已成功漂移到Backup节点。
扩展场景与进阶配置
跨子网部署方案
当keepalived集群节点位于同一可用区的不同子网时,由于辅助IP仅限同一子网内漂移,需要采用ENI方案:为所有集群节点在某个特定子网中关联弹性网络接口,然后修改keepalived配置使用该网络接口。
VPC外部访问支持
使用辅助IP作为VIP时,可通过VPC Peering、VGW或TGW从VPC外部访问。由于辅助IP由AWS VPC分配,在完成必要的网络路由配置后,无需针对VIP进行特殊路由配置。
公网服务配置
通过将Elastic IP关联到用于VIP的辅助IP,可实现keepalived集群对公网提供服务。辅助IP漂移时,Elastic IP会保持关联并同步漂移。需确保:keepalived节点位于公开子网;安全组入站规则允许相应服务访问。
跨可用区高可用
无论使用辅助IP还是ENI实现VIP,都要求集群节点位于同一可用区。如需跨可用区VIP漂移以实现更高级别可用性,可采用更新路由表的方式:在路由表中创建目的前缀为VIP、下一跳为keepalived master节点的路由条目。
实施要点与注意事项
- 网络接口命名:不同操作系统和实例类型的网络接口命名可能不同,配置前需确认实际接口名称
- API调用延迟:辅助IP绑定API调用通常在秒级完成,但在极端情况下可能存在延迟,建议在脚本中添加重试逻辑
- 健康检查配置:生产环境建议配置track_script实现应用层健康检查,而非仅依赖keepalived心跳
- 日志监控:配置keepalived日志输出并接入监控系统,便于故障排查和切换事件追踪
- 切换测试:上线前进行充分的故障切换测试,验证VIP漂移时间是否满足业务RTO要求
AWS/GCP/多云账单代付 – 免实名 & 支持 USDT 支付 | Payment 解决方案为企业提供便捷的多云账户管理服务。如果您在AWS VPC高可用架构部署过程中遇到账户或计费相关问题,欢迎了解我们的服务,让您专注于技术实现而非账务管理。