Introducción breve al Horizontal Pod Autoscaler (HPA) para un aprendizaje futuro
En este paso, obtendrás una introducción al Horizontal Pod Autoscaler (HPA), una poderosa característica de Kubernetes que escala automáticamente las aplicaciones en función de la utilización de recursos. El HPA te permite definir reglas de escalado basadas en métricas como la utilización de CPU, el uso de memoria o incluso métricas personalizadas.
Comprensión del HPA:
El HPA ajusta automáticamente el número de réplicas de pods en ejecución en un Deployment, ReplicaSet o StatefulSet en función de la utilización de CPU o memoria observada, o en función de métricas personalizadas proporcionadas por tus aplicaciones. Esto garantiza que tu aplicación pueda escalar automáticamente para manejar cargas de tráfico cambiantes, mejorando el rendimiento y la disponibilidad.
Habilita el complemento metrics server en Minikube:
minikube addons enable metrics-server
Ejemplo de salida:
* The 'metrics-server' addon is enabled
El metrics server proporciona a Kubernetes datos de utilización de tus recursos y es esencial para que funcione el HPA.
Crea un despliegue con solicitudes de recursos:
nano ~/project/k8s-manifests/hpa-example.yaml
Agrega el siguiente contenido:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
Aplica el despliegue:
kubectl apply -f ~/project/k8s-manifests/hpa-example.yaml
Explicación de la configuración YAML:
- Este archivo YAML define un Deployment para una aplicación PHP y el servicio correspondiente.
- La configuración del Deployment es muy similar a la de NGINX, con la excepción de:
name: php-apache: El nombre del despliegue y del contenedor del pod.
image: k8s.gcr.io/hpa-example: La imagen Docker del contenedor.
resources: Esta sección especifica los requisitos de recursos para el contenedor.
limits.cpu: 500m: La CPU máxima permitida para el contenedor.
requests.cpu: 200m: La cantidad de CPU garantizada asignada al contenedor.
- El servicio es una configuración de servicio estándar que expone el despliegue internamente.
Crea una configuración de HPA:
nano ~/project/k8s-manifests/php-apache-hpa.yaml
Agrega el siguiente manifiesto de HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Aplica la configuración de HPA:
kubectl apply -f ~/project/k8s-manifests/php-apache-hpa.yaml
Explicación de la configuración YAML:
apiVersion: autoscaling/v2: Especifica la versión de la API para HorizontalPodAutoscaler.
kind: HorizontalPodAutoscaler: Indica que este es un objeto HPA.
metadata: Contiene metadatos sobre el HPA.
name: php-apache: El nombre del HPA.
spec: Contiene la especificación del HPA.
scaleTargetRef: Define el Deployment objetivo que se escalará.
apiVersion: apps/v1: La versión de la API del recurso objetivo.
kind: Deployment: El tipo de recurso objetivo, que es un Deployment.
name: php-apache: El nombre del Deployment objetivo a escalar.
minReplicas: 1: El número mínimo de réplicas a mantener en ejecución.
maxReplicas: 10: El número máximo de réplicas a las que se puede escalar.
metrics: Define cómo determinar las métricas de escalado.
type: Resource: Escala en función de una métrica de recurso.
resource.name: cpu: Escala en función del uso de CPU.
resource.target.type: Utilization: Escala en función de un porcentaje de la CPU solicitada por el pod.
resource.target.averageUtilization: 50: Escala cuando el uso promedio de CPU en todos los pods supera el 50% de las solicitudes.
Verifica la configuración de HPA:
kubectl get hpa
Ejemplo de salida:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
Simular carga y observar el escalado automático en tiempo real
Para simular una carga alta y activar el escalador automático, ejecutarás un generador de carga en una terminal y monitorearás la actividad de escalado en una terminal separada.
Primero, abre una terminal para el generador de carga:
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
NO CIERRES la terminal con el generador de carga. ABRE OTRA TERMINAL para monitorear la actividad de escalado.
En la segunda terminal, puedes usar varios comandos para observar el escalado automático en tiempo real:
- Monitorea el estado del HPA (se actualiza cada pocos segundos):
kubectl get hpa -w
- Observa cómo se crean los pods a medida que el HPA escala hacia arriba:
kubectl get pods -w
- Realiza un seguimiento de los eventos relacionados con la actividad de escalado:
kubectl get events --sort-by='.lastTimestamp' -w
Puedes ejecutar cualquiera de estos comandos para observar diferentes aspectos del proceso de escalado automático. Por ejemplo, observar los pods con la bandera -w te muestra cómo se crean los pods en tiempo real a medida que el sistema escala:
Ejemplo de salida para kubectl get pods -w:
NAME READY STATUS RESTARTS AGE
php-apache-xxxxxxxxx-xxxxx 1/1 Running 0 2m
load-generator 1/1 Running 0 30s
php-apache-xxxxxxxxx-yyyyy 0/1 Pending 0 0s
php-apache-xxxxxxxxx-yyyyy 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-yyyyy 1/1 Running 0 3s
php-apache-xxxxxxxxx-zzzzz 0/1 Pending 0 0s
php-apache-xxxxxxxxx-zzzzz 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-zzzzz 1/1 Running 0 2s
Verás que el HPA responde a la carga aumentada escalando hacia arriba el número de pods. La actualización de las métricas puede tardar un minuto o más en reflejar los cambios:
Ejemplo de salida para kubectl get hpa -w:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
php-apache Deployment/php-apache 68%/50% 1 10 1 90s
php-apache Deployment/php-apache 68%/50% 1 10 2 90s
php-apache Deployment/php-apache 79%/50% 1 10 2 2m
php-apache Deployment/php-apache 79%/50% 1 10 4 2m15s
Cuando hayas terminado de observar, presiona Ctrl+C para detener el comando de monitoreo y vuelve a la primera terminal y presiona Ctrl+C para detener el generador de carga.
Puntos clave sobre el HPA:
- Escala automáticamente los pods en función de la utilización de recursos, lo que mejora la resiliencia de la aplicación.
- Puede escalar en función de la CPU, la memoria o métricas personalizadas.
- Define los recuentos mínimos y máximos de réplicas, garantizando un escalado equilibrado y eficiente.
- El HPA es un componente crucial para mantener el rendimiento y la disponibilidad de la aplicación bajo diferentes cargas.
- Usar la bandera
-w (watch) con los comandos de kubectl proporciona un monitoreo en tiempo real de los cambios en el clúster.