cd ..
KUBERNETES

Estratégia Recreate no Kubernetes: quando derrubar todos os Pods faz sentido

Estratégia Recreate no Kubernetes: quando derrubar todos os Pods faz sentido

“O RollingUpdate sempre é a melhor estratégia.” Na maioria das vezes, sim. Mas existem cenários em que utilizar o Recreate é a escolha mais segura.

Nos artigos anteriores vimos como o RollingUpdate atualiza uma aplicação sem interromper completamente o serviço.

Entretanto, nem todas as aplicações suportam duas versões executando ao mesmo tempo.

Nesses casos existe outra estratégia chamada Recreate.

Neste artigo vamos entender como ela funciona, quando utilizá-la e quais são suas vantagens e desvantagens.


O que é a estratégia Recreate?

O Recreate é uma estratégia de atualização disponível nos Deployments.

Ao contrário do RollingUpdate, ela não cria Pods novos enquanto os antigos ainda estão executando.

O processo acontece em duas etapas.

  1. Todos os Pods antigos são removidos.
  2. Somente depois os novos Pods são criados.

Visualmente:

Versão 1

Pod 1
Pod 2
Pod 3
Pod 4



Todos os Pods são removidos



Nenhum Pod disponível



Pod 1 (v2)
Pod 2 (v2)
Pod 3 (v2)
Pod 4 (v2)

Durante esse intervalo existe indisponibilidade da aplicação.


Comparando com RollingUpdate

A diferença entre as duas estratégias fica muito clara.

RollingUpdate

Pods antigos



Pods antigos + Pods novos



Pods novos

Sempre existe pelo menos uma parte da aplicação disponível.


Recreate

Pods antigos



Nenhum Pod



Pods novos

Existe uma interrupção temporária do serviço.


Configurando a estratégia

Dentro do Deployment basta alterar o campo strategy.

Antes:

strategy:
  type: RollingUpdate

Depois:

strategy:
  type: Recreate

Observe que não existe o bloco rollingUpdate.

Isso acontece porque os parâmetros maxSurge e maxUnavailable pertencem exclusivamente ao RollingUpdate.


Aplicando a alteração

Depois de modificar o manifesto.

kubectl apply -f deployment.yaml

Resultado esperado:

deployment.apps/nginx-deployment configured

O próximo rollout utilizará a estratégia Recreate.


O que acontece durante a atualização?

Imagine um Deployment com quatro Pods.

Pod A
Pod B
Pod C
Pod D

Ao alterar a imagem da aplicação.

image: nginx:1.31.0

E executar:

kubectl apply -f deployment.yaml

O Kubernetes fará o seguinte.

Remover

Pod A
Pod B
Pod C
Pod D

Depois:

Criar

Pod A (novo)
Pod B (novo)
Pod C (novo)
Pod D (novo)

Não existe convivência entre as duas versões.


Acompanhando a atualização

Durante a atualização podemos observar os Pods.

kubectl get pods -n giropops

Resultado esperado:

NAME    READY

Nenhum recurso encontrado.

Alguns segundos depois.

NAME                        READY

nginx-deployment-xxxxx      1/1

nginx-deployment-yyyyy      1/1

nginx-deployment-zzzzz      1/1

É exatamente essa ausência temporária de Pods que caracteriza o Recreate.


Quando utilizar Recreate?

Apesar de causar indisponibilidade, essa estratégia ainda é muito utilizada.

Principalmente quando não é permitido executar duas versões simultaneamente.

Alguns exemplos.


Quando evitar Recreate?

Na maioria das aplicações web modernas.

APIs REST.

Microsserviços.

Aplicações escaláveis.

Sistemas distribuídos.

Nesses cenários o RollingUpdate normalmente oferece uma experiência muito melhor.


RollingUpdate x Recreate

CaracterísticaRollingUpdateRecreate
Mantém a aplicação disponível
Pods antigos e novos convivem
Atualização gradual
Existe downtimeNãoSim
Indicado para produçãoSimApenas quando necessário

Como verificar a estratégia utilizada?

Podemos inspecionar o Deployment.

kubectl describe deployment \
    nginx-deployment \
    -n giropops

Ou:

kubectl get deployment \
    nginx-deployment \
    -o yaml

Na saída encontraremos:

strategy:
  type: Recreate

Ou.

strategy:
  type: RollingUpdate

Posso mudar de estratégia depois?

Sim.

O Deployment pode ser alterado a qualquer momento.

Por exemplo.

Antes.

strategy:
  type: Recreate

Depois.

strategy:
  type: RollingUpdate

  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

Basta aplicar novamente.

kubectl apply -f deployment.yaml

A nova estratégia será utilizada nas próximas atualizações.


Resumo

Deployment



├── RollingUpdate
│      │
│      ├── Atualização gradual
│      └── Alta disponibilidade

└── Recreate

       ├── Remove todos os Pods
       ├── Cria novos Pods
       └── Existe downtime

Conclusão

O Recreate é uma estratégia simples e eficiente para aplicações que não permitem duas versões executando simultaneamente.

Entretanto, ela sacrifica a disponibilidade durante a atualização.

Por isso, em aplicações modernas, o RollingUpdate costuma ser a estratégia recomendada.

Conhecer ambas é importante para escolher a abordagem correta em cada cenário.

No próximo artigo da série vamos estudar o histórico de revisões (Revision History) dos Deployments, entender como o Kubernetes registra cada atualização e aprender a consultar esse histórico antes de realizar um rollback.


Referências

O que achou?