Introdução


Originalmente desenvolvido no Google e lançado como código aberto em 2014, o Kubernetes é um software de gerenciamento centrado em contêineres, que foi criado com base nos 15 anos de execução de cargas de trabalho em contêiner e nas contribuições valiosas da comunidade do código aberto. Com a ampla adoção dos contêineres entre as organizações, o Kubernetes se tornou o padrão para implantar e operar aplicativos dentro deles.

Inspirado no sistema de gerenciamento de cluster interno do Google, Borg, o Kubernetes automatiza tarefas operacionais de gerenciamento de contêineres e inclui comandos integrados para implantação de aplicativos, implementação de alterações nas aplicações, escalonamento para mais e para menos para atender às necessidades de mudança, monitoramento e muito mais, facilitando todo o gerenciamento.



Ícone que representa o software Kubernetes.


Definições


Contêiner: CON-TÊI-NER -> "grande caixa de metal ou madeira, geralmente de grandes dimensões, destinado ao acondicionamento e transporte de carga em navios, trens etc". No âmbito da computação, um contêiner é um ambiente isolado que divide um único host de controle e que é responsável por armazenar aplicações.



Representação de contêineres em Kubernetes


Cluster: Um Cluster é nada mais que um conjunto de máquinas, também chamadas de nós, que são utilizadas em conjunto.

Pods: Um Pod é a menor unidade de trabalho do Kubernetes, pode ser composto por um ou mais contêineres desde que compartilhem o mesmo volume e namespace. Também pode ser reconhecido como uma instância de processo rodando no cluster. Um detalhe importante é que são efêmeros, uma vez que são direcionados para a realização de uma tarefa específica quando criados.



Representação de Pods em Kubernetes


Services: Services, ou serviços, são abstrações que definem um conjunto lógico de Pods e uma política para acessá-los. Diferentes dos Pods, não são efêmeros. Aqui estão alguns tipos de Services:

  • ClusterIP -> Serviço responsável por criar um endereço IP que permite a comunicação entre os Pods, sendo ele acessível apenas dentro de um cluster;
  • NodePort -> Serviço responsável por mapear os nós, através de portas, dentro de um cluster para acesso de agentes externos;
  • LoadBalancer -> Serviço responsével por dividir as cargas de processos entre diferentes nós, permitindo que um sistema, site ou aplicação continue em funcionamento mesmo com o aumento da demanda;
  • ExternalName -> Serviço responsável por mapear nomes DNS do cluster para nomes DNS externos, permitindo que Pods acessem serviços fora do cluster.


Representação de Serviços em Kubernetes


Arquitetura


Control Plane

Tomam decisões globais sobre o cluster, detectam e respondem aos eventos do cluster.

Kube-apiserver: É o núcleo do Kubernetes. Ele desempenha um papel fundamental ao gerenciar a gravação no banco de dados, garantindo a validação e configuração adequadas dos dados para os objetos da API, como pods, serviços e controladores de replicação. Além disso, ele facilita o balanceamento de carga e tráfego entre as instâncias, fornecendo uma interface centralizada para o cluster que permite a interação entre todos os componentes do sistema.

Kube-scheduler: É encarregado de distribuir os pods nos nós para execução. Ele leva em consideração as especificações de afinidade e anti-afinidade, além de analisar fatores como interferências de cargas de trabalho, prazos e outros critérios. Esse processo permite identificar o nó mais adequado para alocar o container, levando em conta a disponibilidade e otimizando os recursos. Suas decisões são baseadas em requisitos individuais e coletivos de recursos, restrições de hardware e software, políticas, afinidades e anti-afinidades, localização de dados, interferências entre cargas de trabalho e prazos.

ETCD: É o tipo de armazenamento. Responsável pelo armazenamento de dados relacionados ao cluster. É um aramá e ameno do tipo chave valor consistente e de alta disponibilidade, usado como armazenamento de apoio do kubernetes.

Kube-controller-manager: Executa os processos do controlador. Apesar de cada controlador estar em um processo separado, eles são complicados e executam em um único processo. Controladores: de nó, de jobs, de endpointslice, service account.

Cloud-controller-manager: Executa os controladores kubernets que estão na nuvem. É possível gerenciar o controle da nuvem, escalonando horizontalmente e garantindo a interação com o cluster. É possível gerenciar os nós. Permite vincular o cluster na API do seu provedor de nuvem e separar os componentes que apenas interagem com seu cluster. Executa apenas controladores que são específicos para seu provedor de nuvem. Controladores: de nó, de rota, de serviço.


