HAProxy / Keepalived vrrp configurado no AWS EC2 com EIP (Basic EC2)

2

Sou novato no CentOS / Linux / HAProxy / Keepalived, então tive muito a aprender nos últimos dias!

Eu tenho 2 servidores CentOS 6.5 no Amazon AWS rodando em suas próprias instâncias do EC2 Micro. Eu também tenho 1 Elastic IP configurado. Cada instância tem o seguinte instalado:

  • Ferramentas da API do Amazon EC2
  • HAProxy
  • Mantido em atividade
  • Apache / httpd
  • Java OpenJDK 1.6

Eu tenho o HAProxy instalado e configurado em ambas as instâncias. Para fins de teste, instalei o Apache para servir uma página index.html básica, para que eu pudesse testar se o HAProxy estava realizando a tarefa LB e o round robin está funcionando bem.

O que estou tentando alcançar é usar o Keepalived para monitorar o processo haproxy no LB1 (o EIP atribuído), se ele falhar ou parar por algum motivo, chama um script que usa as ferramentas da API do AWS EC2 para reatribuir um Elastic IP para o segundo Loadbalancer para assumir ..

Eu pesquisei e olhei para a documentação para criar um script que alcança isso, no entanto, quando eu testo e o serviço HAProxy é interrompido, ele não executa o script.

LB1 - Conteúdo de 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
}

Saída do registo do registo

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

Minha primeira impressão é que ele detectou a falha do serviço haproxy, mas parece que não executa o script vrrp.sh. (conteúdos abaixo)

#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]

Se eu executar o script vrrp.sh sozinho no servidor, ele executará os comandos e atribuirá novamente o EIP com êxito. Só não quando é chamado pelo script keepalived.conf.

Alguma idéia? Eu estive coçando a cabeça o dia todo e o laptop está prestes a ser lançado pela janela.

    
por rosey85uk 18.06.2014 / 16:42

3 respostas

1

O script notify_fault é invocado quando keepalived entra no estado de falha.

Você quer configurar seu script usando

notify_master /etc/keepalived/vrrp.sh
    
por 19.06.2014 / 10:41
0

Você pode colar seus arquivos backup.conf e slave.conf?

Além disso, você deve verificar estes dois artigos:

link ou link ?

    
por 06.08.2014 / 21:06
0

Primeiro, para determinar se o script está ou não em execução, adicionarei a seguinte linha diretamente abaixo de #!/bin/bash .

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

ou qualquer coisa que você quiser ... Apenas para registrar o fato de que o aplicativo viu a transição "state" do backup para o master ou o que quer que seja e, de fato, executou o script como pretendido.

Você pode colocá-lo no final do script, o importante é garantir que o script seja chamado.

Teste-o novamente e, em seguida, cat /var/log/messages , e procure pelo seu eco ... você deve vê-lo, se não o fizer, pode haver várias coisas, permissões, conta de usuário em execução, garantir script executável, e assim por diante ... provavelmente com base no seu comentário inicial, eu suspeito que ele está executando, simplesmente não está fazendo o que você espera.

Então, se você ver o seu eco, como eu esperava, então eu olharia a configuração do seu ambiente, o que você poderia fazer, apenas para testar, é exportar o JAVA_HOME junto com as variáveis do EC2 no script ... adicione-os após a linha de eco que você acabou de adicionar. Obviamente, isso é apenas para fins de teste e, depois de confirmar que tudo está funcionando conforme o esperado, você deve removê-lo do script e configurar seu ambiente apropriadamente. Minha sugestão final aqui é mudar seu comando ... Você pode desassociar e associar o EIP em um único comando.

Então agora seu script será parecido com isto:

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

Nota final:

Certifique-se de que a conta de usuário do IAM com a qual você está se autenticando tenha a política de conta de usuário do IAM anexada ... um exemplo de política é o seguinte: você precisará ir até as políticas para criá-la. os usuários e a conta de usuário do IAM específica com a qual você está se autenticando e anexa a política que você acabou de criar, a menos que você esteja usando uma conta FULL ACCESS; nesse caso, eu recomendaria isso. e para configurar uma conta de usuário do IAM com a política descrita abaixo:

arn: aws: iam :: 107890181863: política / MOVE-EIP ou qualquer outra coisa.

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