Como escalar sua jornada para nuvem com Kubernetes

Por Sabrina Souza, com colaboração de Carlos Garcia e Rodrigo Bassani

  • Kubernetes é uma plataforma de orquestração de contêineres amplamente utilizada para gerenciar e escalar aplicativos em nuvem.
  • Seu uso oferece muitas vantagens, mas também trade-offs que devem ser pesados e considerados pela organização antes de sua implementação.
  • Artigo explora casos de uso e os motivos que fazem do Kubernetes um poderoso aliado na jornada cloud de uma empresa.

A nuvem é um dos principais pilares da transformação digital, permitindo que empresas de todos os tamanhos acessem recursos computacionais poderosos, escaláveis e flexíveis sem precisar investir em infraestrutura própria. E o Kubernetes anda de mãos dadas com a transformação digital em nuvem e seus fundamentos por trás.

Isso porque Kubernetes é uma plataforma de orquestração de contêineres amplamente utilizada para gerenciar e escalar aplicativos em nuvem. Sendo assim, juntas, a nuvem e o Kubernetes são uma combinação poderosa para a escalabilidade e flexibilidade empresarial.

Mas como escalar sua jornada para nuvem com Kubernetes? Neste artigo, vamos entender alguns cenários que uma empresa pode enfrentar ao tomar a decisão de migrar uma aplicação para a nuvem, explorar algumas das principais considerações para ajudá-lo a planejar e implementar uma estratégia eficaz. Antes disso, vamos retroceder um pouco e entender melhor o que é o Kubernetes, o que é possível fazer com ele e trade-offs para escolhê-lo; e por fim, dois cases para compreendermos a aplicabilidade dele nas soluções.

Cenários para migrar uma aplicação para a nuvem

A migração para a nuvem pode trazer inúmeros benefícios para as empresas, desde redução de custos até maior eficiência e escalabilidade; contudo, avaliar quais são os motivadores de negócio que direcionam a tomada de decisão é um fator crítico de sucesso. Existem ainda cenários que inviabilizam uma migração de uma aplicação para nuvem.

Um dos principais motivadores de negócio para migrar uma aplicação é o custo. Migrar de forma eficiente pode ser uma forma de reduzir custos operacionais e de infraestrutura. No entanto, não considerar alguns requisitos não funcionais, ocultos da avaliação do cenário de migração, pode ser uma armadilha; conforme aponta o relatório da Flexera, em que descreve os principais desafios da migração, tais como entender as dependências da aplicação, viabilidade técnica, comparar o TCO (Total Cost of Ownership em inglês, ou “Custo Total de Propriedade” em português) on-premise vs cloud, entre outros.

Enfim, ter uma estratégia é importante para obter o resultado desejado, de realmente reduzir os custos.

Fonte: Flexera

Outro viés comum é o de segurança. Algumas empresas podem estar preocupadas com a segurança de seus dados na nuvem e relutar em migrar por medo de um possível vazamento de dados ou violação de segurança. No entanto, provedores de serviços em nuvem têm medidas de segurança rigorosas em vigor e oferecem níveis mais altos de segurança do que os sistemas de TI (Tecnologia da Informação) locais.

Mais um viés que podemos citar é o de controle. Algumas empresas podem preferir manter seus sistemas de TI locais para manter maior controle sobre seus dados e processos. No entanto, a nuvem pode oferecer maior flexibilidade e escalabilidade, permitindo que as empresas se concentrem em seus negócios principais, em vez de ter que gerenciar sistemas de TI locais.

O viés de conformidade também pode ser um obstáculo. Algumas empresas podem estar sujeitas a regulamentações específicas e ter requisitos de conformidade que precisam ser atendidos. No entanto, muitos provedores de serviços em nuvem podem ajudar as empresas a alcançar a conformidade regulatória.

Por fim, o viés de adoção tardia pode impedir uma empresa de adotar a nuvem. Algumas empresas podem estar atrasadas na adoção da nuvem e não estar cientes de todos os benefícios que a nuvem pode oferecer, perdendo assim oportunidades de inovação, eficiência e economia de custos.

Para concluir este tópico, é crucial mencionar um tema de extrema relevância, que é o CAF (Cloud Adoption Framework em inglês, ou “Framework de adoção da nuvem” em português). Que é um guia completo para a adoção eficiente e segura da computação em nuvem, abordando aspectos técnicos, organizacionais e operacionais. Com foco em governança, habilidades, arquitetura, segurança, operações e otimização de custos, o CAF ajuda as empresas a alinhar a nuvem aos seus objetivos, promovendo a colaboração e impulsionando a inovação. As principais plataformas de nuvem oferecem serviços focados no CAF, como por exemplo o AWS Cloud Adoption Framework da AWS.

O que é Kubernetes e o que é possível fazer com ele?

Kubernetes é uma plataforma de código aberto projetada para orquestrar a implantação, o dimensionamento e o gerenciamento de aplicativos em contêineres. Ou seja, com ele conseguimos não somente implantar uma aplicação como também escalar horizontalmente (verticalmente também) e gerenciá-la; tudo isso utilizando contêineres.

O Kubernetes surgiu com o aumento do uso de contêineres para empacotar e distribuir aplicativos e serviços, pois identificou-se a necessidade de uma solução para gerenciar esses contêineres em escala. O Kubernetes atende a essa demanda, permitindo que a equipe responsável (podendo ser engenheiros de DevOps, arquitetos de software ou até mesmo desenvolvedores de software) implante e gerencie aplicativos em contêineres de maneira eficiente e consistente em um cluster.

Além disso, o Kubernetes é altamente modular e flexível, permitindo que ele seja usado em uma variedade de cenários de implantação, desde implantações de nuvem pública até implantações em data centers privados. Na nuvem, sua utilização é padrão independentemente de qual seja o provedor de nuvem a ser utilizado, o que é um forte ponto positivo, já que não é necessário aprender a utilizá-lo para cada provedor a ser manuseado.

Mas e sobre a escalabilidade? Um dos principais benefícios do Kubernetes é justamente sua capacidade de escalar aplicativos de maneira rápida e eficiente, adicionando ou removendo contêineres de acordo com a demanda. Isso permite que os aplicativos sejam dimensionados de acordo com as necessidades do negócio, melhorando o desempenho e a disponibilidade.

Os contêineres são executados dentro de objetos chamados de pods. E uma forma simples e prática de escalar horizontalmente sua aplicação seria aumentar a quantidade de pods executando seus contêineres.

Podemos fazer um aumento de recursos sem muitas complicações, mas o tráfego “saberá” para qual recurso se encaminhar? O Kubernetes também prevê isso! Ele possui um artifício de balanceamento de carga facilmente configurável. A partir do momento que você cria um serviço Kubernetes com um balanceamento de carga padrão, a distribuição de tráfego entre os pods disponíveis é feita automaticamente. Existem três tipos de balanceamento de carga, e você pode escolher a melhor opção para a necessidade da sua aplicação.

Como o Kubernetes funciona tecnicamente?

Ao implantar o Kubernetes, obtém-se um cluster, que por sua vez consiste em um conjunto de worker nodes, que são os nós (ou simplesmente nodes). Os nodes hospedam os pods, que correspondem à unidade básica de implantação de uma aplicação.

O Kubernetes possui uma parte lógica chamada de Control Plane que gerencia os nós e os pods no cluster; por isso ele é considerado o cérebro de um cluster Kubernetes.

A imagem a seguir aponta os componentes da arquitetura Kubernetes e como é a comunicação entre eles:

No cérebro do Kubernetes podemos destacar o API server que fornece uma interface para o usuário ou para outros componentes do Kubernetes interagirem com o sistema. E o etcd que é um banco de dados distribuído que armazena as informações do estado do cluster.

Seguindo, como pode-se notar na imagem, cada nó contém o kubelet, um agente que gerencia os contêineres em execução no nó, e o kube-proxy, que fornece um proxy de rede para os pods implantados no nó.

Os contêineres são implantados nos pods, podendo haver um ou mais contêineres em um mesmo pod. E na prática, a forma mais usual e recomendada de se fazer a implantação de um pod é através de um manifesto de implantação (deployment manifest), que especifica as características do pod, como a imagem do contêiner, as portas expostas, as variáveis de ambiente e os recursos necessários, como CPU e memória.

Em seguida, o manifesto é enviado ao API Server do Kubernetes, que é responsável por armazenar a configuração do pod e propagar a alteração para outros componentes. E então, o componente do Kubernetes chamado scheduler determina o melhor nó do cluster para implantar o pod com base nas necessidades de recursos do pod e dos nós disponíveis.

O componente kubelet em cada nó do cluster é responsável por baixar a imagem do contêiner do registro de contêineres (container registry), criar e iniciar os contêineres e garantir que eles estejam em execução e se comuniquem corretamente com outros contêineres no mesmo pod e com serviços fora do pod.

O Kubernetes oferece recursos avançados para gerenciar a implantação de pods, deployments e services. O primeiro possui vários papéis fundamentais, como definir e gerenciar a quantidade de réplicas de pods em execução, escutar mudanças nas especificações e atualizar todas as réplicas quando ocorrer mudanças; além de possuir opções de regras de atualização gradual (rolling update), rollbacks, gestão de falhas e muito mais. Já os services são uma camada de abstração que define um conjunto de pods e habilita a exposição ao tráfego externo; faz balanceamento de carga, endereçamento de IP estável, podendo ter seu comportamento alterado de acordo com o tipo definido e as necessidades da solução.

Quais são os trade-offs ao optar pelo Kubernetes?

Ao escolher o Kubernetes como plataforma para gerenciar e orquestrar aplicativos em contêineres, é preciso considerar os trade-offs envolvidos. Como já vimos, o Kubernetes é uma plataforma poderosa, altamente escalável e flexível, mas também é complexa e requer habilidades técnicas avançadas para gerenciar.

Por essa razão, um dos trade-offs mais significativos do Kubernetes é sua complexidade. Aprender a usá-lo corretamente pode levar tempo e esforço, e gerenciar um cluster Kubernetes requer conhecimentos em programação, administração de sistemas e infraestrutura de rede. Além disso, o uso do Kubernetes pode implicar custos adicionais, como a necessidade de servidores dedicados e armazenamento.

Por outro lado, o Kubernetes é altamente escalável e pode lidar com cargas de trabalho pesadas. Mas, para aproveitar todo o potencial de escalabilidade do Kubernetes, é necessário configuração adequada do cluster e otimização de recursos para uso eficiente.

A segurança também é um trade-off importante no uso do Kubernetes. Embora seja uma plataforma segura por padrão, é necessário configurá-la corretamente para garantir que a infraestrutura esteja segura. A configuração adequada de redes, autenticação e autorização é essencial, bem como a implementação de práticas recomendadas de segurança em todos os níveis do stack de tecnologia.

Se flexibilidade for um requisito para a arquitetura de sua aplicação, é importante adicioná-la nos trade-offs. O Kubernetes é altamente flexível e pode ser configurado para atender a uma ampla variedade de casos de uso. No entanto, a configuração pode ser complicada e requer conhecimento técnico avançado.

Por fim, a manutenção é outro trade-off a ser considerado. O Kubernetes requer manutenção constante para garantir que o cluster esteja funcionando corretamente e atualizado com as últimas versões. Isso inclui a aplicação de atualizações de segurança, resolução de problemas e solução de problemas de rede e infraestrutura. Como contraponto, existem serviços de Kubernetes gerenciados oferecidos por algumas plataformas que facilitam significativamente essa manutenção. Um serviço de exemplo é o EKS (Elastic Kubernetes Service) da AWS, que fornece um ambiente para implantar, gerenciar e dimensionar aplicativos em containers usando o Kubernetes na infraestrutura da AWS.

Usar ou não Kubernetes? Cenário 1

Uma empresa possui salas de reunião e deseja construir uma aplicação web simples e pontual que permita que seus funcionários as reservem quando necessário. Não é esperado muitos acessos simultâneos, não há expectativas de expansão da aplicação, nem necessidade de escala horizontal ou balanceamento de carga. Detalhe: a empresa já possui uma base de dados, e a persistência deverá ser feita nela; ou seja, também não temos a necessidade de prover ou gerenciar o banco de dados.

Sendo assim, a solução corresponde simplesmente a uma aplicação web, que por sua vez foi empacotada em um contêiner Docker, deixando a arquitetura para esse projeto da seguinte forma:

  • Um servidor de hospedagem para executar o aplicativo.
  • Um contêiner Docker para a aplicação web do blog.


Assumindo que a solução ficaria na plataforma AWS, uma forma de representá-la em diagrama seria:

Kubernetes case 1

