Foto de Andrii Yalanskyi en Shutterstock
Optimizar el uso de recursos sin sacrificar el rendimiento de las aplicaciones es un reto constante en Kubernetes. Calcular cuántos recursos necesita tu app desde el arranque es complejo, y el enfoque tradicional de redimensionar CPU o memoria suele ser disruptivo: obliga a recrear pods y puede afectar a los workloads en ejecución. Esa interrupción se traduce en degradación del servicio, downtime y dolores de cabeza operativos. Ahí es donde plataformas como PerfectScale marcan la diferencia: analizan de forma continua el uso de recursos en los workloads e identifican las asignaciones óptimas antes de tener que recurrir a cambios disruptivos.
Muchos usuarios llevaban tiempo esperando poder redimensionar pods de Kubernetes sin reiniciarlos. La funcionalidad está disponible en Alpha desde Kubernetes v1.27 y pasó a beta en v1.33. Se llama InPlacePodVerticalScaling, y el campo resources de los contenedores de un pod ahora admite mutaciones para cpu y memory. Basta con aplicar un patch al spec del pod en ejecución.
Ventajas del redimensionamiento in-place de recursos de pods:
- Menos downtime: se elimina el downtime y la posible pérdida de datos que provoca el reinicio del pod, lo que asegura operaciones fluidas y un servicio sin interrupciones para tus usuarios.
- Mayor eficiencia: el right-sizing de tus pods es clave para aprovechar al máximo los recursos.
InPlacePodVerticalScalingte permite asignarlos con precisión, evitando tanto el sobreaprovisionamiento (que cuesta dinero) como el subaprovisionamiento (que afecta el rendimiento). - Mayor agilidad: el escalado dinámico te permite responder al instante ante cambios en la demanda. Ya sea un pico repentino de tráfico o un batch job programado, tus pods ajustan su uso de recursos sin fricciones, manteniendo un rendimiento y una capacidad de respuesta óptimos.
- Ahorro de costos: al evitar el sobreaprovisionamiento y optimizar el uso de recursos, InPlacePodVerticalScaling se traduce directamente en ahorro, sobre todo en entornos cloud donde se paga por unidad de recurso.
- Gestión simplificada: administrar despliegues complejos no es fácil, pero InPlacePodVerticalScaling agiliza el proceso al eliminar los reinicios manuales y aportar un enfoque innovador a la gestión de recursos.
En este post te muestro cómo probar el redimensionamiento in-place de recursos de pods. La funcionalidad está actualmente en Beta a partir de kubernetes v1.33 y no se recomienda para producción. La comunidad de Kubernetes sigue trabajando en robustecerla, mejorar su rendimiento y dejarla lista para entornos productivos.
In-place pod resource resize en acción
La funcionalidad InPlacePodVerticalScaling viene habilitada por defecto en clusters con la versión v1.33. Puedes activarla explícitamente en un cluster de minikube con el siguiente comando, o habilitar este feature gate en tu cluster de Kubernetes administrado si aún no está activo por defecto.
minikube start --feature-gates=InPlacePodVerticalScaling=true
Vamos a desplegar un pod de muestra en el cluster. El nuevo restartPolicy en el spec del pod le da al usuario el control sobre cómo se manejan sus contenedores cuando se redimensionan los recursos.
En la siguiente configuración de pod de ejemplo para recursos de memoria, el resizePolicy indica que los cambios en la asignación de memoria requieren reiniciar el contenedor, mientras que para los recursos de CPU no hace falta reiniciar durante el redimensionamiento.
Que un contenedor se reinicie o no depende de si la aplicación puede usar el recurso actualizado sin reinicio. Por ejemplo, si el uso de memoria de una aplicación es crítico para su funcionamiento, reiniciar el contenedor cuando cambia la memoria asegura que la aplicación arranque con la cantidad correcta. Este paso ayuda a prevenir posibles problemas o fallos.
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
Espera a que el pod pase a estado running y revisa su configuración. Se agregó un nuevo campo allocatedResources dentro de containerStatuses en el status del pod, que refleja los recursos del nodo asignados actualmente a los contenedores.
Además, se sumó un nuevo campo resources al status del contenedor, que refleja las requests y limits reales configurados en los contenedores en ejecución, según lo que reporta el container runtime.
Redimensionamiento de CPU
Ajustemos los recursos de CPU del pod con el siguiente comando patch y observemos la operación de redimensionamiento. Ahora, los recursos de un Pod deben modificarse a través del subrecurso resize; las versiones de kubectl v1.32+ admiten este argumento.
kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"cpu" :"300m"},"limits": {"cpu" :"500m"}}}]}}'
El estado de una operación de redimensionamiento se expone mediante dos condiciones del Pod:
PodResizePending: indica que Kubelet no puede aplicar el redimensionamiento de inmediato (por ejemplo,reason: Deferredsi no es posible temporalmente, oreason: Infeasiblesi es imposible en el nodo).PodResizeInProgress: indica que el redimensionamiento fue aceptado y se está aplicando. Los errores que surjan en esta fase se reportan en el mensaje de esta condición conreason: Error.
La comunidad mejoró el Pod Lifecycle Event Generator (PLEG) de Kubelet, lo que le permite responder y completar redimensionamientos con mayor rapidez en beta. Aun así, en ocasiones el redimensionamiento de un pod puede toparse con una condición de carrera frente a otras actualizaciones del pod. Esto puede demorar la activación del redimensionamiento y hacer que los recursos actualizados del contenedor tarden un poco en reflejarse en el status del pod.
Redimensionamiento de memoria
Sigamos con los ajustes del recurso Memory; el contenedor se reiniciará según el restartPolicy.
kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"memory" :"700Mi"}}}]}}'
La captura muestra la finalización exitosa de la operación de redimensionamiento y el reinicio del contenedor 🚀.
Aunque la funcionalidad aún está madurando, plataformas como PerfectScale ya ofrecen flujos de optimización listos para producción, que combinan seguridad, rendimiento y eficiencia de costos en una gestión automatizada de recursos. Sigue los pasos de este post para probarla y comprobar sus beneficios de primera mano.
Espero que este post te haya resultado útil. Para más información, consulta los siguientes recursos: