Назад | Перейти на главную страницу

Невозможно использовать keepalived в EC2

Проблема в том, что два моих экземпляра EC2 (ha proxy) должны привязать один виртуальный IP-адрес, если я хочу использовать keepalived, но они невозможны в EC2, поскольку только один экземпляр может использовать эластичный IP-адрес в данный момент времени, поэтому это невозможно, верно?

Обновление 2020 года. Можете использовать. Но не стоит. Для этого нет оснований. Elastic Load Balancer может делать большую часть того, что вам сейчас нужно.


Принятый ответ больше не соответствует действительности.

В общем, вам следует использовать ELB. Однако вы можете обнаружить редкую потребность, которую не может удовлетворить ELB, и вы предпочтете использовать keepalived, даже если это противоречит передовой практике.

Keepalived и VRRP работают в Amazon VPC. Не работает с ec2-classic.

С keepalived вы используете notify или notify_master команды в keepalived.conf.

Затем сценарий уведомления вызывает aws cli с участием disassociate-address и associate-address варианты отвязки, а затем привязки адреса, а не через механизм VIP самого keepalived. Работает нормально.

Вот пример скрипта уведомления:

#!/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

Для получения более подробной информации и рабочих примеров посетите следующие ссылки:

Нет. Во всяком случае, для этого и предназначен Elastic Load Balancer.