Analisando essa arquitetura simples, seria necessária a utilização do Kubernetes? A resposta é não. O seu uso traria complexidade, gastos e longo tempo de execução. Como basicamente temos apenas um elemento, que é um contêiner Docker, este é facilmente configurável em uma máquina como o EC2. E se houver demanda de um escalonamento vertical, bastaria aumentar a capacidade do servidor de hospedagem. Tudo isso sem adicionar a complexidade extra do Kubernetes.

Usar ou não Kubernetes? Cenário 2

Uma empresa que possui cerca de 1.000 (mil) funcionários possui um processo de avaliação de desempenho muito específico e customizado. Por causa disso, ela resolveu desenvolver uma solução tecnológica que atendesse a todas as necessidades. O resultado foram os seguintes elementos:

  • Microsserviço de autenticação/autorização.
  • Microsserviço para cadastros das etapas e formulários.
  • Microsserviço para as etapas de avaliações escritas.
  • Microsserviço para integração dos resultados com o ERP (sistema integrado de gestão empresarial) e demais sistemas de RH da empresa.
  • Aplicação web front-end para acesso às features do processo de avaliação.
  • Banco de dados PostgreSQL.

 

Cada elemento desses é convertido em imagem Docker. A solução completa precisar estar disponível o ano inteiro, pois funcionários dos recursos humanos precisam acessar para fazer todas as preparações necessárias para a avaliação desempenho. Porém, duas vezes por ano a quantidade de acessos aumenta exponencialmente, que é quando o período de avaliação ocorre. A empresa leva muito a sério a alta disponibilidade da aplicação.

Diante desse cenário, seria conveniente o uso do Kubernetes para prover e gerenciar a solução completa desde case? A resposta é sim!

A solução contempla diversos contêineres, necessidade de balanceamento de carga, alta disponibilidade, aumento da capacidade horizontal em certos períodos, gestão de falhas. Todos esses são requisitos que, sem o uso do Kubernetes, seriam difíceis de ser atendidos; e, como vimos, todas estas características são atendidas pelo Kubernetes, bastando a configuração correta.

Novamente assumindo que a solução ficaria na plataforma AWS, uma forma de representá-la em diagrama seria:

Neste ponto podemos fazer algumas explicações:

  • O diagrama poderia ter sido feito de n formas diferentes, mas nos preocupamos em trazer uma visão de service Kubernetes, representando as quantidades de réplicas de pods que cada camada poderia ter.
  • Cada camada foi abstraída por um service que faz o balanceamento de carga (LB) entre os pods (representados por “ui”, “api” e “postgres”).
  • O ReplicaSet (rs) garante a quantidade de réplicas de pods definida no manifesto.
  • E o deployment assegura o gerenciamento das réplicas.

Com a solução arquitetônica modularizada e distribuída desta forma, garantimos todos os requisitos, além de diversos outros benefícios como acesso facilitado a logs e configurações, manutenção através de código (manifestos), facilidade de deploy de novas versões, e muito mais!

Como escalar sua jornada para nuvem com Kubernetes?

Agora que sabemos um pouco melhor do que é Kubernetes, do que é possível fazer com ele, seus recursos e funcionalidades, podemos conversar sobre como você poderia conceber uma jornada para a nuvem com o Kubernetes. Este percurso poderia ser seguido em nove passos objetivos e bem definidos que dissecamos nos tópicos abaixo.

Estudo e entendimento da ferramenta

Para utilizar o Kubernetes de forma eficaz na escalada para nuvem, é fundamental realizar um estudo completar da ferramenta. É necessário compreender conceitos básicos, arquitetura, comandos e ferramentas, e boas práticas e padrões para garantir a segurança e eficiência dos aplicativos. Isso permitirá que você utilize o Kubernetes de forma eficaz, garantindo a execução eficiente e escalável dos aplicativos na nuvem.

Planejamento

Antes de começar a usar Kubernetes, você precisa planejar como usá-lo da maneira mais eficiente para atender às suas necessidades. Considere fatores como a quantidade de tráfego que você espera receber, a capacidade de processamento necessária para executar seus aplicativos e quais recursos do Kubernetes são mais adequados para suas necessidades.

Escolha uma plataforma de nuvem

Como mencionado na seção anterior, o Kubernetes pode ser executado em várias plataformas de nuvem, incluindo Amazon Web Services, Google Cloud Platform e Microsoft Azure. Então nesta etapa é necessário que você escolha uma plataforma que atenda às suas necessidades e que ofereça suporte para Kubernetes.

