Containers & Kubernetes

Comecei um curso incrível na Red Hat Academy sobre containers e Kubernetes. A primeira vez que tive contato com essa ferramenta foi no estágio e fiquei curiosa para saber mais sobre o assunto. Foi aí que chegou a oportunidade do curso e eu soube que era o momento certo. Então, resolvi postar um pouco do que estou aprendendo.
Primeiro olhar
Os aplicativos geralmente dependem de outras ferramentas fornecidas pelo ambiente de tempo de execução, tais como bibliotecas e arquivos de configuração. Tais dependências normalmente são instaladas como parte de um host físico ou uma máquina virtual e acabam por se emaranhar com as do ambiente. Dessa forma, o aplicativo pode sofrer danos quando o sistema operacional (SO) de base for atualizado ou corrigido, por exemplo.
Uma das formas de evitar este dano é que a pessoa desenvolvedora realize testes para garantir que as modificações no SO não irão afetar o aplicativo em execução no host, além de interroper o aplicativo antes da atualização das dependências. Por outro lado, essas medidas geram tempo de inatividade e tornam a manutenção complexa.
Diante deste cenário, os containers se tornam uma boa solução, uma vez que isolam os processos do restante do sistema. Além de exigirem menos recursos de hardware e terem inicialização e encerramento rápidos, fornecem seguraça, armazenamento e isolamento de rede e dos recursos de tempo de execução (incluindo as bibliotecas). Dessa forma, os containers aumentam a flexibilidade e a reusabilidade dos aplicativos de host.
Porém, uma desvantagem está relacionada aos aplicativos que acessam informação de hardware de baixo nível. Quando um aplicativo utiliza, por exemplo, memória ou dispositivos, o uso de containers pode não ser o mais ideal.
Open Container Initiative (OCI)
A OCI é um projeto que busca provomer o estabelecimento de especificações e de padrões sobre containers, para que, quando uma imagem for criada usando o padrão OCI, ela possa ser executada em qualquer mecanismo que esteja em conformidade com o OCI. O famoso Docker é um mecanismo de gerenciamento e execução de containers individuais.
Conceitos
Assim como máquinas virtuais são criadas a partir de templates, os containers são criados a partir de uma imagem. A construção do container acontece de forma declarativa, através da criação de um dockerfile ou containerfile, baseada em uma imagem. A imagem tem todas as dependências necessárias para executar um processo.
A imagem do container é composta por várias camadas (layers), que são montadas pelo container runtime e cada uma tem seu hash. Isso facilita, por exemplo, a troca de informações entre os containers, pois apenas as camadas que não estão naquele container serão baixadas pelo runtime. As imagens precisam estar disponíveis localmente e ficam armazenadas em repositórios.
Containers são efêmeros. Quando são destruídos, todos os dados são destruídos também. O banco de dados precisa de persistência e isso pode ser um problema. Se o banco de dados é crítico, é interessante que em produção não esteja um container.
Sobre os Namespaces é relevante saber que isolam recursos de sistema específicos, tornando-os visíveis apenas para seus membros. Já os Grupos de Controle são os mecanismos que a runtime impõe para limitar os recursos a serem utilizados pelo processo do container.
Kubernetes
O Kubernetes é um serviço de orquestração que simplifica a implantação, o gerenciamento e o dimensionamento de aplicativos conteinerizados.
Uma das vantagens de seu uso é a facilidade de comunicação entre os serviços, possibilitada pela atribuição de uma única entrada DNS para cada conjunto de containers. Dessa forma, o balanceamento da carga das solicitações leva em consideração a disponibilidade dos pods (o conjunto de um ou mais containers com recursos de armazenamento e endereço de IP que representam um único aplicativo).
Outro ponto positivo é que o usuário pode definir verificações de integridade para monitorar os containers em casos de falha. Além disso, os operadores usam a API do Kubernetes para, através do seu conhecimento do ciclo de vida do aplicativo, atualizar o estado do cluster.