AWS VPC中keepalived高可用配置完整指南:辅助IP实现VIP漂移

核心摘要

  • 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 PeeringVGWTGW从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高可用架构部署过程中遇到账户或计费相关问题,欢迎了解我们的服务,让您专注于技术实现而非账务管理。

AWS账单代付

AWS/阿里云/谷歌云官方认证架构师,专注云计算解决方案。