Kubernetes: O que é e por que você deveria se importar?
Neste artigo, vamos explorar o orquestrador de contêineres que se tornou o padrão de mercado. A proposta é oferecer uma visão geral dessa tecnologia, passando um pouco por sua história, casos de uso, desafios e componentes fundamentais para o seu funcionamento. Este será o primeiro artigo de uma série na qual abordaremos em profundidade o Kubernetes (k8s). Nos textos seguintes, trataremos dos objetos de configuração, deploy, técnicas de autoscaling, entre outros tópicos.
A Odisseia dos Contêineres
Os contêineres, como conceito, não são uma inovação recente. No entanto, sua popularização veio através do Docker, uma ferramenta para criação e gerenciamento de aplicações em contextos limitados (contêiner). Com a necessidade e crescente adoção de sistemas distribuídos, o Docker ganhou uma adoção massiva, levando à necessidade de uma solução robusta de orquestração de contêineres, papel que o Kubernetes veio a preencher.
Trocando em miúdos e simplificando bastante o raciocínio, podemos pensar da seguinte forma:
- Os contêineres nos possibilitam isolar recursos do sistema operacional, nos dando mais autonomia para lidar com nossas aplicações.
- Com a adoção crescente de contêineres e aplicações de larga escala/sistemas distribuídos, veio a necessidade de alguma tecnologia que nos possibilitasse orquestrar melhor tudo isso. Nos dando autonomia para subir novos contêineres, configurar critérios de acesso e segurança, comunicar nossas aplicações, garantir a disponibilidade automática, etc.
- Surge o Kubernetes: um orquestrador de contêineres que se popularizou bastante por conta da sua flexibilidade e facilidade em nos possibilitar subir novas aplicações, escalar, isolar recursos e outras paradas que vamos tocar nos próximos tópicos.
Kubernetes: O Maestro dos Contêineres
Inspirado pelo sucesso e pelas limitações do Docker, o Kubernetes foi concebido por Craig McLuckie, Joe Beda e Brendan Burns, que eram parte do time do Google. Eles perceberam a necessidade de um orquestrador que pudesse gerenciar contêineres em múltiplas máquinas, uma lacuna que o Docker, naquela época, não preenchia.
O Google já tinha experiência prévia com orquestradores de clusters, como o Borg. Esse projeto utilizava uma tecnologia semelhantes à dos contêineres para gerenciar uma infraestrutura em larga escala, porém, era um sistema interno e não acessível para a comunidade.
Em 2014, o Google torna pública uma versão open source do Borg, chamada Kubernetes, que rapidamente foi adotada por empresas como Microsoft, RedHat e IBM. Inicialmente, a plataforma incluía recursos básicos de orquestração de contêineres, como replicação e balanceamento de carga.
No ano seguinte, com o lançamento do Kubernetes 1.0, o Google doou o projeto para a Cloud Native Computing Foundation (CNCF), o que reforçou a missão do Kubernetes de facilitar a computação em nuvem e acelerou sua adoção como padrão de orquestração de contêineres.
Por que Kubernetes? Desmistificando o Hype
Como toda tecnologia, o Kubernetes tem seus casos de uso muito bem definidos. Sua adoção deve ser medida e avaliada para cada cenário. Caso contrário, o overengineering vem rapidinho, seguido de dificuldades em dar manutenção e uma série de dores de cabeça ...
Uma boa forma de responder a pergunta "Devo usar essa tecnologia?" é entendendo muito bem o seu cenário atual (ai é com você), e entendendo os prós e contras da tecnologia:
Benefícios do Kubernetes
- Eficiência DevOps para Arquitetura de Microserviços: o Kubernetes torna o desenvolvimento, teste e implantação de sistemas distribuídos mais simples e eficientes. Com ele, podemos isolar melhor cada componente e escalá-lo isoladamente.
- Portabilidade e menos risco de lock-in de fornecedor: utilizando contêineres, o Kubernetes fornece uma forma leve e ágil de virtualização, melhorando a portabilidade das aplicações e reduzindo o risco de lock-in com fornecedores específicos, suportando uma ampla gama de ambientes de infraestrutura e runtimes de contêineres.
- Automação de implantação e escalabilidade: uma característica dos contêineres é justamente o isolamento de recursos, possibilitando replicação e portabilidade. O Kubernetes faz uso disso nos possibilitando automatizar a implantação de contêineres e sua escalabilidade, ajustando recursos rapidamente para atender à demanda (conforme critérios que configuramos).
- Estabilidade e alta disponibilidade: O Kubernetes assegura a execução confiável de aplicações em contêineres. Caso um nó falhe, ele automaticamente redistribui as cargas de trabalho entre os demais nós disponíveis no cluster para acomodar a demanda e manter o sistema ativo. Além disso, oferece recursos de auto-recuperação, como a reinicialização de contêineres ou nós em caso de falhas. Com seus recursos de resiliência, o k8s nos permite realizar atualizações contínuas nos softwares sem gerar tempo de inatividade.
Desafios do Kubernetes
- Complexidade: O k8s é complexo de operar e configurar. Pode ser bastante desafiador implantar uma estrutura utilizando o Kubernetes em uma organização que não possui domínio de orquestração de contêineres.
- Custo: Pode ser um canhão para organizações menores... a fim de garantir todas as features do k8s, ele exige um certo investimento em recursos computacionais. Para projetos menores, isso pode ser um custo que não se paga. E vai além do custo de infraestrutura e cloud, trata-se, também, do custo de mão de obra especializada.
Arquitetura do Kubernetes: Uma Visão Simplificada
O Kubernetes segue uma arquitetura Client/Server, no qual o usuário - por meio dos clients - pode se comunicar com os recursos internos. Esse modelo declarativo serve ao conceito de "desired state", no qual o usuário "declara" ao Kubernetes as alterações que deseja no cluster. O Kubernetes armazena o arquivo de manifestos em uma base de dados chave-valor (etcd
) e implementa o estado desejado em todas as aplicações necessárias dentro do cluster. Além disso, o k8s monitora continuamente os elementos do cluster para garantir a autenticidade do estado.
Kubernetes Master (Worker Master)
API Server
Atua como o front-end do control plane (Worker Master), sendo o componente com o qual interagimos diretamente. Serve como meio de campo para nos comunicarmos com todos os demais componentes.
Etcd
É o banco de dados que o Kubernetes usa para fazer backup de todos os dados do cluster. Ele armazena toda a configuração e estado do cluster. O node master consulta o etcd para recuperar parâmetros para o estado dos nodes, pods e contêineres.
Controller
Assegura que o estado atual do cluster corresponda ao estado desejado, verificando e ajustando, quando necessário.
Scheduler
Responsável por designar trabalhos recém-chegados aos nodes saudáveis, selecionando o melhor node para cada tarefa com base em critérios de avaliação.
Worker Node
Kubelet
- Atua como o coração em cada node do cluster, transformando a CPU, a RAM e armazenamento do nó em componentes ativos do cluster.
- Monitora instruções vindas do API Server, e executa as tarefas designadas, mantendo o controle sobre os pods e assegurando que estão funcionando corretamente.
Container Runtime
- É o "mecânico" que atua nos bastidores do Kubernetes, responsável por pegas as imagens de contêineres e dar a partida ou parar cada contêiner conforme o necessário.
- Normalmente, o Docker exerce a função de
container runtime
.
Kube Proxy
- Age como o regulador de tráfego dentro do cluster, assegurando que cada nó receba seu endereço
IP
. - É o que mantem a comunicação entre os serviços, garantindo que os dados cheguem onde precisam ir de maneira rápida e balanceada.
Pod
- Funcionam como um invólucro para os contêineres.
- Quando falamos em gerir a escalabilidade de uma aplicação no k8s, normalmente estamos falando em adicionar ou remover pods.
- Normalmente, para cada pod temos um contêiner (mas não é regra).
Conclusão
Neste ponto inicial, vimos um pouco da origem, os pilares fundamentais e as capacidades que temos com o Kubernetes, preparando o terreno para uma exploração ainda mais aprofundada. Nos próximos artigos, mergulharemos nos detalhes técnicos, de maneira bastante prática e com uma abordagem que se assemelhe a casos de uso reais que lidamos ao trabalhar com k8s no dia a dia.
Referências
- Kubernetes.io - Official Documentation
- PhoenixNAP - Understanding Kubernetes Architecture with Diagrams
- IBM Cloud Blog - Top 7 Benefits of Kubernetes
- Kubernetes.io - kubelet