Se você não é da área de tecnologia, provavelmente nunca ouviu falar em Kubernetes. Mas ele é importante e, por isso, resolvemos te contar do que se trata e como ele funciona neste post.
Também chamados de K8s, o Kubernetes é um orquestrador de contêineres criado pelo Google em 2015. Ele facilita o processo de gerenciamento de múltiplos contêineres, bem como seu processo de publicação, scale e load balance das aplicações.
Embora tenha sido lançado há vários anos, muitas empresas deixam de utilizá-lo e sofrem com arquiteturas legadas. No caso da UX Solutions, ele foi um grande facilitador para melhorar a disponibilidade de nossas aplicações.
O trabalho em containers dentro da TI vem se destacando muito por ser extensível e de código aberto – o que facilita a configuração declarativa e a automação. O Kubernetes tem também um grande ecossistema de crescimento rápido, e seus serviços, suporte e ferramentas estão amplamente disponíveis. Tudo isso faz dele muito interessante no desenvolvimento de sistemas.
Como o Kubernetes é utilizado nos sistemas da UX Solutions
Todas as nossas aplicações web foram migradas para o Azure Kubernetes Services (AKS) no último ano. Isso melhorou drasticamente o nosso UP time, inclusive nos processos de publicações. A mudança mitigou também o risco de falhas na aplicação, já que o Kubernetes detecta anomalias e consegue redistribuir o tráfego automaticamente em todas as instâncias.
Nossas aplicações ficam hospedadas no Kubernetes. Ele é utilizado na entrada da requisição http, geração de certificados https, e balanceamento de tráfego entre as diversas réplicas da aplicação.
Hoje, já utilizamos o Kubernetes no Fusion, nosso sistema voltado para e-commerce que conta com módulos de cálculo e simulação de frete, rastreamento e conciliação. Agora, estamos testando e adaptando o Trux (nosso TMS para embarcadores e transportadoras) para que ele rode também em Kubernetes.
Por dentro da estrutura dos Kubernetes

