Imagine que você ou a sua equipe de desenvolvimento conclui aquela aplicação que vem trabalhando a meses. Onde foi investido conhecimento, dinheiro e um dos recursos que não pode ter de volta, o tempo.
Depois desse processo todo, são feitos testes localmente onde a aplicação comporta-se lindamente, então decide-se colocá-la em produção (na nuvem). Escolhe-se onde hospedar o aplicativo e tudo mais e depois de subir a aplicação, por algum motivo, ela não corre!
Neste artigo, vamos ver como resolvemos esse problema e conhecer ou saber mais sobre Docker e Kubernetes. Antes, precisamos entender um pouco sobre containers.
O que são Containers?
Podemos entender containers como um ambiente num servidor com os requisitos necessários para correr um programa. Imagine que você só queira um ambiente para correr a sua aplicação, então um container seria como se fosse um contentor dentro de um navio (o servidor), onde o contentor estaria equipado com todos os recursos necessários para manter a mercadoria em perfeitas condições para a viagem. Neste caso a mercadoria seria a sua aplicação, o ambiente seria tudo o que precisaria para correr a sua aplicação e a viagem seria o processo de manter a aplicação disponível.
“Um container seria como se fosse um contentor dentro de um navio (o servidor), onde o contentor estaria equipado com todos os recursos necessários para manter a mercadoria em perfeitas condições para a viagem.“
O que é Docker?
Para que possamos criar esse ambiente que roda a nossa aplicação, precisamos de um sistema de conteinerização (para criar e gerir contentores).
Docker é exactamente isso, um sistema de conteinerização e com ele podemos construir imagens. Uma imagem Docker, é um ficheiro contendo algumas configurações para construir um container (o contentor).
“Docker é um sistema de conteinerização com o qual podemos construir imagens, que são ficheiros com configurações para construir um container (o contentor).“
Pense numa imagem como um disco de instalação da nossa aplicação, a diferença é que o próprio “disco” vai criar um “ambiente” para ele rodar, sem precisar rodar diretamente na máquina.
Daí que, podemos criar uma aplicação usando NodeJs por exemplo e “empacotar” dentro de uma imagem Docker, onde o estado em que a aplicação se encontrava no momento da construção da imagem será gravado dentro da imagem. Caso você tenha criado uma imagem enquanto a aplicação tinha algum erro, ao rodar o container, você terá o mesmo erro.
O Docker tem um repositório de imagens chamado Docker hub, onde depois de criar uma imagem da sua aplicação, você faz uma publicação para o repositório, onde a sua imagem pode ser pública ou privada.
Convém salientar que o Docker não é a única solução de conteinerização e tem alguns concorrentes como o Podman, LXD, ContainerD, etc.
Kubernetes
Agora imagine que tenhamos uma arquitetura de micro serviços, contendo vários containers a rodar, em que precisamos gerenciar todos esses containers, controlar quanto de memória um container pode consumir, escalabilidade, etc. Isso tudo chamamos de orquestração de containers.
“Kubernetes ou K8s, vem do latim que significa timoneiro ou piloto e é um orquestrador de containers.“
A palavra Kubernetes ou K8s (Oito letras entre K e S), vem do latim que significa timoneiro ou piloto.
Basicamente Kubernetes é um orquestrador de containers. Para correr os nossos containers, o kubernetes agrupa-os dentro do menor objeto chamado Pod. Os pods por sua vez correm em Nodes, que podem ser máquinas físicas ou virtuais. Com o Kubernetes podemos ter mais de uma instância da nossa aplicação a correr (réplicas), agrupar os nossos objectos kubernetes em namespaces, etc.
Com base nesta descrição é evidente que ele se complementa bem com o Docker e são duas das ferramentas essenciais para desenhar e sustentar sistemas distribuídos.
Existem outros orquestradores e concorrentes do Kubernetes como Docker Swarm e o Apache Mesos, embora hoje em dia o K8s seja cada vez mais a norma no que toca à gestão de containers.
São inúmeras as suas vantagens, especialmente recorrendo a serviços de K8s gerenciado pelas plataformas cloud como Amazon EKS, Google GKE, Azure AKS ou DigitalOcean DOKS (apenas para enumerar alguns), mas deixamos este tema para outro artigo.
Apesar de ter uma curva de aprendizagem muito extensa devido à sua complexidade, a sua utilização acaba trazendo muitos benefícios, especialmente se o seu contexto exige correr diversas aplicações conteinerizadas. Mas antes de escolher adoptar esta combinação deve efectuar uma análise profunda dos seus requisitos de modo a compreender se esta escolha não poderá sobrecarregar a sua equipa e retirar alguma agilidade e rapidez de desenvolvimento, mais ainda se o objectivo é ter um rápido go-to-market.
Na VOID optámos por utilizar sistemas distribuídos com base em containers geridos por Kubernetes para o desenvolvimento dos nossos produtos. Esta escolha justifica-se pela estratégia de médio prazo, especialmente por questões de escalabilidade e pela facilidade de integração com outros sistemas. É algo que nos distingue de outras startups e empresas de tecnologia e é sobretudo uma das ferramentas que nos faz estar na vanguarda da inovação em Moçambique.