cd ..
KUBERNETES

Boas práticas para Deployments no Kubernetes: organizando aplicações para produção

Boas práticas para Deployments no Kubernetes: organizando aplicações para produção

Saber criar um Deployment é importante. Mas saber mantê-lo organizado e preparado para produção é o que realmente diferencia um ambiente profissional de um laboratório.

Ao longo desta série conhecemos praticamente todos os recursos fundamentais dos Deployments.

Aprendemos a criar aplicações, entender a estrutura do manifesto, realizar atualizações, configurar estratégias de rollout e executar rollbacks.

Neste último artigo vamos reunir tudo isso e apresentar algumas boas práticas que fazem parte do dia a dia de equipes DevOps e SRE.


Recapitulando o ciclo de vida de um Deployment

Antes de falar sobre boas práticas, vale lembrar como funciona o fluxo completo.

Criar Deployment


Deployment cria ReplicaSet


ReplicaSet cria Pods


Aplicação entra em execução


Atualização


Novo ReplicaSet


RollingUpdate


Nova revisão


Rollback (se necessário)

Todo esse processo acontece automaticamente graças ao Deployment.


Sempre utilize manifestos versionados

Um dos erros mais comuns de quem está começando é criar recursos apenas utilizando comandos do kubectl.

Embora isso seja útil para estudos, ambientes reais normalmente utilizam arquivos YAML armazenados em um repositório Git.

Por exemplo:

kubernetes/

├── namespace.yaml

├── deployment.yaml

├── service.yaml

├── ingress.yaml

└── configmap.yaml

Dessa forma fica muito mais fácil revisar alterações, restaurar versões anteriores e trabalhar em equipe.


Utilize Namespaces para organizar recursos

Evite concentrar todas as aplicações no Namespace default.

Em vez disso, crie ambientes separados.

default

dev

staging

production

monitoring

Essa organização facilita permissões, monitoramento e administração do cluster.


Dê nomes consistentes aos recursos

Evite nomes genéricos.

Por exemplo.

Em vez de:

deployment1

Prefira:

api-pedidos

frontend-web

nginx-ingress

payments-api

Quanto mais descritivo for o nome, mais fácil será administrar o ambiente.


Padronize Labels

As Labels são utilizadas por diversos componentes do Kubernetes.

Uma boa padronização facilita filtros e integrações.

Exemplo.

metadata:
  labels:
    app: api-pedidos
    environment: production
    team: plataforma

Depois podemos consultar recursos facilmente.

kubectl get pods \
    -l environment=production

Ou.

kubectl get deployments \
    -l team=plataforma

Sempre defina Requests e Limits

Um Deployment sem limites de recursos pode causar diversos problemas.

O recomendado é definir ambos.

resources:

  requests:
    cpu: "300m"
    memory: "128Mi"

  limits:
    cpu: "800m"
    memory: "512Mi"

Isso ajuda o Scheduler a distribuir melhor as cargas e evita que um único container consuma recursos excessivos do nó.


Utilize RollingUpdate sempre que possível

Na maioria das aplicações modernas, o RollingUpdate é a melhor escolha.

strategy:
  type: RollingUpdate

  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

Essa configuração mantém a aplicação disponível durante praticamente toda a atualização.

A estratégia Recreate deve ser reservada apenas para aplicações que realmente não suportam duas versões executando simultaneamente.


Configure revisionHistoryLimit

Guardar centenas de revisões normalmente não faz sentido.

Uma configuração simples costuma ser suficiente.

spec:
  revisionHistoryLimit: 5

Assim o histórico permanece útil sem ocupar recursos desnecessários.


Monitore os rollouts

Após cada atualização é uma boa prática verificar se tudo ocorreu corretamente.

kubectl rollout status deployment \
    nginx-deployment \
    -n giropops

Resultado esperado.

deployment "nginx-deployment" successfully rolled out

Caso exista algum problema, você descobrirá imediatamente.


Utilize describe para troubleshooting

Sempre que algum Deployment apresentar comportamento inesperado, o primeiro comando normalmente é:

kubectl describe deployment \
    nginx-deployment \
    -n giropops

Ele mostra informações importantes como:


Acompanhe os Pods

Outro hábito importante é verificar continuamente os Pods durante uma atualização.

kubectl get pods \
    -n giropops

Ou acompanhar em tempo real.

kubectl get pods \
    -w \
    -n giropops

O parâmetro -w (watch) mantém a saída sendo atualizada automaticamente conforme os Pods mudam de estado.


Faça rollbacks quando necessário

Nem toda atualização será perfeita.

Quando surgir algum problema.

kubectl rollout undo deployment \
    nginx-deployment \
    -n giropops

Ou para retornar a uma revisão específica.

kubectl rollout undo deployment \
    nginx-deployment \
    --revision=4 \
    -n giropops

Em ambientes de produção, voltar rapidamente para uma versão estável costuma ser muito mais importante do que tentar corrigir a aplicação imediatamente.


Checklist antes de aplicar um Deployment

Antes de executar um kubectl apply, vale conferir alguns itens.

ItemVerificado?
Namespace correto
Labels padronizadas
Selector compatível com o template
Requests e Limits definidos
Estratégia de atualização escolhida
revisionHistoryLimit configurado
Imagem correta

Esse pequeno checklist ajuda a evitar boa parte dos erros mais comuns.


Fluxo recomendado

Uma rotina bastante utilizada em ambientes profissionais pode ser representada assim.

Editar deployment.yaml


Revisar alterações


Git Commit


kubectl apply


rollout status


Aplicação funcionando


Rollback (se necessário)

Perceba que praticamente todo o trabalho acontece sobre os arquivos YAML.

O cluster apenas recebe o estado desejado.


O que estudar depois?

Agora que você domina os Deployments, alguns dos próximos assuntos naturais dentro do Kubernetes são:

Todos esses recursos trabalham em conjunto com os Deployments e fazem parte do dia a dia de quem administra clusters Kubernetes.


Resumo da série

Durante esta série aprendemos:

ParteConteúdo
1O que é um Deployment
2Selector, Template e ReplicaSet
3Criando Deployments com YAML e kubectl
4Atualizando Deployments
5RollingUpdate, maxSurge e maxUnavailable
6Estratégia Recreate
7Revision History e Rollback
8Boas práticas para produção

Esses conhecimentos formam uma base sólida para trabalhar com Deployments em ambientes reais.


Conclusão

Os Deployments estão entre os recursos mais importantes do Kubernetes.

Eles simplificam o gerenciamento das aplicações, automatizam atualizações, mantêm o estado desejado do cluster e oferecem mecanismos seguros para recuperação em caso de falhas.

Mais do que decorar comandos, compreender o funcionamento interno dos Deployments permite tomar decisões melhores durante o desenvolvimento e a operação de aplicações em produção.

A partir dessa base, você estará preparado para avançar para outros recursos fundamentais do ecossistema Kubernetes, construindo aplicações cada vez mais resilientes, escaláveis e fáceis de administrar.


Referências

O que achou?