O NODE Master é responsável por gerenciar o cluster Kubernetes e suas cargas de trabalho e/ou aplicações que é possível através destes componentes:
PODs
POD é a menor unidade que pode ser trabalhada no Kubernetes. É possível inserir um ou mais containers dentro de uma POD e ambos irão compartilhar os mesmos recursos disponíveis.
Em outras palavras, quando uma POD é criada, ela possui um IP para identificação. Dessa forma, se ela possuir mais de um container, ambos irão utilizar/compartilhar o mesmo IP.
Agora, vamos falar sobre os componentes do Kubernetes:
Componentes Master (Control Plane)
API Server
É um componente do NODE Master que expõe a API do Kubernetes, sendo o API Server front-end.
É o “cérebro” do cluster, as solicitações passam pela API, bem como a gravação no banco de dados interno do Kubernetes também é feita pela API.
ETCD
É a solução que o Kubernetes utiliza como banco de dados para armazenar as informações pertinentes ao cluster.
O ETCD não é uma solução que foi desenvolvida para o K8s, ele somente utiliza a solução já existente. Todas as informações sobre banco de dados ETCD podem ser encontradas na sua documentação oficial.
Scheduler
Componente que observa os PODs recém-criados sem nenhum nó atribuído e seleciona um nó para executá-los.
Quando você solicita a API para criar um container, ela irá conversar com o Scheduler para saber qual nó está disponível para alocar o container, bem como verificar se não há nenhum requisito de hardware (como memória RAM ou CPU) ou qualquer política.
Controller Manager
Componente que executa os processos do controlador.
Logicamente, cada controlador é um processo separado. Mas para reduzir a complexidade, todos são compilados em um único binário e executados em um único processo. Por exemplo: Replicaset Controller.
O controller Replicaset é responsável por garantir que as quantidades de PODs definidas estejam de acordo. Então quando você define que o Replicaset precisará ter 5 Pods, caso algum container caia ou seja destruído, o Replicaset irá forçar a criação de uma nova POD. Quem gerencia esse controlador, no caso, é o Controller Manager que observa os estados dos controladores sendo que alguns deles: Job controller, Deployment, Endpoints etc.
Componentes Node
Os componentes a seguir são executados em todos os NODES.
Kubelet
O Cubelet é um agente que é executado em cada NODE. Ele garante que os containers estão sendo executados através das PODs. Também fornece uma comunicação entre todos os NODEs que compõem o seu cluster, tendo o estado e saúde de cada NODE.
Kube-proxy
kube-proxy é um proxy de rede executado em cada nó do cluster, implementando parte do conceito de serviço Kubernetes.
O kube-proxy mantém regras de rede em nós. Essas regras de rede permitem a comunicação de rede com seus PODs a partir de sessões de rede dentro ou fora do cluster.
Container Runtime
No caso se trata da aplicação que irá executar os containers para nós. Pode ser o Docker, containerd, cri-o, podman etc.
Addons
Funcionam como um plugin, utilizando recursos do Kubernetes para implementar soluções adicionais ao cluster.
DNS
Enquanto outros ADDONs não são obrigatórios, todo cluster Kubernetes requer uma solução de DNS, dessa forma facilita o alcance e registros dos serviços.
Utilização de K8s para apis de alta disponibilidade
Para as aplicações que necessitam de alta disponibilidade, são criadas várias réplicas da mesma aplicação. Assim, o K8s consegue fazer o balanço das requisições em nossas apis de forma automática, entre elas. Com isso, se uma delas ficar sobrecarregada ou indisponível, o tráfego é redirecionado para as demais instâncias e uma nova é criada automaticamente. Aquela que apresentou falha é encerrada.
Além de garantir alta disponibilidade, redundância e melhor controle de versão, o Kubernetes também reduz o custo de infraestrutura em aproximadamente 40%.
O Kubernetes é considerado uma das melhores infraestruturas para load balance em contêineres.
Com ele funcionando em conjunto com nosso processo de DevOps, podemos dizer que esta é uma combinação perfeita.
Benefícios do Kubernetes
Os maiores ganhos estão no gerenciamento que ele faz da saúde das aplicações. Por exemplo, no início, quando o cálculo de frete estava em outra arquitetura, toda vez que precisava atualizar os dados do cache, era preciso que uma pessoa parasse para fazer o processo manualmente. Isso levava, em média 40 minutos, e esse processo se repetia de quatro a cinco vezes por dia (e às vezes mais!).
Com o Kubernetes, esse processo foi automatizado: além de levar menos de cinco minutos ele não apresenta risco de falhas humanas.
Outro ponto importante é que o scale horizontal é muito mais simples e rápido também. Na Black Friday de 2021, subimos uma supermáquina com aproximadamente 100 réplicas da aplicação para aguentar o alto volume de requisições, e foi muito simples e tranquilo fazer esse processo – o que poderia levar horas ou mesmo dias em arquiteturas mais antigas.
Como muda a forma de trabalho utilizando Kubernetes?
Ao implementarmos o Kubernetes, foi preciso implementar também processos de DevOps. Assim, criamos pipelines automatizados de compilação (continuous integration) da aplicação e processos de publicação automática (continuous delivery) – o que mudou drasticamente o processo de trabalho.
A mudança é porque quando um desenvolvedor finaliza um código, ele cria um pullrequest (PR) para nossa ferramenta de controle de versão (Git), na qual o código passa por uma análise (code review). Se aprovado, o código é compilado e cria uma nova versão da aplicação.
Essa versão, por sua vez, passa por um fluxo de publicações (Dev, Homolog, StageProduction e por fim Production). Se esse processo fosse manual, levaria horas de um desenvolvedor para subir, testar, validar e promover as versões entre os vários ambientes que possuímos. Porém, no Kubernetes + Azure DevOps leva apenas alguns segundos.
Mas este é um assunto para outro post 😉