在 EC2 中是否不能使用 keepalived

在 EC2 中是否不能使用 keepalived

问题是,如果我想使用,我的两个 EC2 实例(ha 代理)需要绑定一个虚拟 IP keepalived,但在 EC2 中这是不可能的,因为在给定时间内只有一个实例可以使用弹性 IP,所以这是不可能的,对吗?

答案1

不。无论如何,这就是 Elastic Load Balancer 的用途。

答案2

2021 年更新。您可以使用它。但您可能不应该。现在这样做的理由很少。弹性负载均衡器应该可以满足大多数人的需求。


接受的答案不再正确。

一般来说你应该使用 ELB。然而你可能会发现 ELB 无法满足某些罕见需求,你更愿意使用 keepalived,尽管这违背了最佳实践。

Keepalived 和 VRRP 在 Amazon VPC 内运行。它不适用于 ec2-classic。

使用 keepalived 时您可以使用notifynotify_master命令keepalived.conf

然后,通知脚本会调用aws cliwithdisassociate-addressassociate-addressoptions 来解除绑定,然后再绑定地址,而不是通过 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

欲了解更详细的信息和工作示例,请访问以下链接:

相关内容