Escalando Docker Containers na AWS – Elastic Load Balancer e EC2 Container Service
Resolvi escrever esse post para compartilhar um pouco de como estamos mantendo e gerenciando containers na AWS (Amazon Web Services). E o assunto de hoje gira em torno de duas coisas: Elastic Load Balancer (ELB) e EC2 Container Service (ECS).
Conceito genérico Load Balancer
Então vamos começar a falar sobre o conceito genérico de Load Balancer. E para isso imagine que temos nossa aplicação rodando em uma única instância EC2:
Com uma única instância os usuários podem acessá-la diretamente. O problema é quando ocorre uma falha e todo nosso sistema vem abaixo. É ai que entram duas palavras do momento “escalabilidade” e “alta disponibilidade”, com isso temos múltiplas instâncias. Agora caso uma caia, basta servimos o tráfego a partir de outra.
Ainda não é o suficiente, como rotear as requisições para uma nova instância, ou até mesmo saber de sua existência? E a resposta para isso é exatamente onde quero chegar, ELB.
Usamos para distribuir automaticamente o tráfego de entrada das aplicações entre várias instâncias.
Resumindo, o LoadBalancer descobre uma nova instância iniciada através do Service Discovery, faz Health Check para verificar a quão saudável a aplicação se encontra. Com o resultado da verificação heatlhy, seu roteamento é iniciado.
Roteamento para dockers containers em EC2 Container Service (ECS)
Aqui estamos em outro ponto importante, ECS! Por enquanto, guardamos o conceito de ELB onde nos encontraremos mais tarde.
Usamos o ECS para iniciar e gerenciar containers docker em um cluster de EC2. Ok! Mas o que mais ele resolve pra nós? – Clusterização dos nossos recursos, Service Discovery, ELB, auto-restart de containers, auto-scale dos nossos serviços, etc.
A fim de exemplicar melhor, vamos iniciar uma instância através Amazon ECS Firt Run Wizard no qual faremos deploy de uma simples aplicação. Criaremos uma task definition, scheduling tasks e configurar um cluster.
1º Task Definition
Task Denifition, um arquivo de texto no formato JSON, descreve como deve ser inicializado um ou mais containers incluindo repositórios dockers e imagens, memória, CPU, variáveis de ambientes entre outros.
Ao criarmos uma Task Definition em The First Run Configuration é limitado por um container apenas por simplicidade.
Aqui selecionamos ECS sample appication task definition.
Ainda precisamos de uma opção para modificarmos alguns parâmetros abaixo.
2º Configurando um Serviço
Um serviço é um grupo de tasks que são criados e mantidos como instâncias de task definition.
Um serviço pode opcionalmente rodar atrás de um load balancer (este é o momento no qual cruzamos ECS com ELB) distribuindo tráfego através das tasks que são associadas ao serviço.
Agora vamos fornecer nome do serviço, número de tasks (containers) e configurações de Load Balancer.
3º Configurando um cluster
Este é o último passo para inicializar containers
Um cluster é um grupo lógico de EC2 no qual as tasks estão rodando. Hoje separamos nossos ambientes por cluster ex.: dev, homolog e prod.
Fornecemos nome para o cluster, tipo e número de instâncias.
4º Review
5º Click, inicialize instâncias e rode os serviços: Inicializará nossos cluster baseado nas configurações que fornecemos. Incluindo Cloud Formation, VPC e subnets, ELC e ECS security group, auto scaling group e launch configuration.
6º Click, “View Service”: Abaixo temos o Amazon ECS Console, onde podemos escalar instâncias do EC2 e containers, além de atualizar e criar novas tasks definition.
7º Aplicação rodando: Copie e cole no navegador o DNS a do load balancer setado no console.
Nos próximos posts sobre o assunto, pretendo falar sobre como fazemos deploy continuo utilizando ECS e CircleCI e como versionamos nossa infra com Cloud Formation.