“O que é Kubernetes?” tornou-se uma questão primordial no mundo da tecnologia atual. Aqui, iremos desmistificar o Kubernetes, detalhando seu funcionamento, arquitetura e por que ele tem sido um divisor de águas no gerenciamento de contêineres.
O que é Kubernetes?
Kubernetes, muitas vezes abreviado como K8s ou kube, é uma plataforma open-source desenvolvida para automatizar a implantação, escalabilidade e operação de aplicações em contêineres. Originado no Google, ele agora é mantido pela Cloud Native Computing Foundation (CNCF).
A Revolução dos Contêineres
Os contêineres oferecem uma maneira de encapsular uma aplicação em um pacote com tudo o que o software precisa para executar. Isso inclui código, runtime, bibliotecas, ou seja, qualquer coisa que possa ser instalada em um servidor.
O movimento em direção aos contêineres permitiu que os desenvolvedores criassem aplicações que são isoladas de seus ambientes, garantindo que funcionem de forma consistente em qualquer plataforma. O Kubernetes leva essa revolução um passo adiante, por exemplo, ao gerenciar e orquestrar esses contêineres.
Aplicações Cloud-Native e Kubernetes
O Kubernetes é uma ferramenta vital para aplicações cloud-native. Mas o que significa ser “cloud-native”?
As aplicações cloud-native são aplicações projetadas especificamente para serem hospedadas em ambientes de nuvem, e o Kubernetes tornou-se a principal ferramenta para gerenciar essas aplicações. Algumas características dessas aplicações incluem:
- Microserviços orientados para otimizar a alocação de recursos.
- Contêineres para isolar aplicações.
- Orquestração dinâmica para otimizar o uso de recursos.
- Cultura DevOps, automação contínua e integração contínua.
O que é um Cluster?
Um cluster consiste em computadores fracamente ou fortemente ligados que trabalham em conjunto, de modo que, em muitos aspectos, podem ser considerados como um único sistema.
O que é um Cluster Kubernetes?
Basicamente, um cluster Kubernetes é composto por pelo menos uma máquina de administração do cluster (Master Node) e duas ou mais máquinas de Workload (Worker nodes).
O Master Node tem a função de coordenar o cluster, os Worker Nodes são nós dedicados à executar as aplicações que são implantadas por você no Kubernetes, como por exemplo, os sistema, as APIs ou os microserviços da sua empresa.
Vale ressaltar que a imagem acima é meramente ilustrativa. Por exemplo, para um cluster de produção, é altamente recomendado ter um cluster de Master Nodes dedicado a coordenação de um ou mais clusters de Workload. Dependendo da distribuição escolhida, esta pode ser uma tarefa simples ou complexa. Aqui no blog tem um post com dicas valiosas sobre como escolher a distribuição de kubernetes adequada para o seu projeto.
Principais Conceitos do Kubernetes
Control Plane
A camada de orquestração de contêineres que expõe a API e as interfaces para definir, implantar e gerenciar o ciclo de vida dos contêineres. Esta camada é composta por diversos componentes diferentes, tais como (mas não restritos a):
- etcd
- API Server
- Scheduler
- Controller Manager
- Cloud Controller Manager
Esses componentes podem ser executados como serviços tradicionais do sistema operacional (daemons) ou como contêineres. Os hosts (ou nodes) que executam esses componentes são geralmente chamados de masters.
API Server
O API Server (ou kube-apiserver) é um componente do plano de controle do Kubernetes que expõe a API do Kubernetes. O API Server é o front-end do plano de controle do Kubernetes.
A principal implementação de um servidor de API Kubernetes é o kube-apiserver. O kube-apiserver foi projetado para escalar horizontalmente, ou seja, ele escala implantando mais instâncias. Você pode executar várias instâncias do kube-apiserver e balancear o tráfego entre essas instâncias.
Cloud Controller Manager
As tecnologias de infraestrutura em nuvem permitem executar o Kubernetes em nuvens públicas, privadas e híbridas. Dessa forma, o Kubernetes acredita em infraestrutura automatizada e orientada por API, sem forte acoplamento entre componentes.
O Cloud Controller Manager (gerenciador de controlador de nuvem) é um componente do plano de controle do Kubernetes que incorpora lógica de controle específica da nuvem. Assim, o gerenciador de controlador de nuvem (também conhecido como CCM) permite vincular seu cluster à API do seu provedor de nuvem e separa os componentes que interagem com essa plataforma de nuvem dos componentes que interagem apenas com seu cluster.
Ao dissociar a lógica de interoperabilidade entre o Kubernetes e a infraestrutura de nuvem subjacente, o componente CCM permite que os provedores de nuvem liberem recursos em um ritmo diferente em comparação com o projeto principal do Kubernetes.
O Cloud Controller Manager é estruturado usando um mecanismo de plugin que permite que diferentes provedores de nuvem integrem suas plataformas com Kubernetes. Além disso, o Cloud Controller Manager é executado no plano de controle como um conjunto replicado de processos (geralmente são contêineres em pods). Cada Cloud Controller Manager implementa vários controladores em um único processo.
etcd
O etcd é um Banco de Dados do tipo chave-valor com armazenamento consistente e altamente disponível usado como armazenamento de apoio do Kubernetes para todos os dados do cluster.
Contudo, se o seu cluster Kubernetes usar o etcd como armazenamento de apoio, certifique-se de ter um plano de backup para os dados do etcd. Caso você queira saber mais, este é o link da documentação oficial do etcd.
Workloads
Um workload (ou carga de trabalho) é um aplicativo em execução no Kubernetes. Quer sua carga de trabalho seja um único componente ou vários que funcionam juntos, no Kubernetes você a executa dentro de um conjunto de pods. Além disso, no Kubernetes, um pod representa um conjunto de contêineres em execução no seu cluster.
Pods
Pods são as menores unidades de computação implantáveis que você pode criar e gerenciar no Kubernetes. Nesse sentido, um pod é um grupo de um ou mais contêineres, com armazenamento e recursos de rede compartilhados, e uma especificação de como executar os contêineres.
Deployments
Um objeto de API do Kubernetes que gerencia uma aplicação replicada, normalmente executando pods sem estado local. Nesse sentido, cada réplica da aplicação é representada por um Pod, e os Pods são distribuídos entre os nós de um cluster. Contudo, para cargas de trabalho que exigem estado local, considere usar um StatefulSet.
StatefulSet
Um StatefulSet gerencia a implantação e o escalonamento de um conjunto de pods e fornece garantias sobre a ordem e a exclusividade desses pods.
Assim como um deployment, um StatefulSet gerencia pods baseados em especificações de contêiner idênticas. Ao contrário de um deployment, um StatefulSet mantém uma identidade fixa para cada um de seus pods. Esses pods são criados a partir da mesma especificação, mas não são intercambiáveis: cada um tem um identificador persistente que é mantido durante qualquer reagendamento.
Kubelet
Um agente executado em cada nó do cluster. Ele garante que os contêineres estejam sendo executados em um pod. Além disso, o kubelet usa um conjunto de PodSpecs fornecidos por meio de vários mecanismos e garante que os contêineres descritos nesses PodSpecs estejam em execução e íntegros. Contudo, o kubelet não gerencia contêineres que não foram criados pelo Kubernetes.
Container Runtime
Um componente fundamental que capacita o Kubernetes a executar contêineres de maneira eficaz. Por exemplo, ele é responsável por gerenciar a execução e o ciclo de vida dos containers dentro do ambiente Kubernetes. Além disso, o Kubernetes oferece suporte a tempos de execução de contêiner, como containerd, CRI-O e qualquer outra implementação do Kubernetes CRI (Container Runtime Interface).
Conteiner Runtime Interface (CRI)
A interface de tempo de execução de contêiner (CRI) é uma API para tempos de execução de contêiner para integração com kubelet em um node.
Kube-proxy
O kube-proxy é um proxy de rede executado em cada nó do cluster, implementando parte do conceito de serviço Kubernetes, ele mantém regras de rede em nós. Dessa forma, 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. Além disso, o kube-proxy usa a camada de filtragem de pacotes do sistema operacional, se houver uma e estiver disponível. Caso contrário, o kube-proxy encaminhará o próprio tráfego.
Kube-controller-manager
Componente do control plane que executa processos do controlador.
O componente do control plane executa os processos do controlador. Apesar de, logicamente, considerarmos cada controlador como um processo distinto, para simplificar, compilamos todos eles em um binário único e os executamos em um único processo.
Services, Load Balancing e Networking
Conceitos e recursos relacionados ao modelo de rede do Kubernetes.
Tecnologias envolvidas:
- Service
- Ingress
- Ingress Controllers
- EndpointSlice
- Network Policies
- DNS para Services e Pods
- …
Storage
Maneiras de fornecer armazenamento temporário e de longo prazo para pods no seu cluster.
Tecnologias Envolvidas:
- Volumes
- Persistent Volumes
- Projected Volumes
- Ephemeral Volumes
- Storage Classes
- Dynamic Volume Provisioning
- Volume Snapshots
- Volume Snapshot Classes
- CSI Volume Cloning
- Storage Capacity
- Node-specific Volume Limits
- Volume Health Monitoring
Configuration
Recursos que o Kubernetes fornece para configurar pods.
Tecnologias Envolvidas:
- ConfigMaps
- Secrets
Security
Conceitos para manter segura sua carga de trabalho nativa da nuvem.
Tecnologias Envolvidas:
- Service Accounts
- Pod Security Admission
- Pod Security Policies
Policies
Gerencie a segurança e as práticas recomendadas com políticas.
Scheduling, Preemption and Eviction
No Kubernetes, agendamento (scheduling) refere-se a garantir que os pods correspondam aos nós para que o kubelet possa executá-los. O processo de preempção encerra pods de prioridade mais baixa para agendar pods de prioridade mais alta nos nós. A remoção (eviction) é o processo de encerrar proativamente um ou mais pods em nós com falta de recursos.
Agendamento:
- Kubernetes Scheduler
- Assigning Pods to Nodes
- Pod Overhead
- Pod Topology Spread Constraints
- Taints and Tolerations
- Scheduling Framework
- Dynamic Resource Allocation
- Scheduler Performance Tuning
- Resource Bin Packing for Extended Resources
- Pod Scheduling Readiness
- Descheduler
Pod Disruption
O processo de interrupção do pod encerra voluntária ou involuntariamente os pods nos nós. Por exemplo, responsáveis pelas aplicações ou administradores do cluster iniciam interrupções voluntárias intencionalmente. Por outro lado, a falta de recursos de um nó, ou exclusões acidentais de componentes são problemas inevitáveis que podem causar interrupções involuntárias.
Funcionalidades do Kubernetes
O Kubernetes vem carregado de funcionalidades. Ele pode:
- Instalar e rodar contêineres em clusters.
- Redimensionar e atualizar contêineres com versões novas.
- Mudar o tráfego entre contêineres.
- Efetuar rollback para versões anteriores de aplicações se necessário.
- E muito mais.
Arquitetura do Kubernetes
Nodes
Primeiramente, o Kubernetes executa sua carga de trabalho colocando contêineres em pods para execução em nós, que podem ser uma máquina virtual ou física, dependendo do cluster. Além disso, o Control plane gerencia cada nó e contém os serviços necessários para executar os pods. Geralmente, você tem vários nós em um cluster; entretanto, em um ambiente de aprendizagem ou com recursos limitados, você pode ter apenas um nó. Finalmente, os componentes em um nó incluem o kubelet, um conteiner runtime e o kube-proxy.
Controllers
No Kubernetes, os controladores são loops de controle que monitoram o estado do seu cluster e, em seguida, fazem ou solicitam alterações quando necessário. Nesse sentido, cada controlador tenta mover o estado atual do cluster para mais perto do estado desejado. Além disso, os controladores monitoram o estado compartilhado do seu cluster por meio do apiserver (parte do Control Plane).
O control plane executa alguns controladores que fornecem loops de controle essenciais para as operações do Kubernetes. Por exemplo, o kube-controller-manager (que executa o controlador de deployment), o controlador daemonset, o controlador de namespace, o controlador de volume persistente, entre outros.
Leases
Em muitos cenários, os sistemas distribuídos frequentemente recorrem a arrendamentos (leases). Essencialmente, eles fornecem um mecanismo para bloquear recursos compartilhados e coordenar atividades entre membros de um conjunto. Dentro do contexto do Kubernetes, este conceito de arrendamento é vividamente representado por objetos Lease no grupo de APIs coordinator.k8s.io. Mais especificamente, estes são utilizados para recursos críticos do sistema, tais como node heartbeats e a eleição de líder em nível de componente (component-level leader election).
Criando Aplicações no Kubernetes
Com o Kubernetes, você descreve o estado desejado em um arquivo de configuração e o K8s faz o resto.
kubectl
Ferramenta de linha de comando para comunicação com o plano de controle de um cluster Kubernetes, usando a API Kubernetes. Desse modo, você pode usar o kubectl para criar, inspecionar, atualizar e excluir objetos do Kubernetes.
Comandos Imperativos
Quando um usuário usa comandos imperativos, ele opera diretamente em objetos ativos em um cluster, fornecendo operações ao comando kubectl como argumentos ou sinalizadores. Nesse sentido, esta é a maneira recomendada de começar ou executar uma tarefa única em um cluster. Contudo, como esta técnica opera diretamente em objetos vivos, ela não fornece histórico de configurações anteriores.
Por exemplo, o comando abaixo é um exemplo de um comando imperativo para executar uma instância de um contêiner do Nginx, através da criação de um Deployment.
kubectl create deployment nginx --image nginx
Configuração Imperativa de Objeto
Na configuração imperativa do objeto, o comando kubectl especifica a operação (create, replace, etc.), flags opcionais e pelo menos um nome de arquivo. Por outro lado, o arquivo especificado deve conter uma definição completa do objeto no formato YAML ou JSON.
Por exemplo, o comando abaixo é um exemplo de um comando para criar uma instância de um conteiner do Nginx, através de um arquivo de manifesto chamado nginx.yaml, contendo o estado desejado do objeto.
kubectl create -f nginx.yaml
Ainda por exemplo, o comando abaixo poderia ser o conteúdo do arquivo (nginx.yaml) de definição do objeto.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
Vantagens do Kubernetes
- Alto grau de portabilidade.
- Extremamente escalável.
- Gerenciamento simplificado.
- E mais.
Como Aprender Kubernetes?
A princípio, aprender kubernetes pode ser uma tarefa desafiadora. Isto por que Kubernetes introduz diversos conceitos novos e únicos, mas não se assuste, pois com o tempo você irá se familiarizar naturalmente.
Defina um objetivo
Eu costumo dizer que para aprender Kubernetes, você precisa primeiro entender que existem basicamente dois perfis de quem trabalha com o Kubernetes.
O primeiro perfil é o do Administrador do Kubernetes. Um administrador de Kubernetes, por exemplo, tem como uma de suas principais responsabilidade manter os componentes da plataforma Kubernetes funcionando de forma adequada, garantindo a disponibilidade, segurança, backups, etc. Nesse sentido, este profissional geralmente trabalha com Infraestrutura.
O segundo perfil seria o do Desenvolvedor de Aplicações para Kubernetes. Um desenvolvedor, por exemplo, teria como uma de suas principais funções garantir que as aplicações que serão implantadas no cluster, estão configuradas de forma adequada para executar suas funções, utilizando os recursos necessários, sem compromenetr a saúde do cluster. Nesse sentido, este profissional irá lidar no seu dia a dia com Deployments, Pods, Services, Ingress, Probes, etc. Ou seja, recursos fornecidos pela plataforma Kubernetes, para execução de aplicações no cluster.
Tenha um Ambiente para Praticar
Para aprender kubernetes, é fundamental você ter um ambiente para poder praticar. Dessa forma, existem plataformas na Web que disponibilizam ambientes de Playground, onde você recebe uma seção em um terminal com o Kubernetes instalado e pode executar os comandos via kubectl. O problema é que estes ambientes geralmente possuem um tempo limitado de seção, e você não tem como manter o estado do cluster ao voltar posteriormente. Contudo, você pode montar um ambiente Kubernetes para chamar de seu utilizando Máquinas Virtuais Linux com Virtual Box.
Familiarize-se com a Documentação Oficial
A documentação oficial do Kubernetes é repleta de exemplos que você pode utilizar para aprender. Dessa forma, utilize a documentação oficial do Kubernetes até se familiarizar com a navegabilidade e onde estão os recursos. Ademais, uma dica excelente é criar históricos para os assuntos importantes que você encontrou na documentação.
Escolha um Bom Curso
Você pode aprender kubernetes sozinho, porém, a escolha de um bom curso pode tornar a sua jornada Kubernetes mais curta, menos trabalhosa e mais enriquecida, pois você não vai precisar ficar juntando as peças do quebra-cabeças para evoluir no aprendizado.
Conclusão
Em suma, espero que esse artigo tenha ajudado a clarear um pouco mais o por que tantas empresas estão interessadas em utilizar o Kubernetes e em contratar profissionais qualificados que conheçam a tecnologia e que saibam fazer ela funcionar de forma adequada, e tenha te inspirado a querer aprender mais.
Atualmente, o mercado de trabalho está repleto de oportunidades sensacionais. No entanto, elas são melhores aproveitadas por aqueles que possuem a coragem de sair da zona de conforto e tomam a iniciativa de se qualificar. Dessa forma, se você está em busca de ampliar suas habilidades em Kubernetes, tenho uma recomendação para você
Desenvolvi um curso completo sobre Kubernetes. E acredite, ele é projetado para te levar do nível zero ao intermediário em Kubernetes. Então, dê uma olhada no link do curso na Udemy e aproveite o desconto especial de 40% – mas atenção, é por tempo limitado!
Por fim, sempre estou aqui para ajudar. Se surgir alguma dúvida, e lembre-se, é só mandar uma mensagem. Estarei à disposição para responder!
Um abraço e até o próximo post!
Sobre o Autor
0 Comentários