问题是我的两个EC2实例(HA代理)需要绑定一个虚拟IP,如果我想使用keepalived ,但它们在EC2中是不可能的,因为只有一个实例可以在给定的时间使用弹性IP,所以它是不可能的,对吧?
不,这是Elastic Load Balancer的作用。
被接受的答案不再是真实的。
一般来说,你应该使用ELB。 但是,您可能会发现ELB无法实现的罕见需求,即使违背了最佳实践,您仍然倾向于使用keepalived。
Keepalived和VRRP在Amazon VPC中运行。 它不适用于ec2-classic。
使用keepalived,您可以使用keepalived.conf中的notify或notify_master命令。
通知脚本然后调用具有disassociate-address和associate-address选项的aws cli来解除绑定,然后绑定该地址,而不是通过keepalived本身的VIP机制。 它工作正常。
这是一个示例通知脚本:
#!/bin/bash TYPE=$1 NAME=$2 STATE=$3 function die { echo "${1-Died} at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}." exit 1 } function master { # Check if an elastic IP is defined test -n "$EC2_EIP" || die 'elastic ip not defined' # Attempt to read the instance-id EC2_INSTANCE_ID="`wget -q -O - http://instance-data/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`" test -n "$EC2_INSTANCE_ID" || die 'cannot obtain instance-id' if [ -z $EC2_REGION ]; then # Get the region if not set EC2_AVAIL_ZONE=`wget -q -O - http://instance-data/latest/meta-data/placement/availability-zone` EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[az]*\$:\\1:'`" fi # Call into ec2. Make sure ec2 output echo "aws ec2 disassociate-address --public-ip $EC2_EIP --region=$EC2_REGION" /usr/bin/aws ec2 disassociate-address --public-ip $EC2_EIP --region=$EC2_REGION if [ $? -eq 0 ]; then echo "disassocate-address: success" fi; echo "aws ec2 associate-address --public-ip $EC2_EIP --instance-id $EC2_INSTANCE_ID --region=$EC2_REGION" /usr/bin/aws ec2 associate-address --public-ip $EC2_EIP --instance-id $EC2_INSTANCE_ID --region=$EC2_REGION if [ $? -eq 0 ]; then echo "associate-address: success" fi; } case $STATE in "MASTER") master exit 0 ;; "BACKUP") exit 0 ;; "FAULT") exit 0 ;; *) echo "unknown state" exit 1 ;; esac
有关更多详细信息和工作示例,请访问以下链接: