Técnico

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.

configurando task dafinition

Ainda precisamos de uma opção para modificarmos alguns parâmetros abaixo.

configurando task definition

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.

configurando serviço

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.

configurando cluster

4º Review

review configurações ecs

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.

launch status

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.

ECS console

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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Compartilhe isso: