Guto Carvalho # 2022-01-05 @ BSB
Guto Carvalho # 2022-01-05 @ BSB

 Entendendo o Kubernetes & Cloud Native

by

Bora entender isso e ficar na mesma página? Vem com a gente!

Me siga no twitter @gutocarvalho e acompanhe meus posts sobre Cloud Native e CI/CD.

Siga a CD Foundation e Cloud Native Foundation no twitter.

O que é?

O kubernetes é um orquestrador de containers que oferece meios para você executar, escalar e atualizar seu software de forma simples e eficiente.

Com o kubernetes podemos automatizar a implantação de nosso software integrando nossa pipeline com um cluster de containers, conseguindo assim entregar nosso software de maneira rápida e controlada.

Origens

Em 2014 o google liberou um projeto open source interno que orquestrava containers, ele foi a base para o Kubernetes.

Curiosidades sobre as origens

No Google, internamente o projeto se chamava BORG.

O projeto BORG foi reescrito em GO e foi rebatizado de Kubernetes.

Kubernetes significa timoneiro – em grego, aquele que pilota uma embarcação.

A primeira release do kubernetes foi lançada em 7 de Junho de 2014.

Cloud Native Computing Foundation ou CNCF

O Google queria algum lugar para hospedar não só o projeto Kubernetes em si, mais um lugar em que todos pudessem contribuir com o projeto e criar novas soluções para esse segmento de aplicações rodando em containers.

Com essa ideia em mente, o Google entrou em contato com a Linux Foundation para criar uma estrutura que pudesse receber esse projeto e fomentar tecnologias e soluções ligadas a esse novo universo de containers.

A Linux Foundation criou então a CNCF, Cloud Native Computing Foundation para fomentar o desenvolvimento do Kubernetes e de tecnologias com foco em containers. O Termo Cloud Native foi cunhado e passou a ser utilizado para se referir aplicações desta natureza.

A CNCF foi fundada e teve seu anúncio junto com o lançamento da versão 1.0 do Kubernetes em 21 de Julho de 2015.

Como funciona ?

O Kubernetes ou K8S como é chamado de forma abreviada é um orquestrador que foi desenhado para gerenciar workloads de containers e serviços de forma automatizada, utilizando configuração declarativa que usa o estrutura e formato de dados do projeto YAML.

Isso significa que podemos definir o estado desejado de funcionamento de nosso cluster e também das aplicações rodando neste, apenas utilizando convenções em YAML. Os operadores do cluster vão ler essas definições e garantir esse estado, fazendo modificações quando for necessário.

O kubernetes oferece:

  • Serviço de descoberta
  • Serviço de balanceamento de carga
  • Serviço de proxy
  • Gerenciamento de redes e sub-redes
  • Gerenciamento de DNS
  • Orquestração de storage para os containers
  • Automação de rollouts ou rollbacks de suas aplicações
  • Gerenciamento dos certificados com geração e renovação automática
  • Gerenciamento de configuraçoes (configmaps)
  • Gerenciamento de segredos (secrets)
  • Gerenciamento de jobs (cronjobs)
  • Gerenciamento de limites de recursos para cada container
  • Self-healing, ele reinicia ou substitiu um container em caso de falha

Em resumo, o kubernetes vai oferecer tudo que é necessário para sua aplicação rodar e ser utilizada por seus usuários.

Por que chamam o K8S de OS de Datacenter?

Em alguns treinamentos ou palestras você pode ouvir o pessoal falando que o Kuberneters – antigo BORG – é um sistema operacional de datacenter, e tudo bem, faz sentido falar isso.

Se obervarmos com cuidado, vamos ver que o kubernetes oferece tudo que um software precisa, indo do endereço ip, rede, storage, balanceamento, dns, certificado, configurações, segredos, em suma, ele traz tudo que um datacenter ofereceria para uma aplicação em um lugar só, e essa é beleza e a força do projeto.

É de fato um datacenter inteiro em uma única solução.

Quais os benefícios?

Como o kubernetes oferece tudo que sua aplicação precisa, você tem mais tempo para se preocupar com o negócio, isso pode melhorar sua produtividade e reduzir tempo gasto com configurações comuns geralmente executadas em sua infraestrutura clássica.

O cluster kubernetes te ajuda a usar os recursos computacionais de forma mais eficiente. Como tudo roda em containers, você consegue compartilhar mais recursos computacionais com diferentes aplicações sendo executadas no cluster.

O processo de entrega e o ciclo de desenvolvimento do software pode ser sensivelmente reduzido depois que você integrar o cluster ao seu processo de desenvolvimento.

Uma vez que sua aplicação está rodando em Kubernetes, você conseguirá rodá-la praticamente em quaisquer cloud pública que suporte kubernetes. Essa portabilidade é muito importante e oferece a capacidade de seu software funcionar em diferentes clouds, podendo escolher aquela com melhor custo, ou até replicar sua aplicação em provedores diferentes para garantir mais disponibilidade.

Ao usar aplicações dentro do cluster, você conseguirá reduzir sensivelmente o custo de sua conta em uma Cloud Pública, isso acontece pois o Kubernetes já traz a maioria dos recursos de forma nativa, reduzindo assim dua despesa no final do mês.

O Kubernetes é o orquestrador líder de mercado, é comprovadamente estável, é mantido por diversas empresas incluindo o Google e foi testado em produção em diversos cenários com sucesso, o que nos garante que não estamos embarcando em uma aventura com uma tecnologia com pouca maturidade. Existem muitos cases de aplicações de missão crítica rodando em clusters Kubernetes, se é eficiente para eles, é eficiente para você.

É realmente seguro?

Sim é seguro, contudo, como qualquer outro software ou plataforma a segurança tem que fazer parte de suas preocupações desde o momento do design de seu cluster.

Coisas como:

  • Escolher uma distribuição kubernetes certificada pela CNCF
  • Escolher um OS base mínimo, com foco em K8S
  • Remover credenciais e acessos desnecessários
  • Evitar rodar qualquer coisa com privilégios de ROOT
  • Seguir todas as boas práticas de segurança para clusters K8S
  • Fazer o hardeding de seus clusters
  • Instalar ferramentas para verificar a segurança de seu cluster regularmente
  • Centralizar e acompanhar os logs do cluster e das APPs
  • Centralizar e acompanhar as métricas do cluster e das APPs
  • Inserir segurança no processo de desenvolvimento de suas APPS desde o dia zero

Seguindo essas dicas você terá tanto um cluster quando APPs seguras rodando nele.

Consigo rodar meu software nele?

Consegue sim, mesmo se for um monolito.

Diferente do que muitos pensam o Kubernetes pode rodar qualquer software que esteja embarcado em um container, seja um monolito, um microserviço ou uma API.

Obviamente se você estiver iniciando o desenvolvimento do seu software o ideal é pensar em decompor sua solução em microserviços que se comunicam via API, pensar em aplicações do tipo stateless, pensar em aplicações que podem rodar em múltiplos nodes e pods, pensar em uso de banco de dados externo, pensar em persistência e armazenamento de arquivos usando storage de objetos – estilo S3 – dentre outras boas práticas de APPs Cloud Native.

Seguindo essas dicas, você terá de fato uma aplicação Cloud Native que poderá usar o melhor do Kubernetes. Sua aplicação conseguirá escalar horizontalmente e atender a demanda crescente de seus usuários.

Consigo rodar Kubernetes on-premisses?

Sim consegue, existem excelentes distribuições para rodar On-Premisses, uma delas é o RKE da Rancher.

Quando falamos de on-premisses, precisamos pensar em um desenho robusto de nosso cluster, lembrar que precisamos de redudância entre hypervisors, backup real e eficiente, load balancer L4, centralização de logs, monitoramento, avaliação de métricas e performance, gerenciamento de certificados dentre outras coisas que precisam ser configuradas e levadas em conta para termos um cluster on-premisses rodando de forma segura, estável e performática.

Consigo rodar Kubernetes em meu provedor de nuvem?

Sim consegue também, rodando em instâncias virtuais da mesma forma como rodaria on-premisses ou usando serviços gerenciados do provedor.

Vale a pena usar o kubernetes gerenciado?

Vale muito, especialmente se seu time é mais focado em desenvolvimento do que em infraestrutura.

No caso de plataformas gerenciadas como EKS da AWS, GKS do Google, AKS da Azure, OKE da Oracle ou mesmo o Kubernetes gerenciado da Jelastic/SaveinCloud toda a parte da configuração e funcionamento do cluster, em especial os nós de controle, são mantidos pelo provedor, você só se preocupa com seus workloads e os nós do tipo worker que serão registrados no cluster que foi criado.

Com um kubernetes gerenciado você pode focar em seu negócio e deixar a infra com o provedor, é o melhor cenário para uma empresa com um time pequeno de desenvovledores ou um time sem engenheiros de nuvem.

O que são aplicações Cloud Native?

Aplicações Cloud Native são aquelas que já são construídas pensando em se beneficiar de recursos da computação em nuvem. E neste caso, isso esta intimamente ligado ao uso de containers e a orquestração destes.

Características de aplicações Cloud Native

  • Uso da Cultura DevOps no dia-a-dia do time do produto
  • Uso de métodos ágeis no desenvolvimento do produto
  • Uso de arquitetura de microserviços e API-First
  • Foco em oferecer métricas de seus componentes desde o dia zero
  • Foco em oferecer amplo monitoramento de suas features desde o dia zero
  • Foco em portabilidade e execução multi-cloud desde o dia zero
  • Abstração de sistema operacional com uso de containers
  • Uso de pipelines de integração contínua no processo de desenvolvimento
  • Uso de pipelines de entrega contínua para publicar seu software
  • Software desenhado para rodar como “Stateless”
  • Software pensado para uso de storage de objetos ao invés de filesystem
  • Software pensado para funcionar em cenários de escalabilidade horizontal
  • Software pensado para rodar em clusters de containers como kubernetes ou nomad
  • Software pensado para ser resiliente a falhas, onde possamos usar chaos engineering para testá-lo
  • Foco na rápida entrega de atualizações e novidades para seus usuários
  • Foco na capacidade de fazer rollback de forma fácil e simples caso seja nesessário

Eu acrescentaria ainda:

  • Suporte nativo a Kubernetes e Docker

Basicamente são essas as características que representam uma APP Cloud Native hoje, pelo menos em minha humilde opinião.

Amarrando as pontas

Espero que eu tenha conseguido explicar o projeto Kubernetes e o conceito de Cloud Native para você.

Em breve falaremos da arquitetura do Kubernetes! :)

[s]
Guto


Este post é do tipo #TLDR, entenda aqui.

Se gostou manda um alo no twitter @gutocarvalho.