No artigo “Implantação de Microsserviços”, falamos sobre o processo de implantação de aplicações baseadas em microsserviços e, no artigo “Microsserviços: Patterns de Implantação”, apresentamos alguns patterns de implantação dos microsserviços no que diz respeito aos recursos utilizados (instâncias e hosts) e à frequência da implantação.
Neste post vamos falar especificamente da implantação de aplicações de microsserviços utilizando Contêineres. Para tanto, primeiramente, vamos entender o que é um contêiner.
“Os containers proporcionam uma maneira padrão de empacotar código, configurações e dependências de seu aplicativo em um único objeto. Eles compartilham um sistema operacional instalado no servidor e são executados como processos independentes, com recursos isolados. Isso permite fazer implantações rápidas, confiáveis e consistentes, independentemente do ambiente.”
Descrição AWS
De certa forma, os contêineres se comportam como máquinas virtuais, que não tem a necessidade de replicar um sistema operacional inteiro, apenas os componentes individuais de que precisam para operar, proporcionando assim, um aumento significativo no desempenho e na redução do uso de recursos. Um único servidor pode executar vários contêineres simultaneamente.
Nessa abordagem de implantação cada microsserviço executa em seu próprio contêiner (por exemplo, o Docker, que é o software de contêiner mais popular do mercado) e, se necessário, é possível limitar os recursos de memória e CPU do contêiner. Então, o processo de empacotamento implica, de forma geral, em empacotar cada microsserviço como uma imagem de contêiner. Em tempo de execução, o microsserviço consistirá em um ou mais contêineres instanciados a partir dessa imagem.
Existem gerenciadores de aplicações baseadas em contêineres (como Kubernetes), que controlam clusters de servidores e são capazes de administrar essas múltiplas instâncias de contêineres, decidindo onde executar cada contêiner de acordo com os recursos de que ele necessita, a partir dos recursos disponibilizados por cada servidor do cluster.
Benefícios e Desvantagens
A implantação de microsserviços como contêineres apresenta vários benefícios como:
- Independência entre as aplicações e a infraestrutura;
- Os recursos de cada instância podem ser restringidos de acordo com a necessidade;
- O contêiner é uma tecnologia leve, rápida de ser construída e de ser inicializada;
- Isola as instâncias dos microsserviços;
- Encapsula os detalhes tecnológicos de implementação de cada microsserviço;
- A API exposta pelo contêiner pode ser a própria API do microsserviço.
Em contrapartida, podemos citar as seguintes desvantagens da implantação com contêineres:
- Não é uma tecnologia tão madura, embora isso esteja mudando rapidamente;
- Pode não ser tão segura, pois compartilha o sistema operacional de cada servidor entre todos os contêineres que rodam nele;
- Na prática, exige o uso de um orquestrador de contêineres, como o Kubernetes (ou versões proprietárias dos provedores de nuvem, como o Google Container Engine ou o Amazon Elastic Container Service);
Considerações Finais
Nesse post apresentamos como empacotar uma aplicação em uma imagem de contêiner, e como executar múltiplas instâncias dessa aplicação. Embora seja um processo bem simples de seguir, algumas considerações precisam ser levadas em conta, como o fato de uma ferramenta como o Docker ser capaz de fornecer mecanismos básicos de gerenciamento, mas não possuir nenhum suporte para o caso de, por exemplo, um servidor parar de funcionar.
Além disso, sabemos que, embora os microsserviços sejam autônomos, eles não existem de forma isolada e precisam interagir com outros microsserviços e recursos. Desta forma, é importante que a implantação desses microsserviços seja realizada de forma confiável, juntamente com suas dependências, e que essa implantação seja tratada como uma unidade. Para isso, é fundamental a utilização de um framework de orquestração de contêineres, como por exemplo o Kubernetes, que é capaz de transformar um conjunto de servidores em um pool de recursos.