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
InPlacePodVerticalScalingpermite 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: Deferredse estiver temporariamente impossibilitado, oureason: Infeasiblese 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 comreason: 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: