O que é Kubernetes? Entenda para que serve e como utilizá-lo!
Provavelmente você já deve ter ouvido falar sobre o Kubernetes, certo? No artigo que escrevi sobre Docker (você pode encontrar ele clicando aqui) expliquei um pouco sobre o universo de containers e como os mesmos funcionam.
Provavelmente você já deve ter ouvido falar sobre o Kubernetes, certo? No artigo que escrevi sobre Docker (você pode encontrar ele clicando aqui) expliquei um pouco sobre o universo de containers e como os mesmos funcionam. Legal, mas qual é a ligação? Pois muito bem, o Kubernetes é um orquestrador de containers em produção. Reparem que eu falei containers no geral, então caso você esteja trabalhando com container em outra tecnologia que não seja Docker, isso não é necessariamente um problema, pois o Kubernetes tem suporte a diversas interfaces de execução – cri-o e containerd para dar alguns exemplos.
O Kubernetes, antes de mais nada, é uma plataforma portável e extensiva, além de ser OpenSource e mantido pela CNCF — Cloud Native Computing Foundation. Portanto é extremamente flexível: você consegue trabalhar com ele desde infra on premise até cloud (AWS, GCP, Azure, DigitalOcean – para citar alguns exemplos).
O objetivo do Kubernetes é gerenciar cargas de trabalho e execução de containers, e, com isso, facilitar a configuração declarativa. Uma curiosidade é que o Kubernetes é comumente conhecido apenas como “K8S” (a origem é basicamente um trocadilho com o próprio nome: K + 8 caracteres + S, daí K8S).
Glossário
Mas afinal de contas, o que é orquestração de container?
É o gerenciamento de servidores individuais que rodam em containers. Com isso conseguimos manter a estrutura elástica de forma automatizada. Além de facilitar a alocação de recursos, provisionamento e o balanceamento de carga da aplicação.
Docker vs. Kubernetes
Apenas para explicar, o Docker é uma plataforma de conteinerização – com foco em construir, distribuir e executar os containers. E o Kubernetes como dito é um orquestrador de container que trabalha com plataformas como o Docker, porém também consegue trabalhar com outros runtimes.
Aprenda uma nova língua na maior escola de idiomas do mundo! Conquiste a fluência no idioma que sempre sonhou com uma solução de ensino completa. Quero estudar na Fluency
Um pouco sobre a arquitetura do K8S
Podemos dividir a arquitetura do Kubernetes entre os Componentes Master (Control Plane) – que tomam decisões globais dentro do Cluster – Componentes de Nó e Objects Types. Abaixo explico um pouco melhor sobre cada um.
Control Plane
Pode ser executado em qualquer máquina do cluster e serve para tomar decisões globais (como scheduler) e também para detectar e reagir a eventos do cluster (como inicializar um novo pod), quando o número de réplicas não está de acordo com o esperado.
Arquitetura do Control Plane
- API Server: O servidor de API é um componente responsável por expor a API do K8S. Podemos dizer que ele é o frontend do Control Plane. A principal implementação do servidor de API é o kube-apiserver que foi projetado para ser dimensionado de forma horizontal. Ele é dimensionado ao implantar mais instâncias.
- etcd: O etcd é o armazenamento de apoio do Kubernetes que serve para todos os dados do cluster. O mesmo é baseado em chave-valor.
- Scheduler: Responsável por observar os pods recém criados que ainda não foram atribuídos ao nó. A partir disso ele cria um agendamento do pod para um nó – de acordo com os recursos, disponibilidade e afinidade.
- Controller Manager: Gerencia os controladores de processos do Kubernetes. Dentro dele existem controladores mais micros e específicos, como o controlador de nós, jobs, EndpointSlice – que é o link entre services e pods e contas de serviço.
Componentes de Nó
São executados em todos os nós e são responsáveis por manter todos os pods em execução, além de fornecer o ambiente em tempo de execução do K8S.
Arquitetura do Node
- kubelet: O kubelet garante, através dos PodSpecs (especificação de Pods), que os containers estejam íntegros e em execução. Ele é executado em cada nó.
- kube-proxy: O kube-proxy mantém regras de rede que possibilitam a comunicação entre pods e entre sessões dentro ou fora do cluster.
- container runtime: Responsável pela execução dos contêineres. O Kubernetes suporta outras implementações além do Docker, através do CRI – Container Runtime Interface
Objects
- Pods: Os nossos containers rodam nos pods, que são as menores unidades de implantação do K8S. Um pod pode conter N containers, porém os recursos são compartilhados entre os mesmos. Então, por via de regra, 1 pod executa 1 container, para que tenhamos uma melhor granularidade de controle dos recursos utilizados. Caso esteja trabalhando com ServiceMesh, no geral terá outro pod rodando ao lado – sidecar – porém isso é assunto para outro artigo.
- Deployment: O deployment realiza o controle de quantas replicas (ou pods) a nossa aplicação terá. Com ele nós conseguimos mapear o estado desejado da nossa aplicação, além de facilitar um rollback da aplicação, visto que ele trabalha baseado em estado.
- Service: Para que nossas aplicações sejam expostas, utilizamos o service. Caso o nosso deployment tenha pelo menos 2 pods rodando – que é o ideal para se ter uma mínima redundância – os 2 pods serão mapeados e terão um balanceamento de carga na frente para redirecionar o tráfego.
- Ingress: O ingress expõe rotas HTTP e HTTPS para os services que estão dentro do cluster. O roteamento feito pelo ingress é controlado por regras declarativas. Eu consigo baratear o custo de infra com o ingress, visto que eu posso, necessariamente, utilizar apenas um endereço de IP exposto e mapear o mesmo em diversos services, através de subdomínios do meu domínio e request params na minha URI.
Vantagens ao usar o Kubernetes
Existem diversas vantagens ao adotar o uso do Kubernetes. Podemos trabalhar com o Kubernetes praticamente em qualquer tipo de infraestrutura, por isso ele é extremamente flexível. A sua adoção também aumenta a produtividade da pessoa desenvolvedora, visto que as implantações são mais facilitadas com o seu uso. Além disso, o Kubernetes proporciona um ambiente muito mais escalável e o fato de ser Open Source também é uma vantagem, uma vez que ele pode ser modificado por todos os interessados da comunidade.
Como executo a minha primeira aplicação no K8S?
Como citado, o Kubernetes é extremamente portátil, então é possível executá-lo em diversos ambientes, inclusive na sua própria máquina. Para tal, vamos trabalhar com o kind (Kubernentes in Docker) — https://kind.sigs.k8s.io. Isso mesmo: vamos executar o cluster K8S utilizando containers. Além dele, precisamos instalar também o kubectl — https://kubernetes.io/docs/tasks/tools – que é interface via linha de comando padrão do Kubernetes. Após a instalação, para criar o primeiro cluster, basta executar o comando abaixo:
Esse comando cria o cluster com apenas um nó, caso precise de mais, acesse: https://kind.sigs.k8s.io/docs/user/quick-start/#advanced
Aprenda uma nova língua na maior escola de idiomas do mundo! Conquiste a fluência no idioma que sempre sonhou com uma solução de ensino completa. Quero estudar na Fluency
Depois do cluster ter sido criado, precisamos criar os nossos manifestos e referenciar a imagem que nosso deployment vai executar. Para isso, vamos criar uma pasta e colocar os manifestos abaixo:
Reparem que estamos trabalhando com 5 réplicas para o container do nginx – referenciado em image dentro de containers em specs. Isso significa que, caso um container apresente problemas, a aplicação não ficará indisponível Claro que para garantir essa alta disponibilidade, precisaríamos rodar as nossas réplicas em diversos nós e ter diversos control plane no cluster – ambiente redundante. Além disso, estamos tratando a quantidade de recursos que a aplicação pode utilizar. Por fim, basta salvar o arquivo e aplicar o seguinte dentro da pasta via terminal:
Após isso o deployment foi criado e a aplicação já tá rodando no cluster. Para acompanhar basta rodar o comando:
Eu falei no tutorial sobre o service e ingress, que servem para expor nossa aplicação pro mundo. Para não ficar muito longo, vamos utilizar um recurso em ambiente local para conseguir visualizar a nossa aplicação rodando, com esse comando:
Basicamente, com esse comando o tráfego da sua porta 8080 será redirecionado para a porta 80 do container – que foi definido em ports no manifesto. Para ver o resultado basta acessar http://localhost:8080 no seu navegador.
Pontos importantes
Quando estamos trabalhando com containers em produção, é importante sempre lembrarmos sobre a efemeridade do disco. Sempre que houver um problema na aplicação, a primeira coisa que o Kubernetes vai fazer é tentar se auto recuperar (self healing) e com isso os pods serão reestardados. Portanto, caso os logs estejam salvos em disco, os mesmos serão perdidos (essa regra vale para assets também). Então é interessante manter sempre a aplicação desacoplada dessas regras e utilizar outros serviços para tal.
O Kubernetes abstrai toda a complexidade da infra em si, sendo assim uma interface única para que consigamos realizar as nossas implantações de forma mais simples.
Aprenda uma nova língua na maior escola de idiomas do mundo! Conquiste a fluência no idioma que sempre sonhou com uma solução de ensino completa. Quero estudar na Fluency