Criação do Cluster Kubernetes

Um cluster Kubernetes consiste em um conjunto de máquinas virtuais (ou físicas) que executam o Kubernetes e podem ser usadas para executar seus aplicativos. Neste passo você precisará criar um cluster Kubernetes em sua plataforma de nuvem escolhida.

Implementação de contêineres

Kubernetes é uma plataforma de orquestração de contêineres, portanto, você precisará criar seus contêineres e, em seguida, implantá-los em seu cluster Kubernetes. Existem várias ferramentas disponíveis para ajudá-lo a criar e gerenciar contêineres, incluindo o Docker.

Gerenciamento de tráfego

Na seção anterior citamos um pouco do benefício de balanceamento de carga que o recurso Service do Kubernetes disponibiliza. Mas nesta etapa você precisará ir além, pois o gerenciamento de tráfego é uma das características mais importantes de uma aplicação. Ter em mente que o Kubernetes oferece recursos como Services e Ingresses para expor aplicativos dentro e fora do cluster e balancear a carga de serviços, além de roteamento de tráfego avançado com o Canary Deployment. O gerenciamento eficiente de tráfego garante que os aplicativos estejam disponíveis e funcionando de forma confiável, mesmo em alta demanda, e ajuda a reduzir os custos de infraestrutura.

Monitoramento e registro

O monitoramento e registro são etapas importantes para o gerenciamento de aplicações. Ferramentas como Prometheus, Grafana e Elasticsearch permitem coletar e visualizar métricas importantes e logs de diferentes pods e contêineres em um único local. Além disso, oferecem suporte ao Kubernetes. Ao monitorar de perto o desempenho e o registro de aplicativos, é possível identificar problemas rapidamente e minimizar o tempo de inatividade, além de identificar oportunidades de otimização da infraestrutura e dos aplicativos.

Automação

A automação é um passo fundamental na escalada para nuvem com Kubernetes, pois permite automatizar o gerenciamento de infraestrutura e aplicativos. O Kubernetes oferece ferramentas como o Helm e o Operators para criar pacotes de aplicativos reutilizáveis e automatizar o gerenciamento de aplicativos complexos, respectivamente. Além disso, o Kubernetes fornece recursos de automação, como a implantação automática de atualizações e escalonamento automático com base na demanda do aplicativo, ajudando a garantir a disponibilidade contínua dos aplicativos e a escalabilidade eficiente da infraestrutura. A automação também pode reduzir custos e melhorar a eficiência operacional, liberando recursos para outras tarefas importantes.

Treinamento

O treinamento pode ser a etapa de fechamento desta jornada, já que a tecnologia é complexa e requer conhecimentos técnicos específicos para implantar e gerenciar aplicativos. A equipe deve ter um bom entendimento dos conceitos básicos e avançados do Kubernetes, bem como das ferramentas de monitoramento e registro, e as certificações em Kubernetes podem ajudar a avaliar a expertise técnica da equipe. O treinamento constante é fundamental para manter a equipe atualizada com as mudanças na tecnologia e nas melhores práticas de segurança e eficiência operacional.

Conclusão: a importância de uma abordagem estruturada

Em conclusão, a escalada para nuvem com Kubernetes pode oferecer muitos benefícios às empresas, como escalabilidade, agilidade, eficiência operacional, modernidade e elegância arquitetural. Para garantir o sucesso nessa jornada, é importante seguir uma abordagem estruturada, que inclua estudo e entendimento da ferramenta, escolha da plataforma de nuvem, gerenciamento de tráfego, monitoramento e registro, automação e treinamento constante da equipe.

Com a abordagem correta, as empresas podem aproveitar ao máximo os benefícios do Kubernetes e superar os desafios que a tecnologia apresenta, como complexidade e curva de aprendizado íngreme. O Kubernetes é uma tecnologia que compreende um universo de recursos e está em constante evolução, e a jornada para a nuvem com ele pode ser uma busca contínua pela excelência operacional e eficiência. Com o compromisso da equipe em aprender e aprimorar continuamente suas habilidades em Kubernetes, a jornada pode levar a uma transformação digital bem-sucedida da empresa.

SABRINA SOUZA é Desenvolvedora na EloGroup. 

CARLOS GARCIA é Arquiteto de Sistemas na EloGroup. 

Rodrigo Bassani é CTO e Partner na EloGroup. 

Enviar por email