Um guia crítico sobre Kubernetes
- Kubernetes ganhou a reputação, entre alguns profissionais técnicos, de ser desnecessariamente complexo e uma perda de tempo, e seu uso por equipes pequenas é visto como excesso de engenharia.
- Na Jamsocket, após alguns anos operando Kubernetes em produção, eles encontraram uma forma eficiente de usá-lo: utilizar apenas os recursos necessários e ignorar o restante.
Por que usar Kubernetes
- Kubernetes é o caminho mais consolidado quando você quer estas três coisas ao mesmo tempo:
- Executar vários processos/servidores/tarefas agendadas.
- Executá-los com redundância e distribuir a carga.
- Configurar, em código, suas definições e relações mútuas.
- Kubernetes é uma camada de abstração que permite tratar um conjunto de computadores como se fosse um único computador sem cabeça (
headless).
- A Jamsocket faz deploy várias vezes por dia, e quando há um problema no produto, o produto dos clientes também é afetado; por isso, eles ganham confiança para fazer deploys frequentes por meio de rolling deploys.
Como usam Kubernetes
- A Jamsocket é um serviço que cria processos dinâmicos capazes de se comunicar com apps web, semelhante ao AWS Lambda, mas a vida útil do processo depende de uma conexão WebSocket, e não de uma única requisição/resposta.
- Kubernetes é usado para operar processos de longa duração, como servidor de API, registro de contêineres, controladores, coletores de logs, alguns serviços de DNS e coleta de métricas.
- O que eles não usam no Kubernetes: processos temporários, sites estáticos/de marketing e qualquer coisa que armazene dados diretamente.
- Eles usam o Google Kubernetes Engine para terceirizar a gestão do Kubernetes, e, se necessário, a migração para o Amazon EKS é relativamente simples.
Recursos do Kubernetes usados ativamente
- Deployments: a maioria dos pods é criada por meio de deploys.
- Services: usam
ClusterIP para serviços internos e LoadBalancer para serviços externos.
- CronJobs: usados para scripts de limpeza e afins.
- ConfigMaps e Secrets: usados para passar dados aos recursos acima.
O que usam com cautela
- Eles usam
StatefulSet e PersistentVolumeClaim, mas preferem armazenar dados importantes em serviços gerenciados fora do Kubernetes.
- Evitam RBAC sempre que possível, porque isso adiciona complexidade.
O que evitam ativamente
- Escrever YAML manualmente: usam TypeScript e Pulumi para gerar as definições de recursos do Kubernetes.
- Recursos não padronizados e operadores: permitem que softwares de terceiros usem a infraestrutura do Kubernetes, mas na prática são difíceis de usar.
- Helm: não usam por causa dos operadores e das convenções de YAML.
- Tudo que tenha "mesh" no nome: consideram desnecessário.
- Recursos de Ingress: evitam adicionar indireção desnecessária.
- Replicar toda a stack de k8s localmente: usam Docker Compose ou scripts próprios para iniciar apenas as partes necessárias do sistema.
Pessoas não deveriam esperar por um Pod
- Kubernetes foi projetado com foco em robustez e modularidade, mais do que em tempo de inicialização de contêineres, e não é adequado para casos em que uma pessoa precisa esperar o pod iniciar.
- A Jamsocket usa o Plane, um orquestrador em Rust sob licença MIT, para agendar e executar rapidamente processos para cargas de trabalho interativas.
Abstrações de nível mais alto
- Algumas alternativas ao Kubernetes são muito boas, especialmente quando não é necessário definir a infraestrutura como código.
- Também é possível escolher outras soluções no lugar do Kubernetes usando serviços como Railway, Render e Flight Control.
- Se você gerenciar sua abordagem ao Kubernetes de forma sistemática, ninguém poderá dizer que é cedo demais.
Opinião do GN⁺
- Kubernetes é uma ferramenta poderosa para gerenciar complexidade e automação, especialmente em sistemas de grande escala, mas sua complexidade pode ser um fardo para projetos menores ou startups.
- Este texto ajuda iniciantes e equipes pequenas a aproveitar os benefícios do Kubernetes ao mostrar como evitar a complexidade excessiva que pode surgir ao usá-lo.
- Antes de usar Kubernetes, é preciso considerar os recursos realmente necessários e a capacidade técnica da equipe, avaliando cuidadosamente os benefícios em relação à complexidade e ao custo de gestão.
- Em vez de Kubernetes, pode ser melhor usar serviços mais simples e fáceis de gerenciar. Por exemplo, Docker Swarm, Apache Mesos e Nomad, cada um com seus próprios prós e contras.
- Ao adotar Kubernetes, é preciso considerar a integração com a infraestrutura existente, segurança, custos de gestão e curva de aprendizado.
- Os benefícios de escolher Kubernetes incluem escalabilidade, alta disponibilidade e uma experiência de deploy consistente em diferentes ambientes de nuvem. No entanto, isso exige entendimento sobre gestão de recursos e orquestração.
1 comentários
Comentários no Hacker News
Resumo do primeiro comentário:
Resumo do segundo comentário:
kubectl explain Xé muito melhor do que a documentação da AWS.Resumo do terceiro comentário:
Resumo do quarto comentário:
Resumo do quinto comentário:
Resumo do sexto comentário:
Resumo do sétimo comentário:
Resumo do oitavo comentário:
Resumo do nono comentário:
Resumo do décimo comentário:
deployments,services,configmaps), e o resto deve ser usado apenas em situações especiais.kustomizepara manter a configuração clara e explícita.