问题是,如果我想使用,我的两个 EC2 实例(ha 代理)需要绑定一个虚拟 IP keepalived
,但在 EC2 中这是不可能的,因为在给定时间内只有一个实例可以使用弹性 IP,所以这是不可能的,对吗?
答案1
不。无论如何,这就是 Elastic Load Balancer 的用途。
答案2
2021 年更新。您可以使用它。但您可能不应该。现在这样做的理由很少。弹性负载均衡器应该可以满足大多数人的需求。
接受的答案不再正确。
一般来说你应该使用 ELB。然而你可能会发现 ELB 无法满足某些罕见需求,你更愿意使用 keepalived,尽管这违背了最佳实践。
Keepalived 和 VRRP 在 Amazon VPC 内运行。它不适用于 ec2-classic。
使用 keepalived 时您可以使用notify
或notify_master
命令keepalived.conf
。
然后,通知脚本会调用aws cli
withdisassociate-address
和associate-address
options 来解除绑定,然后再绑定地址,而不是通过 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]*\)[a-z]*\$:\\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
欲了解更详细的信息和工作示例,请访问以下链接: