Creado por FREDYS ARAUJO
Introducción al Autoscaling en Kubernetes
¿Qué es el Autoscaling en Kubernetes?
En el contexto de Kubernetes, autoscaling se refiere a la capacidad del sistema para ajustar automáticamente la cantidad de recursos asignados a las aplicaciones en respuesta a las demandas cambiantes. Autoscaling permite a Kubernetes gestionar eficientemente la infraestructura subyacente, ajustando el número de pods en un deployment según métricas específicas como el uso de CPU o memoria.
Kubernetes ofrece dos mecanismos principales para autoscaling: Horizontal Pod Autoscaling (HPA) y Vertical Pod Autoscaling (VPA). El HPA ajusta el número de réplicas de un pod, escalando horizontalmente para manejar la carga de trabajo. En contraste, el VPA modifica los recursos asignados a los pods, como CPU y memoria, para escalar verticalmente. Estos enfoques permiten a las aplicaciones escalar de manera eficiente, asegurando que los servicios sean altamente disponibles y puedan manejar incrementos de tráfico sin intervención manual.
Importancia del Autoscaling
El autoscaling es crucial en Kubernetes por varias razones:
- Eficiencia en el uso de recursos: El autoscaling asegura que los recursos se utilicen de manera óptima. HPA y VPA ajustan automáticamente los recursos según la demanda, evitando tanto la sobreasignación como la infrautilización.
- Costos reducidos: Al ajustar los recursos automáticamente, las organizaciones pueden minimizar los costos operativos. No se paga por recursos innecesarios, y se asegura que los recursos disponibles se utilicen de manera efectiva.
- Mejora de la disponibilidad y rendimiento: El autoscaling garantiza que las aplicaciones mantengan un alto rendimiento y disponibilidad. HPA incrementa el número de pods durante picos de carga, mientras que VPA asegura que los pods existentes tengan los recursos necesarios para operar eficientemente.
- Flexibilidad y agilidad: En un entorno de DevOps, la capacidad de escalar aplicaciones automáticamente permite a los equipos responder rápidamente a cambios en la carga de trabajo. Esto es especialmente importante en aplicaciones con cargas de trabajo impredecibles o estacionales.
- Simplificación de la gestión: El autoscaling reduce la carga administrativa asociada con la gestión manual de recursos. Los administradores de sistemas pueden confiar en que Kubernetes manejará la escalabilidad de las aplicaciones, liberándolos para enfocarse en otras tareas críticas.
Configuración de Metric Server
Instalación de Metric Server
El Metric Server es un componente esencial en Kubernetes para la recolección de métricas de recursos utilizados por los pods y otros objetos. Estas métricas son cruciales para la implementación de Horizontal Pod Autoscaling (HPA) y Vertical Pod Autoscaling (VPA).
Para instalar el Metric Server, sigue estos pasos:
Descarga el manifiesto de Metric Server:
kubectl apply -f <https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml>
Verificación de la Instalación
Una vez instalado el Metric Server, es importante verificar que esté funcionando correctamente. Puedes hacerlo siguiendo estos pasos:
Comprueba los pods del Metric Server: Asegúrate de que los pods del Metric Server estén en estado «Running»:
kubectl get pods -n kube-system | grep metrics-server
Deberías ver algo similar a esto:

En nuestro caso tuvimos que usar findstr porque en Windows no se reconoce el comando grep
Revisa los logs: Si los pods no están en estado «Running» o si sospechas que algo no está funcionando correctamente, revisa los logs del pod para obtener más detalles:
kubectl logs -n kube-system <nombre-del-pod>
Busca mensajes de error o advertencias que puedan indicar problemas. Si estás usando el Google Cloud SDK Shell es recomendable haber ingresado como administrador
Confirmación de la Recolección de Métricas
Después de verificar la instalación, el siguiente paso es confirmar que el Metric Server está recolectando y proporcionando métricas adecuadamente:
Consulta las métricas de los nodos: También puedes consultar las métricas de uso de recursos de los nodos:
kubectl top nodes Esto te dará una visión general del uso de recursos en todo el clúster.

Verifica la integración con HPA: Crea un Horizontal Pod Autoscaler para una aplicación y asegúrate de que utilice las métricas proporcionadas por el Metric Server:
- Es necesario tener creado un Deployment para realizar esta prueba, si por el momento no dispones de uno, puedes saltar esta parte y continuar con el tutorial.
kubectl autoscale deployment <nombre-del-deployment> --cpu-percent=50 --min=1 --max=10
Luego, verifica el estado del HPA: kubectl get hpa Deberías ver algo similar a:

