Esta publicação foi revisada e ampliada em uma discussão, registrada em vídeo, no canal da EximiaCo.
Muitos times estão empolgados para começar a utilizar Kubernetes, graças aos recursos oferecidos que favorecem a resiliência, elasticidade, portabilidade e confiabilidade. Alguns desenvolvedores querem ganhar experiência com a plataforma para adicionar mais uma skill altamente demandada em seu currículo, outros são entusiastas de tecnologia e buscam uma oportunidade para conhecer mais a respeito. Em geral, a maioria dos desenvolvedores hoje gostaria de trabalhar com Kubernetes em algum momento.
Porém em que cenários a utilização do Kubernetes é realmente justificável? Para responder essa pergunta, vamos analisar alguns fatores a levar em consideração ao escolher quando utilizar o Kubernetes, e principalmente, quando não utilizá-lo.
#1 – Foi desenhado para problemas de arquitetura distribuída
Como explicado na documentação oficial do Kubernetes:
O Kubernetes oferece uma ferramenta de trabalho para executar sistemas distribuídos de forma resiliente. Ele cuida de fatores de escala e pontos de falha para sua aplicação, oferece padrões de entrega, e mais.
Ele não é feito exclusivamente para sistemas distribuídos, mas para aplicações conteinerizadas. Ainda assim, ele oferece diversos recursos que facilitam o gerenciamento e escala de sistemas distribuídos, como soluções de microsserviços. Também é considerado um sistema de orquestração.
O que é orquestração?
Automação e orquestração são conceitos diferentes, mas relacionados. Com a automação, você aumenta a eficiência dos negócios com a redução ou a substituição da interação humana por sistemas de TI. No lugar de pessoas, aplicações são usadas para executar tarefas e, assim, reduzir os custos, a complexidade e os erros.
Em geral, a automação está relacionada à automatização de uma tarefa individual. Por outro lado, a orquestração possibilita automatizar processos ou fluxos de trabalho que incluem várias etapas em diferentes sistemas. Depois de incorporar a automação aos processos, é possível orquestrá-los para execução automática.
Em outras palavras, o Kubernetes torna mais fácil gerenciar soluções complexas que seriam difíceis de sustentar sem um sistema de orquestração apropriado. Apesar de ser possível implementar essas práticas de engenharia de DevOps “do zero”, isso não é escalável se você vai de dezenas até centenas de serviços.
Nada impede que soluções monolíticas sejam hospedadas no Kubernetes, porém as vantagens que essa plataforma oferece para sistemas distribuídos não representam nenhum benefício real para aplicações monolíticas.
#2 – Kubernetes é complexo
Para usufruir as vantagens dos recursos disponíveis no Kubernetes, os desenvolvedores e operadores precisam ter conhecimento de contêineres, redes, segurança, portabilidade, resiliência e do Kubernetes em si. Para usar adequadamente seus workloads, você deve conhecer como cada componente funciona. Para gerenciar um cluster, você deve entender sua arquitetura, armazenamento, API e funções administrativas, que são muito diferentes de ambientes virtualizados tradicionais. Para expandir a solução, você deve saber como integrar ferramentas de deploy, monitoramento e tracing, como Helm e Istio. Muitos novos conceitos vêm com o uso da plataforma, e seu time precisa estar preparado para esse desafio.
Os desafios técnicos que a plataforma traz tanto para os desenvolvedores quanto para os operadores deve ser levado em consideração na escolha da plataforma. Você possui especialistas disponíveis em sua equipe ou está disposto a investir em contratações e em capacitação para utilizar o Kubernetes de maneira apropriada?
#3 – Kubernetes é caro para soluções pequenas
Para entender o motivo, vamos reforçar um dos conceitos chave do Kubernetes – resiliência. Para usufruir disso, você precisa de nodes adicionais, ou seja, acima da quantidade mínima necessária para executar suas aplicações. Se um dos nodes cair, os pods requisitados serão realocados nos nodes disponíveis. No caso de ambientes de produção, ao menos três nodes são recomendados para resiliência.
É fácil de supor que, caso você tenha apenas uma aplicação para hospedar sem necessidade tão alta de escala, essa infraestrutura seja um exagero. Mas ainda que você tenha dez aplicações ou mais, você precisa considerar se o custo do cluster vale o esforço de sua manutenção.
O custo de manter o ambiente também inclui o suporte operacional. Quanto mais complexa a plataforma, mais pessoas especializadas deveriam ser envolvidas. Isso pode implicar em contratar uma empresa terceira especializada em fornecer suporte ao Kubernetes, ou adquirir uma solução com serviços de suporte inclusos, como o Openshift.
Quando escolher o Kubernetes?
Dependendo da arquitetura usada, do número de aplicações envolvidas e grau de dependência entre elas, e a capacidade operacional do seu time, é possível verificar se o Kubernetes é a escolha apropriada dentre todas as tecnologias disponíveis.
Com Web Apps for Containers, você possui um ambiente completamente capacitado para produção. A partir do plano Standard, recursos de SSL e monitoramento estão incluídos, e é possível ter um ambiente seguro, escalado e monitorado com pouco esforço operacional.
Se você lida apenas com aplicações isoladas, ou um número pequeno de aplicações conectadas, talvez uma combinação de Azure Web Apps e Azure Container Instances rodando na mesma rede virtual poderia ser o suficiente.
Por outro lado, se você possui um número crescente de aplicações contêinerizadas, hospedá-las no Kubernetes pode ser interessante. Você poderá hospedar diversos tipos de aplicações, como aplicações web, API’s e jobs recorrentes em um único ambiente centralizado. Seu time poderá se focar em uma única plataforma ao invés de várias plataformas de hospedagem distintas.
Agora, se você lida com cenários distribuídos, como microsserviços, então vá em frente. Arquiteturas distribuídas são complexas, e o Kubernetes foi desenhado para facilitar seu gerenciamento. Não consigo pensar em nenhuma plataforma tão completa e extensível para soluções distribuídas quanto o Kubernetes.
Conclusão
Se você lida com um número pequeno de aplicações, com pouca ou nenhuma dependência entre si, outras opções de hospedagem como Azure Web Apps para Containers ou Azure Container Instances – ou uma combinação delas – pode ser mais simples ou possuir melhor custo-benefício.
Se o seu time está confortável com os conceitos e o uso de Kubernetes, e você possui uma quantidade crescente de aplicações contêinerizadas, pode ser interessante centralizar sua hospedagem em uma única plataforma, como o Azure Kubernetes Service.
Kubernetes é uma plataforma desenhada para aumentar a performance e reduzir o esforço operacional de sistemas distribuídos. Isso basicamente faz com que um cenário complexo, como microsserviços, fique menos operacionalmente complexo.
[tweet]Se seu cenário não lida com um número grande de aplicações, não envolve arquitetura distribuída ou seu time não possui especialistas suficientes, não será possível usufruir das vantagens que o Kubernetes oferece porque elas não foram feitas para o seu cenário. [/tweet]Você vai acabar adicionando uma complexidade acidental indesejada para a sua solução.