Node Components

Componentes são executados em todos os nós, mantendo os pods em execução e fornecendo o ambiente de execução do kubernetes.

Kubelet: É um dos componentes cruciais dos nós em um cluster Kubernetes. Ele garante a execução eficiente de todos os containers atribuídos a um pod específico. No entanto, vale ressaltar que o Kubelet não gerencia containers que não foram criados pelo próprio Kubernetes, concentrando-se exclusivamente na gestão e supervisão dos containers que fazem parte da estrutura Kubernetes.

Kube-proxy: É um proxy de rede que opera em cada nó do cluster Kubernetes. Ele desempenha um papel fundamental na implementação do conceito de serviço dentro do Kubernetes, gerenciando e mantendo regras de rede nos nós. Essas regras permitem que os pods se comuniquem eficientemente com sessões de rede dentro ou fora do cluster. Além disso, o Kube-proxy aproveita a camada de filtragem de pacotes do sistema operacional, se disponível, para otimizar a conectividade de rede e garantir uma comunicação confiável entre os componentes do cluster.


Security

Estratégia de segurança adotada pelo Kubernetes

Proteção do plano de controle: Uma prática imprescindível para qualquer cluster Kubernetes é controlar o acesso à API. É esperado que você configure e use TLS para fornecer criptografia de dados em trânsito dentro do plano de controle e entre o plano de controle e seus clientes. Também é possível habilitar a criptografia em repouso para os dados armazenados dentro do plano de controle do Kubernetes.

Secrets: A API Secret oferece proteção básica para valores de configuração que exigem confidencialidade.

Proteção de Workloads: Padrões de segurança de Pods devem ser aplicados para garantir que os Pods e seus containers estejam adequadamente isolados. Classes de Runtime podem ser usadas para definir isolamento personalizado, se necessário. Políticas de rede permitem controlar o tráfego entre Pods ou entre Pods e a rede externa ao cluster.

Auditoria: O registro de auditoria do Kubernetes documenta a sequência de ações em um cluster, registrando atividades de usuários, aplicativos que utilizam a API do Kubernetes e do próprio plano de controle. Políticas de segurança podem ser definidas usando mecanismos nativos do Kubernetes, como NetworkPolicy e ValidatingAdmissionPolicy. Além disso, é possível utilizar implementações de políticas do ecossistema mais amplo, que oferecem mecanismos de extensão para controles de revisão de código-fonte, aprovação de imagens de containers, controle de acesso à API e rede, entre outros.


Networking

Modelos de comunicação entre unidades do Kubernetes.

Container-to-Container: Comunicação entre contêineres, é necessário que possuam um mesmo namespace - endereço de ambiente isolado dentro de um determinado cluster - e que compartilhem um IP comum.

Pod-to-Pod: Comunicação entre Pods, o próprio nome já diz. Um detalhe importante é que, como Pods são efêmeros, é alocado um único ClusterIP para estender essa “vida útil”

Pod-to-Service: Comunicação entre Pod e Serviço. Existe para além do tempo de vida do POD, é gerenciado pelo kube-proxy e também usa um único ClusterIP

External-to-Service: Comunicação externa ao cluster, é feita através de um LoadBalancer.

Vantagens


Orquestração

Uma das principais vantagens dos Kubernetes é a capacidade de orquestrar e gerenciar o armazenamento de forma flexível. Os usuários podem definir estratégias de armazenamento tanto localmente quanto em ambientes multi-cloud, permitindo uma abordagem adaptável às necessidades de armazenamento dos aplicativos.



Otimização dos Recursos

Os Kubernetes possibilitam uma otimização eficiente dos recursos de computação. Os clusters de nós são aproveitados para executar tarefas nos containers de maneira inteligente, atribuindo recursos de memória conforme a demanda, garantindo assim uma utilização mais eficaz e escalável dos recursos disponíveis.



Autocorreção

Uma das funcionalidades poderosas dos Kubernetes é sua capacidade de autocorreção em casos de falhas. Se um container apresentar problemas, a ferramenta automaticamente reinicia o container afetado e, em caso de erros mais graves, substitui o container por uma nova instância funcional, garantindo a continuidade das operações.



Automatização

Os Kubernetes oferecem recursos avançados de automatização. É possível programar a criação automática de containers de acordo com as configurações estabelecidas. Além disso, a plataforma permite a eliminação automática de containers obsoletos e a concentração de recursos em novos containers conforme necessário, simplificando a administração e garantindo uma operação eficiente do ambiente.



Segurança da Informação

Os Kubernetes fornecem recursos robustos para garantir a segurança da informação. É possível armazenar e gerenciar informações sigilosas de forma segura, utilizando medidas como senhas, tokens e chaves de criptografia. Isso garante a integridade e a confidencialidade dos dados, mantendo um ambiente seguro para as operações do sistema.

Aplicações


Docker vs. Kubernetes

Embora muitas vezes interpretados como uma escolha entre um ou outro, o Kubernetes e o Docker são tecnologias diferentes, mas complementares para executar aplicativos em contêineres.

O Docker permite que você coloque tudo o que você precisa para executar seu aplicativo em uma caixa que pode ser armazenada e aberta quando e onde for necessário. Depois de começar a encaixotar seus aplicativos, você precisa encontrar uma maneira de gerenciá-los; e é isso que o Kubernetes faz. O próprio nome "Kubernetes" é uma palavra grega que significa "capitão", o que condiz com suas funcionalidades, uma vez que, assim como um capitão, que é responsável pela jornada segura do navio nos mares, o Kubernetes é o responsável por transportar e entregar essas caixas com segurança para os locais onde possam ser usadas.

  • O Kubernetes pode ser usado com ou sem o Docker
  • O Docker não é uma alternativa ao Kubernetes, portanto, não é uma questão de “Kubernetes vs. Docker”. Trata-se de usar o Kubernetes com o Docker para armazenar seus aplicativos em contêineres e executá-los em escala
  • A diferença entre o Docker e o Kubernetes está relacionada ao papel que cada um desempenha no armazenamento em contêiner e na execução de seus aplicativos
  • O Docker é um padrão aberto do setor para empacotar e distribuir aplicativos em contêineres
  • O Kubernetes usa o Docker para implantar, gerenciar e escalonar aplicativos em contêineres


Docker vs. Kubernetes



Kubernetes na Engenharia de Dados

Sabemos que o Kubernetes é um ótimo serviço de gerenciamento de containers. Por isso, essa ferramenta se torna útil em diferentes aplicações. Na Engenharia de Dados, área que trabalha com problemas complexos em que muitas das vezes precisamos ter uma alta escalabilidade e gerenciamento, o Kubernetes se torna uma excelente opção.

Na Engenharia de Dados, temos o Apache Airflow que é uma ferramenta muito útil para orquestração de fluxos de dados. Podemos utilizar o Airflow de uma maneira bastante manual, mas com o Kubernetes facilitamos muitos dos processos utilizando recursos que diminuem grande parte da carga de trabalho. Ao executá-lo dentro de um cluster, é possível utilizar os recursos de escalabilidade que o Kubernetes fornece.


Esquema mostrando a combinação do Apache Airflow com Kubernetes.



CERN - Organização Europeia para a Pesquisa Nuclear

CERN utiliza Kubernetes para gerenciar a infraestrutura necessária para a pesquisa científica, incluindo a análise de grandes volumes de dados dos experimentos no Grande Colisor de Hádrons (LHC). Aqui estão os principais benefícios que Kubernetes proporciona ao CERN:

Gerenciamento de Recursos Computacionais: Kubernetes distribui eficientemente cargas de trabalho computacionais em clusters, maximizando a utilização de recursos e permitindo a análise de grandes volumes de dados.

Escalabilidade Flexível: Kubernetes permite ao CERN escalar recursos rapidamente conforme necessário para suportar picos de demanda durante experimentos intensivos.

Infraestrutura Híbrida: Kubernetes facilita a integração de recursos locais com a nuvem, criando um ambiente híbrido que oferece flexibilidade e otimização de custos.

Automação de Tarefas Operacionais: Kubernetes automatiza muitas tarefas operacionais, como a implementação, o monitoramento e a manutenção dos aplicativos, liberando os cientistas de TI para se concentrar em tarefas mais críticas.

Isolamento e Segurança: Kubernetes permite a execução de aplicações em ambientes isolados (namespaces e pods), garantindo que os experimentos científicos sejam realizados de maneira segura e eficiente.


LHC - Colisor de Partículas do CERN

