Kubernetes! O sistema operacional dos containers | Linux Place
Kubernetes é a buzzword do momento. Se você esteve envolvido em TI nos últimos dois anos já ouviu falar desta plataforma usada na orquestração de containers. Mas, por que de repente esse projeto da Google virou a sensação do verão? A resposta passa por entender porque containers e microsserviços são a grande novidade do gerenciamento de recursos de TI da atualidade.
Quem já participou de algum projeto de tecnologia vivenciou problemas de manutenção de aplicativos. Para a operação, em projetos curtos, pode não sobrar tempo para pensar em todos os padrões de segurança ou boas práticas de configuração. Nos projetos já estabelecidos existe a dificuldade de manutenção do legado em face à novas versões de sistemas operacionais, bibliotecas etc. Cada atualização de segurança ou de boas práticas requer atenção redobrada para garantia de que tudo vai funcionar em conjunto.
Do lado dos desenvolvedores há pressão para lançar novas funcionalidades cada vez mais rápido e com menor número de pessoas. Nesse ambiente, manter a suíte de desenvolvimento atualizada com as mais recentes bibliotecas, iniciar ambientes de novas tecnologias e manter boas práticas de configuração são trabalhos que levam UM tempo precioso que poderia estar sendo usado para codificar.
Com o advento das aplicações em microsserviços esse dilema se tornou maior. Se antes era necessário manter duas ou três aplicações, agora elas podem chegar a centenas, escritas nas mais variadas linguagens, diferentes frameworks e protocolos.
Containers em cena
Os containers nasceram da necessidade de padronização e portabilidade de aplicações. Apesar de utilizar estruturas dos sistemas que em alguns casos remetem a década de 80, foi agora que a necessidade e a possibilidade do uso da nuvem tornou essa alternativa possível e interessante. O desenvolvimento dos containers teve foco não só no gerenciamento do ciclo de vida do aplicativo, com entregas rápidas, garantia de configuração padronizada, facilitando a vida do pessoal operacional, mas também com forte apelo de simplicidade para o desenvolvedor.
A entrega de aplicativos vem evoluindo com intuito de diminuir o trabalho manual e consequentemente o tempo total. De manuais de instalação com vários passos a serem executados por humanos, passamos por instaladores que guiam o usuário entre opções pré-configuradas, scripts que permitem automação da instalação sem a intervenção do usuário, depois gerenciadores de configuração que controlam o ciclo de vida dos aplicativos até chegarmos aos containers.
Containers encapsulam toda a inteligência de instalação, integração de bibliotecas, inicialização, monitoramento, e atualizações de um aplicativo em um pacote único, portável e de fácil entrega nos sistemas a serem executados. Com o simples comando docker run é possível baixar, instalar e colocar em execução um aplicativo sem se preocupar com dependências, configurações ou compatibilidade com o sistema corrente. São perfeitos para aplicações em microsserviço pois, como todo o ciclo de gerência dos pequenos softwares autocontidos de uma forma padronizada, os desenvolvedores podem se focar em produzir código e contar com um sistema de integração que garanta a compatibilidade do software produzido em seus desktops com os servidores de produção.
As características citadas levaram a uma proliferação dos containers, mas gerenciar esses pacotes tornou-se uma questão a ser resolvida. Containers são diferentes das aplicações tradicionais que se instalam, se configuram nos sistemas operacionais e contam com formas maduras de gerenciamento do ciclo de vida. Para gerenciar esses blocos de software autocontidos utilizamos softwares chamados orquestradores.
Mas afinal, o que é Kubernetes?
Kubernetes é a plataforma de código aberto para orquestração de container desenvolvida pelo Google. Entre as opções de orquestração que se apresentaram no mercado, o K8S (abreviação de Kubernetes K 8 letras S) se tornou a mais difundida e possui uma das mais vibrantes comunidades de desenvolvimento de software código aberto da atualidade.
Gestão completa dos ciclo de vida: gerencia todo o ciclo de vida dos containers desde sua obtenção dos repositórios, implantação nos nós do cluster, monitoramento da saúde, reinício em caso de falhas e término em caso de necessidade;
Portável: o Kubernetes cria uma camada que isola a infraestrutura computacional de onde quer que ele esteja sendo utilizado. Dessa forma, permite que aplicações sejam portáveis entre ambientes on-premises e diferentes nuvens como GCP, AWS, e Azure, implementando o tão sonhado write once run anyware;
Forte integração com os serviços de nuvem: o Kubernetes permite isolar a complexidade das infraestruturas dos provedores permitindo o gerenciamento padronizado através dele;
Padrão de fato: disponível como serviço nos maiores provedores de nuvem, é possível iniciar a execução de um cluster em pouco tempo e acelerar a adoção de um modelo moderno de desenvolvimento;
Boa relação custo-benefício: com controle fino dos recursos computacionais de memória de CPU e disco, o Kubernetes consegue aumentar o adensamento das cargas de trabalho, garantindo sempre que o mínimo de máquinas esteja em execução de forma automática;
Comunidade ativa: milhares de aplicações já estão sendo pensadas para o ambiente Kubernetes e novas funcionalidades são adicionadas a cada momento.
Construído para operar sobre um grupo de máquinas trabalhando em conjunto, o Kubernetes possui dois tipos de nós, os Controllers e os Workers.
Os Controllers, responsáveis pelo plano de controle do cluster, são compostos pelo seguintes componentes:
ETCD: banco de dados chave valor distribuído, responsável pela persistência de todos os dados do cluster;
API Server: API central do sistema, responsável por integrar todos os componentes
Controllers Manager: gerenciadores responsáveis por garantir que o estado do cluster seja mantido;
Scheduler: agendador responsável por definir em qual nó os containers devem ser executados.
Os workers são responsáveis por efetivamente executar os containers de aplicação. São compostos pelos seguintes componentes:
Kubelet: faz a comunicação com a API, informa os recursos disponíveis e os em execução e iniciação de containers;
Container Runtime: camada de execução dos containers;
Kube-Proxy: responsável pela rede do Kubernetes.
A unidade mínima de execução no Kubernetes é o pod. O pod é um conjunto de containers que deve executar uma única função conjunta, como por exemplo uma aplicação e seu proxy http. O cluster K8S é responsável por alocar, iniciar e desligar os pods, garantindo que a aplicação esteja em execução mesmo com problemas nas máquinas ou falhas dos próprios programas, reenviando as cargas de trabalho de um nó para o outro em caso de queda ou reiniciando as aplicações em caso de falha.
Toda a gestão do cluster é feita através da API Kubernetes, um ponto único de gerência e informação do estado do cluster.
O K8S foi desenhado com suporte nativo a disponibilidade e escalabilidade das aplicações. Utilizando uma estrutura chamada Deployment é possível instalar, atualizar e escalar os containers de forma fácil e rápida, implementando entregas do tipo Canary, rollback em caso de parada e reinício em caso de falhas com simplicidade.
Cada Deployment é responsável por controlar um replicaset de um pod. O replicaset mantém um conjunto de cópias de um mesmo pod em execução garantindo que o número desejado esteja sempre disponível, recriando ou terminando os pods para atingir esse objetivo.
Utilizando os replicasets, um deployment pode atualizar uma aplicação de uma versão para outra mantendo um conjunto com cada versão fazendo a migração aos poucos até que todos estejam atualizados. Da mesma forma, o Deployment guarda histórico das versões utilizadas permitindo um rollback para um estado anterior em caso de falhas.
Outro uso dos replicasets é o autoescalonamento utilizando um hpa (horizontal pod autoscaler). Essa funcionalidade do K8S monitora o uso de recursos nos pods de um deployment e altera o número de cópias desejadas em um replicaset garantindo o desempenho da aplicação em momento de maior demanda.
Se você se interessou por esta plataforma, curtiu nosso briefing e quiser aprender de fato como funciona um cluster Kubernetes gostaríamos de sugerir alguns labs interessantes. O primeiro deles, um dos mais conhecidos e cujos passos de instalação e uso são encontrados na documentação oficial do Kubernetes, é o Minikube. O Minikube é um cluster K8S localhost composto por um único node. Em termos de recursos você vai precisar apenas de uma máquina virtual e da kubectl, a linha de comando do Kubernetes, instalados em seu notebook ou desktop. É possível executá-lo no Linux, no MacOS e no Windows. Outra opção de single-node cluster é o Microk8s, porém este desenvolvido exclusivamente para sistemas Linux.