Horizontal Pod Autoscaling (HPA)
¿Qué es HPA?
El Horizontal Pod Autoscaling (HPA) es una funcionalidad en Kubernetes que permite ajustar automáticamente el número de pods en un deployment, replica set, o stateful set basado en métricas observadas como la utilización de CPU, memoria u otras métricas personalizadas. HPA es crucial para asegurar que las aplicaciones puedan escalar dinámicamente en respuesta a las fluctuaciones de carga, manteniendo así la eficiencia y el rendimiento sin intervención manual.
¿Cómo Funciona HPA?
HPA funciona mediante la monitorización continua de las métricas de los pods y el ajuste del número de réplicas según las necesidades. El proceso es el siguiente:
- Recolección de métricas: El Metric Server recolecta métricas de uso de recursos de los pods.
- Evaluación de políticas: Kubernetes compara estas métricas con los objetivos de escalado definidos en la configuración del HPA.
- Ajuste de réplicas: Si las métricas observadas superan o caen por debajo de los umbrales definidos, el HPA ajusta el número de réplicas en el deployment. Por ejemplo, si la utilización de CPU promedio supera el objetivo, se crearán más réplicas para distribuir la carga.
Ventajas del HPA
El uso de HPA en Kubernetes ofrece varias ventajas significativas:
- Optimización de recursos: Ajusta el número de pods según la demanda, evitando la sobre provisión y reduciendo costos.
- Mejora del rendimiento: Asegura que las aplicaciones tengan suficientes recursos durante picos de carga, manteniendo el rendimiento.
- Automatización: Elimina la necesidad de intervención manual para ajustar la escala de las aplicaciones, permitiendo a los equipos enfocarse en otras tareas.
- Alta disponibilidad: Incrementa la resiliencia y disponibilidad de las aplicaciones al asegurar que siempre haya suficientes réplicas para manejar la carga.
- Flexibilidad: Compatible con una variedad de métricas, incluyendo métricas personalizadas, lo que permite configuraciones de escalado muy específicas y adaptadas a las necesidades de la aplicación.
Ejemplo Práctico de HPA
Vamos a configurar un Horizontal Pod Autoscaler paso a paso.
Paso 1: Crear un Deployment
Primero, creamos un deployment que despliegue una aplicación sencilla. En este ejemplo, usaremos una aplicación Nginx.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: "25m"
limits:
cpu: "100m"
Aplica este archivo con:
kubectl apply -f nginx-deployment.yaml
Paso 2: Crear un Servicio
Ahora, creamos un service para exponer la aplicación Nginx.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
Aplica este archivo con:
kubectl apply -f nginx-service.yaml
Paso 3: Crear un HPA
Creamos el HPA para nuestro deployment Nginx, configurado para escalar basado en la utilización de CPU.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
kind: Deployment
name: nginx-deployment
apiVersion: apps/v1
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 30
Aplica este archivo con:
kubectl apply -f nginx-hpa.yaml
Paso 4: Pruebas
Antes de iniciar las pruebas te muestro el estado actual del pod
kubectl top pod

Para probar el HPA, generamos carga en la aplicación Nginx. Esto puede hacerse utilizando herramientas como kubectl run para lanzar pods que realicen solicitudes continuas al servicio Nginx.
kubectl run -i --tty --rm load-generatortest --image=busybox /bin/sh
Dentro del pod load-generator, ejecuta un bucle infinito que envíe solicitudes a Nginx:
while true; do echo "<http://nginx-service>" | xargs -P 50 -I {} wget -q -O- {}; done
Después de unos minutos, verifica el estado del HPA y los pods:
kubectl get hpa
kubectl get pods
Kubectl top pod
Deberías ver que el número de réplicas aumenta en respuesta a la carga, como en la siguiente imagen.

Vertical Pod Autoscaling (VPA)
¿Qué es VPA?
El Vertical Pod Autoscaling (VPA) es una característica de Kubernetes que ajusta automáticamente los recursos asignados a los pods, como la CPU y la memoria, para adaptarse a las necesidades cambiantes de las aplicaciones. A diferencia del Horizontal Pod Autoscaling (HPA), que escala el número de réplicas de un pod, el VPA modifica los recursos asignados a los pods existentes, optimizando su rendimiento sin cambiar su cantidad.
¿Cómo Funciona VPA?
VPA funciona mediante la monitorización continua de los recursos utilizados por los pods y la recomendación o aplicación de cambios en las solicitudes de recursos. El proceso incluye:
- Recolección de métricas: VPA utiliza datos del Metric Server para analizar el uso de recursos.
- Generación de recomendaciones: Basado en las métricas recolectadas, VPA genera recomendaciones de ajustes para los recursos de CPU y memoria de los pods.
- Aplicación de ajustes: Dependiendo de la configuración, VPA puede aplicar automáticamente estos ajustes o simplemente recomendar cambios, permitiendo a los administradores aplicar las recomendaciones manualmente.
Ventajas del VPA
El uso del Vertical Pod Autoscaling (VPA) en Kubernetes ofrece varias ventajas importantes:
- Optimización de recursos: Ajusta automáticamente los recursos asignados a los pods, asegurando que no se subutilicen ni se sobrecarguen.
- Mejora del rendimiento: Asegura que cada pod tenga los recursos necesarios para operar eficientemente, mejorando el rendimiento general de la aplicación.
- Simplificación de la gestión: Reduce la necesidad de ajustar manualmente las solicitudes de recursos de los pods, permitiendo una gestión más sencilla y eficiente.
- Flexibilidad: Facilita la adaptación a cambios en la carga de trabajo sin necesidad de rediseñar o reconfigurar el clúster.
¿Cómo Ajusta Recursos el VPA?
VPA ajusta los recursos de los pods basándose en las siguientes etapas:
- Monitoreo y análisis: Recolecta datos de uso de recursos a través del Metric Server.
- Cálculo de necesidades: Compara el uso real con las solicitudes y límites actuales de los recursos de los pods.
- Recomendación o aplicación de cambios: Genera recomendaciones de nuevos valores para las solicitudes de CPU y memoria, y puede aplicar estos cambios automáticamente si está configurado para hacerlo.
Ejemplo Práctico de VPA
Vamos a configurar un Vertical Pod Autoscaler paso a paso.
Paso 1: Instalar VPA
Primero, necesitamos instalar los componentes de VPA. Puedes hacerlo aplicando los manifiestos necesarios desde el repositorio oficial de Kubernetes.
git clone <https://github.com/kubernetes/autoscaler.git>
Es importante crear una carpeta llamada autoscaler antes de clonar el repositorio de Kubernetes
Ejecutamos el archivo vpa-up-sh que lo encontramos en la siguiente ruta, si usamos Windows C:\Program Files (x86)\Google\Cloud SDK\autoscaler\vertical-pod-autoscaler\hack
Paso 2: Crear un Deployment
Creamos un deployment que despliegue una aplicación sencilla. Usaremos la misma aplicación Nginx del ejemplo anterior.
apiVersion: apps/v1
kind: Deployment
metadata:
name: high-cpu-utilization-deployment
spec:
replicas: 2
selector:
matchLabels:
app: cpu-utilization-app
template:
metadata:
labels:
app: cpu-utilization-app
spec:
containers:
- name: cpu-utilization-container
image: ubuntu
command: ["/bin/sh", "-c", "apt-get update && apt-get install -y stress-ng && while true; do stress-ng --cpu 1; done"]
resources:
limits:
cpu: "0.05"
requests:
cpu: "0.05"
Aplica este archivo con:
kubectl apply -f vpa-deployment.yaml
Paso 3: Crear un VPA
Creamos el Vertical Pod Autoscaler para nuestro deployment Nginx, configurado para ajustar los recursos basándose en el uso.
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: stress-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: high-cpu-utilization-deployment
updatePolicy:
updateMode: Auto
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: 100m
memory: 50Mi
maxAllowed:
cpu: 200m #maximum vpa will be allocating this many cpus even if demand is higher.
memory: 500Mi
controlledResources: ["cpu", "memory"]
Aplica este archivo con:
kubectl apply -f nginx-vpa.yaml
Paso 4: Pruebas
Debemos empezar por visualizar el CPU de nuestros Pods

Verificamos las solicitudes de nuestro Pods
$ kubectl get po -o jsonpath='{.items[*].spec.containers[*].resources.requests.cpu}'
50m 50m
Ambos Pods están en su máxima capacidad
A continuación, verifique el estado del VPA:

Deberías ver que las solicitudes y límites de CPU y memoria han sido ajustados según las recomendaciones del VPA.
Pasado un momento los valores deberían cambiar
HPA vs. VPA: ¿Cuál Usar?
Comparación entre HPA y VPA
Al considerar Horizontal Pod Autoscaling (HPA) y Vertical Pod Autoscaling (VPA) en Kubernetes, es esencial entender sus diferencias y cómo cada uno aborda el escalado de recursos:
- Mecanismo de Escalado:
- HPA: Ajusta el número de pods en un deployment o replica set basado en métricas como el uso de CPU, memoria u otras métricas personalizadas. Escala horizontalmente, agregando o eliminando réplicas de pods para distribuir la carga.
- VPA: Ajusta los recursos asignados a los pods individuales, como CPU y memoria, sin cambiar el número de réplicas. Escala verticalmente, incrementando o reduciendo los recursos para cada pod basado en las necesidades actuales.
- Casos de Uso:
- HPA: Es ideal para aplicaciones con cargas de trabajo fluctuantes y donde agregar más instancias puede distribuir mejor la carga. Por ejemplo, aplicaciones web con tráfico variable.
- VPA: Es adecuado para aplicaciones que requieren ajustes finos de recursos para optimizar el rendimiento y no necesariamente necesitan más réplicas. Por ejemplo, aplicaciones con necesidades de procesamiento intensivo de datos.
- Impacto en la Arquitectura de la Aplicación:
- HPA: Requiere que la aplicación sea capaz de manejar múltiples instancias de pods. Debe considerar el estado y la sesión del usuario si es una aplicación web.
- VPA: No cambia el número de instancias, por lo que es más sencillo para aplicaciones monolíticas o aplicaciones que no están diseñadas para escalar horizontalmente.
- Simplicidad y Configuración:
- HPA: Generalmente más fácil de configurar y comprender. Se basa en la cantidad de réplicas y puede ser monitoreado directamente con comandos simples.
- VPA: Puede ser más complejo debido a la necesidad de ajustar los recursos finamente y comprender cómo afecta esto a la aplicación.
- Interrupciones:
- HPA: Puede escalar sin interrupciones significativas, ya que simplemente agrega o elimina pods.
- VPA: Puede causar reinicios de pods cuando ajusta los recursos, lo cual puede ser disruptivo para aplicaciones que no toleran reinicios frecuentes.
Recomendaciones para Elegir
Para decidir entre HPA y VPA, considera los siguientes aspectos:
- Naturaleza de la Carga de Trabajo:
- Si tu aplicación experimenta fluctuaciones significativas en la carga y puede beneficiarse de tener múltiples instancias, HPA es la opción adecuada.
- Si tu aplicación tiene una carga constante pero necesita ajustes finos de recursos para optimizar el rendimiento, VPA es más apropiado.
- Diseño de la Aplicación:
- Para aplicaciones distribuidas o sin estado que pueden escalar horizontalmente sin problemas, HPA es más fácil de implementar y gestionar.
- Para aplicaciones monolíticas o aplicaciones que manejan estados y sesiones de usuario, VPA puede proporcionar una mejor optimización sin necesidad de reestructurar la aplicación.
- Tolerancia a Interrupciones:
- Si tu aplicación no tolera bien los reinicios de pods, HPA es preferible ya que agrega o elimina pods sin reiniciar los existentes.
- Si tu aplicación puede tolerar reinicios y necesita ajustes precisos en los recursos, VPA puede ser más beneficioso.
- Objetivos de Recursos:
- Usa HPA si tu objetivo es manejar cargas variables distribuyendo la carga entre más instancias.
- Usa VPA si tu objetivo es optimizar el uso de recursos dentro de las instancias existentes.
- Escenarios Combinados:
- En muchos casos, una combinación de HPA y VPA puede ser la solución más eficiente. HPA maneja la escalabilidad horizontal, mientras que VPA ajusta los recursos verticalmente, optimizando así el rendimiento general.
Conclusión
En esta guía, hemos explorado en profundidad dos métodos esenciales de autoscaling en Kubernetes: Horizontal Pod Autoscaling (HPA) y Vertical Pod Autoscaling (VPA). Cada uno de estos métodos ofrece soluciones distintas para manejar la escalabilidad y la eficiencia de los recursos en un clúster de Kubernetes.
HPA se destaca por su capacidad de ajustar el número de pods en función de la carga de trabajo, proporcionando una manera efectiva de gestionar aplicaciones con tráfico variable. Por otro lado, VPA optimiza los recursos asignados a los pods individuales, asegurando que cada instancia tenga los recursos necesarios para un rendimiento óptimo, lo cual es crucial para aplicaciones con cargas de trabajo más constantes.
Ambos enfoques tienen sus ventajas y casos de uso específicos, y en muchos escenarios, una combinación de HPA y VPA puede ofrecer la solución más equilibrada y eficiente. La correcta implementación y configuración de estas tecnologías pueden llevar a un uso más eficiente de los recursos, mejorar el rendimiento de las aplicaciones y reducir los costos operativos.
Esperamos que esta guía te haya proporcionado una comprensión clara y práctica de cómo utilizar HPA y VPA en Kubernetes para mejorar la escalabilidad y eficiencia de tus aplicaciones.
Contáctenos
Si tienes alguna pregunta adicional, necesitas asistencia con la implementación de HPA o VPA, o deseas discutir cómo estos métodos pueden beneficiar a tu organización, no dudes en contactarnos. Nuestro equipo de expertos en DevOps y gestión de infraestructura está aquí para ayudarte.
Puedes comunicarte con nosotros a través de los siguientes canales:
- Correo electrónico: [email protected]
- Teléfono: +(503) 2532-4763
- Sitio web: https://grupoconsiti.com/
- Dirección: #11G, Calle Los Pirineos, Colonia Montebello, Mejicanos, San Salvador, El Salvador
Estamos comprometidos a ofrecerte el mejor soporte y asesoramiento para que puedas aprovechar al máximo las capacidades de autoscaling en Kubernetes. ¡Esperamos poder colaborar contigo pronto!