Desafios e Contrapontos


Complexidade

Curva de Aprendizado Íngreme: Kubernetes é uma tecnologia complexa que pode ser difícil de aprender e dominar. A configuração e o gerenciamento de clusters de Kubernetes requerem um bom entendimento de conceitos avançados de rede, segurança e infraestrutura.

Gestão Operacional: A operação de um cluster de Kubernetes pode ser desafiadora, especialmente em termos de monitoramento, manutenção e troubleshooting. O gerenciamento eficaz de recursos, pods, serviços e nós exige um conhecimento aprofundado e ferramentas de monitoramento robustas.



Custo

Kubernetes pode aumentar os custos operacionais devido à necessidade de mais recursos computacionais para executar os componentes de orquestração. Além disso, o gerenciamento e a manutenção de clusters de Kubernetes podem exigir equipes especializadas, o que pode aumentar os custos de mão-de-obra. A complexidade da infraestrutura necessária para Kubernetes pode resultar em custos adicionais, especialmente se for necessário provisionar recursos de nuvem ou hardware adicional para garantir alta disponibilidade e resiliência.



Sobrecarga de Recursos

Consumo de Recursos: Kubernetes pode introduzir uma sobrecarga significativa de recursos, já que cada nó de um cluster precisa rodar vários componentes do sistema (como kubelet, kube-proxy, etc.). Isso pode levar a um consumo adicional de CPU, memória e rede.

Eficiência Subótima: Em ambientes menores ou com cargas de trabalho menos intensivas, a sobrecarga operacional de Kubernetes pode não justificar os benefícios, resultando em eficiência subótima.



Segurança

A segurança em Kubernetes é complexa e requer a configuração correta de políticas de rede, controle de acesso baseado em função (RBAC), e gerenciamento de secrets. Uma configuração incorreta pode expor a infraestrutura a riscos de segurança. A adição de vários componentes e camadas na infraestrutura aumenta a superfície de ataque, exigindo monitoramento e gestão contínuos para manter a segurança.



Manutenção

Manutenção Contínua: Manter Kubernetes atualizado com as últimas versões e patches de segurança é crucial, mas pode ser desafiador e requer planejamento cuidadoso para evitar downtime e problemas de compatibilidade.

Atualizações de Cluster: Atualizar um cluster de Kubernetes pode ser um processo complicado, especialmente em ambientes de produção, onde a interrupção mínima é crítica.

Futuro do Kubernetes


"O futuro do Kubernetes parece promissor, com várias tendências emergentes".

Edge Computing: Kubernetes está sendo adaptado para rodar em dispositivos de borda, permitindo a orquestração de contêineres em locais remotos e em dispositivos IoT.

IA e Machine Learning: A integração de Kubernetes com frameworks de IA e ML está facilitando o treinamento e a implantação de modelos de aprendizado de máquina.

Inovações em Segurança: Com o passar do tempo, continuarão a surgir novas práticas e ferramentas para melhorar a segurança dos clusters Kubernetes.



Cloud Computing em dispositivos de borda.


Conclusão


Em resumo, Kubernetes é uma ferramenta poderosa para orquestração de contêineres que oferece uma série de benefícios, como escalabilidade, automação, segurança e eficiência operacional. No entanto, sua complexidade e custo podem representar desafios significativos para as organizações que desejam adotar a tecnologia. É importante avaliar cuidadosamente os requisitos e considerar os prós e contras antes de implementar Kubernetes em um ambiente de produção.

Em última análise, Kubernetes é uma ferramenta valiosa para gerenciar e escalar aplicativos em contêineres, mas requer um investimento significativo em termos de tempo, recursos e expertise para garantir uma implementação bem-sucedida. Com o planejamento adequado e a compreensão dos desafios envolvidos, as organizações podem aproveitar ao máximo os benefícios do Kubernetes e transformar sua infraestrutura de TI para atender às demandas de um mundo cada vez mais digital e orientado por dados.

Perguntas



1) O que é Kubernetes e qual é o seu propósito principal?


2) O que é um serviço no contexto do Kubernetes e por que é necessário?


3) Como o Kubernetes lida com o balanceamento de carga?


4) Quais são as diferenças entre Kubernetes e Docker?


5) Como o Kubernetes ajuda na escalabilidade das aplicações?




Carolina Franck Abdu - Pedro Glaser de Senna - Rafaella Lenzi