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

HAProxy / Keepalived vrrp, настроенный в AWS EC2 с EIP (Basic EC2)

Я новичок в CentOS / Linux / HAProxy / Keepalived, поэтому за последние несколько дней мне пришлось многому научиться!

У меня есть 2 сервера CentOS 6.5 в Amazon AWS, работающие на собственных экземплярах EC2 Micro. У меня также настроен 1 эластичный IP-адрес. На каждом экземпляре установлено следующее:

Я установил и настроил HAProxy на обоих экземплярах. В целях тестирования я установил Apache для обслуживания базовой страницы index.html, чтобы я мог проверить, выполняет ли HAProxy задачу LB и циклический перебор работает нормально.

Я пытаюсь достичь, используя Keepalived для мониторинга процесса haproxy на LB1 (с назначенным EIP), если он выходит из строя или останавливается по какой-то причине, он вызывает скрипт, который использует инструменты API AWS EC2 для переназначения эластичного IP-адреса для второй Loadbalancer возьмет на себя управление ..

Я погуглил и просмотрел документацию, чтобы создать сценарий, который достигнет этого, однако, когда я тестирую его и служба HAProxy останавливается, он не запускает сценарий ..

LB1 - Содержание keepalived.conf

vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}

vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101
vrrp_unicast_bind 10.xx.xx.01 # The IP of the host this file is stored on
vrrp_unicast_peer 10.xx.xx.23 # The IP of the other host
advert_int 1
track_script {
chk_haproxy
}
notify_fault /etc/keepalived/vrrp.sh
}

Вывод из ведения журнала

Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Configuration is using : 60618 Bytes
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Using LinkWatch kernel netlink reflector...
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP sockpool: [ifindex(2), proto(112), fd(10,11)]
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Script(chk_haproxy) succeeded
Jun 18 12:03:12 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 18 12:03:13 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 18 12:03:19 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Script(chk_haproxy) failed

Мое первое впечатление, что он обнаружил сбой службы haproxy, но, похоже, не выполняет скрипт vrrp.sh. (содержание ниже)

#vrrp.sh
#!/bin/bash
cd $EC2_BASE/tools/bin
#DisAssociate EIP from this instance.
./ec2-disassociate-address  54.xx.xx.xx
#Mapping EIP to secondary server
./ec2-associate-address 54.xx.xx.xx -i [instance-id]

Если я запускаю сценарий vrrp.sh сам по себе на сервере, он выполняет команды и успешно переназначает EIP. Только не тогда, когда он вызывается из скрипта keepalived.conf.

Любые идеи!? Целый день чешу в затылке а ноутбук вот-вот вылетит в окно ..

В notify_fault скрипт вызывается, когда keepalived переходит в состояние неисправности.

Вы хотите настроить свой скрипт, используя

notify_master /etc/keepalived/vrrp.sh

Сначала, чтобы определить, выполняется сценарий или нет, я бы добавил следующую строку прямо под #!/bin/bash.

echo "----------vrrp.sh running ------" >> /var/log/messages 

или что-то еще, что вы хотите ... Просто для того, чтобы зарегистрировать тот факт, что приложение увидело переход "состояния" от резервного к главному или что-то еще и фактически выполнило сценарий, как задумано.

Вы также можете поместить его в конец скрипта, суть в том, чтобы просто убедиться, что скрипт был вызван.

Протестируйте еще раз, а затем cat /var/log/messages, и найдите свое эхо ... вы должны его увидеть, если вы этого не сделаете, это может быть любое количество вещей, разрешений, запущенная учетная запись пользователя, обеспечение исполняемого файла сценария и так далее ... вероятно, на основе Ваш первоначальный комментарий. Я подозреваю, что он просто выполняет не то, что вы ожидаете.

Итак, если вы видите свое эхо, как я ожидаю, тогда я бы посмотрел на конфигурацию вашей среды, что вы могли бы сделать, просто для тестирования, это экспортировать ваш JAVA_HOME вместе с вашими переменными EC2 в скрипт ... добавить их после только что добавленную строку эха. Очевидно, это только для целей тестирования, и как только вы убедитесь, что все работает должным образом, вам следует удалить это из сценария и соответствующим образом настроить среду. Мое последнее предложение - изменить вашу команду ... Вы можете разъединить и связать EIP с помощью одной команды.

Итак, теперь ваш сценарий будет выглядеть примерно так:

#!/bin/bash
#vrrp.sh

echo "----------vrrp.sh running ------" >> /var/log/messages

cd /usr/local/ec2/ec2-api-tools-1.7.5.1/bin/

export JAVA_HOME="/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/"

export EC2_BASE="/usr/local/ec2/ec2-api-tools-1.7.5.1/"
export EC2_URL=https://ec2.us-east-1.amazonaws.com
export AWS_ACCESS_KEY=AKIA3ROU5M3FQIQH4BNL
export AWS_SECRET_KEY=InBiqtOCfaJhCb3u3jE6gpmkW5shgjP8N++/7Huv

#Those are obviously not my access/secret keys, just providing an example

./ec2-associate-address -a eipalloc-s234523 -i i-023ksdfj --allow-reassociation

Заключительное примечание:

Убедитесь, что учетная запись пользователя IAM, с которой вы аутентифицируетесь, имеет необходимую политику учетной записи пользователя IAM ... ниже приведен пример политики, вам нужно будет перейти к политикам, чтобы создать ее, а затем после создания просто дошло до пользователей и конкретную учетную запись пользователя IAM, с которой вы аутентифицируетесь, и прикрепите только что созданную политику, если вы не используете учетную запись FULL ACCESS, и в этом случае я бы не рекомендовал этого. и настроить учетную запись пользователя IAM с политикой, изложенной ниже:

arn: aws: iam :: 107890181863: policy / MOVE-EIP или что-то еще.

{
"Version": "2015-1-1",
"Statement": [
    {
        "Action": [
            "ec2:AssociateAddress",
            "ec2:DescribeAddresses",
            "ec2:AllocateAddress",
            "ec2:DisassociateAddress"
        ],
        "Effect": "Allow",
        "Resource": "*"
    }
  ]
}

Не могли бы вы вставить файлы backup.conf и slave.conf?

Также вам следует проверить эти две статьи:

http://www.trk7.com/blog/keepalived-instance-not-entering-failed-state/ или http://comments.gmane.org/gmane.linux.keepalived.devel/4102 ?