Amazon-Ec2

在EC2中不能使用keepalived嗎

  • February 26, 2021

問題是如果我想使用我的兩個 EC2 實例(ha 代理)需要綁定一個虛擬 IP keepalived,但它們在 EC2 中是不可能的,因為在給定時間只有一個實例可以使用彈性 IP,所以它是不可能,對吧?

不,這就是 Elastic Load Balancer 的用途。

2021 年更新。您可以使用它。但你可能不應該。現在幾乎沒有理由這樣做。彈性負載均衡器應該可以完成大多數人需要的大部分工作。


接受的答案不再正確。

一般來說,您應該使用 ELB。但是,您可能會發現 ELB 無法滿足的罕見需求,並且您更願意使用 keepalived,即使它違反了最佳實踐。

Keepalived 和 VRRP 在 Amazon VPC 中工作。它不適用於 ec2-classic。

使用 keepalived,您可以notify使用.notify_master``keepalived.conf

notify 腳本然後呼叫aws cliwithdisassociate-addressassociate-address選項來解綁然後綁定地址,而不是通過 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

有關更多詳細資訊和工作範例,請訪問以下連結:

引用自:https://serverfault.com/questions/436039