Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Sem Restarts, Sem Interrupções: Atualize Recursos de Pods com In-Place Resizing

By Chimbu ChinnaduraiJul 23, 20255 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Foto de Andrii Yalanskyi no Shutterstock

Otimizar o uso de recursos sem abrir mão da performance da aplicação é um desafio sem fim no Kubernetes. Calcular logo de cara quantos recursos sua aplicação vai precisar é complicado, e a abordagem tradicional de redimensionar CPU e/ou memória pode ser disruptiva, já que exige recriar os pods e pode impactar workloads em execução. Essa interrupção pode causar degradação do serviço, downtime e dor de cabeça operacional. É aí que entram plataformas como o PerfectScale, que analisam continuamente o uso de recursos nos workloads e identificam a alocação ideal antes que mudanças disruptivas sejam necessárias.

Muita gente vinha esperando ansiosamente pela possibilidade de redimensionar pods do Kubernetes sem reiniciá-los, e esse recurso está disponível em Alpha desde o Kubernetes v1.27 e foi promovido para beta na v1.33. O recurso se chama InPlacePodVerticalScaling, e o campo resources nos containers de um pod agora permite mutação para os recursos de cpu e memory. Para alterá-los, basta aplicar um patch na spec do pod em execução.

Vantagens do redimensionamento in-place de recursos do pod:

  • Menos Downtime: Elimina o downtime e a possível perda de dados causados pelo restart do pod, garantindo operações fluidas e serviço ininterrupto para os seus usuários.
  • Mais Eficiência: Fazer o right-sizing dos seus pods é fundamental para uma utilização ideal dos recursos. O InPlacePodVerticalScaling permite alocar recursos exatamente conforme a necessidade, evitando tanto o overprovisioning (desperdício de dinheiro) quanto o underprovisioning (perda de performance).
  • Mais Agilidade: O escalonamento dinâmico permite responder na hora a mudanças de demanda. Seja um pico repentino de tráfego ou um job em batch agendado, seus pods conseguem ajustar o uso de recursos de forma transparente, garantindo performance e responsividade no melhor nível.
  • Economia de Custos: Ao evitar overprovisioning e otimizar o uso de recursos, o InPlacePodVerticalScaling se traduz diretamente em economia, principalmente em ambientes de nuvem em que você paga por unidade de recurso.
  • Gestão Simplificada: Gerenciar deployments complexos não é fácil, mas o InPlacePodVerticalScaling agiliza o processo eliminando restarts manuais e trazendo uma abordagem inovadora para o gerenciamento de recursos.

Neste post, vou mostrar como testar o redimensionamento in-place de recursos de pod. O recurso está atualmente em Beta a partir do Kubernetes v1.33 e ainda não é recomendado para produção. A comunidade Kubernetes segue focada em fortalecer o recurso, melhorar a performance e garantir que ele esteja sólido para ambientes de produção.

Redimensionamento in-place de recursos do pod na prática

O recurso InPlacePodVerticalScaling vem habilitado por padrão em clusters rodando a versão v1.33. Você pode ativá-lo explicitamente em um cluster minikube com o comando abaixo, ou habilitar esse feature gate no seu cluster Kubernetes gerenciado, caso ainda não esteja ativo por padrão.

minikube start --feature-gates=InPlacePodVerticalScaling=true

Vamos fazer o deploy de um pod de exemplo no cluster. O novo restartPolicy na spec do pod dá ao usuário o controle sobre como os containers se comportam quando os recursos são redimensionados.

Na configuração de pod abaixo, voltada para recursos de memória, o resizePolicy indica que mudanças na alocação de memória exigem o restart do container, enquanto para os recursos de CPU o restart não é necessário durante o redimensionamento.

A decisão de reiniciar um container depende de a aplicação conseguir ou não usar o recurso atualizado sem precisar de restart. Por exemplo, se o uso de memória de uma aplicação é crítico para a operação dela, reiniciar o container quando há mudanças de memória garante que a aplicação suba com a quantidade correta. Esse passo ajuda a evitar potenciais problemas ou falhas.

cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    resizePolicy:
    - resourceName: "memory"
      restartPolicy: "RestartContainer"
    - resourceName: "cpu"
      restartPolicy: "NotRequired"
    resources:
      limits:
        cpu: "300m"
        memory: "1Gi"
      requests:
        cpu: "100m"
        memory: "500Mi"
EOF

Espere o pod entrar no estado running e dê uma olhada na configuração dele. Foi adicionado um novo campo allocatedResources em containerStatuses no status do pod, e ele reflete os recursos do nó atualmente alocados aos containers do pod.

Além disso, um novo campo chamado resources foi adicionado ao status do container, refletindo os requests e limits de recursos efetivamente configurados nos containers em execução, conforme reportado pelo container runtime.

Redimensionamento de CPU

vamos ajustar os recursos de CPU do pod com o comando de patch a seguir e acompanhar a operação de resize. Modificar recursos do Pod agora precisa ser feito por meio do subresource resize do Pod, e o kubectl a partir da v1.32 suporta esse argumento.

kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"cpu" :"300m"},"limits": {"cpu" :"500m"}}}]}}'

O status de uma operação de resize agora é exposto por meio de duas conditions do Pod:

  • PodResizePending: Indica que o Kubelet não consegue aplicar o resize imediatamente (por exemplo, reason: Deferred se estiver temporariamente impossibilitado, ou reason: Infeasible se for inviável no nó).
  • PodResizeInProgress: Indica que o resize foi aceito e está sendo aplicado. Eventuais erros encontrados nessa fase agora são reportados na mensagem dessa condition com reason: Error

A comunidade aprimorou o Pod Lifecycle Event Generator (PLEG) do Kubelet, permitindo que ele responda e conclua resizes com mais agilidade no beta. Ainda assim, eventualmente o redimensionamento de um pod pode esbarrar em uma race condition com outras atualizações do pod. Isso pode atrasar a ativação do resize, e os recursos atualizados do container podem levar algum tempo para se refletirem no status do pod.

Redimensionamento de memória

vamos seguir com o ajuste do recurso de Memory, e o container será reiniciado conforme o restartPolicy.

kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"memory" :"700Mi"}}}]}}'

A captura de tela mostra a conclusão bem-sucedida da operação de resize e o restart do container 🚀.

Embora esse recurso ainda esteja amadurecendo, plataformas como o PerfectScale já entregam fluxos de otimização prontos para produção — combinando segurança, performance e eficiência de custos em um gerenciamento de recursos automatizado. Siga os passos descritos neste post para experimentar e sentir os benefícios na prática.

Espero que este post tenha sido útil. Para mais informações, confira os recursos abaixo: