Este proyecto demuestra cómo desplegar una aplicación Spring Boot en Kubernetes con autoescalado horizontal y monitoreo de métricas.
- Requisitos Previos
- Configuración de Kubernetes
- Construcción y Despliegue
- Monitoreo y Métricas
- Pruebas de Autoescalado
- Comandos Útiles
- Troubleshooting
Antes de comenzar, asegúrate de tener instalado:
- Docker Desktop
- kubectl
- Un cluster de Kubernetes (minikube, Docker Desktop, o un cluster en la nube)
- Java 21 o superior
- Maven 3.9+
El Metrics Server es necesario para que ver fácilmente el autoescalado horizontal (HPA). Instálalo primero:
kubectl apply -f k8s-metric-server.yamlVerifica que esté funcionando:
kubectl get pods -n kube-system | grep metrics-server- Imagen:
davinchijv/spring-k8s:1.0 - Puerto: 8080
- Recursos: CPU: 100m-500m, Memoria: 128Mi-200Mi
- Réplicas iniciales: 1
- Tipo: LoadBalancer
- Puerto externo: 80
- Puerto interno: 8080
- Rango de réplicas: 1-4 pods
- Métrica: 50% de utilización de CPU
- Versión API: autoscaling/v2
# Construir la imagen localmente
docker build -t tu_usuario/spring-k8s:1.0 .
# (Opcional) Subir a DockerHub
docker push tu_usuario/spring-k8s:1.0Nota: Si subes tu propia imagen, actualiza la referencia en
k8s-deployment.yaml
Ejecuta los siguientes comandos en orden:
# 1. Aplicar el deployment
kubectl apply -f k8s-deployment.yaml
# 2. Crear el servicio
kubectl apply -f k8s-service.yaml
# 3. Configurar el autoescalado
kubectl apply -f k8s-hpa.yaml# Ver el estado de los pods
kubectl get pods
# Ver los servicios
kubectl get services
# Ver el estado del HPA
kubectl get hpa# Uso de recursos de todos los pods
kubectl top pods
# Uso de recursos de los nodos
kubectl top nodes# Ver el estado del autoescalado en tiempo real
kubectl get hpa spring --watch# Ver logs del deployment
kubectl logs -l app=spring -f
# Ver logs de un pod específico
kubectl logs <nombre-del-pod> -fPara probar el autoescalado, genera tráfico hacia tu aplicación:
# Crear un pod generador de carga
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://spring; done"En otra terminal, observa cómo se escala la aplicación:
# Ver el HPA en tiempo real
kubectl get hpa spring --watch
# Ver los pods escalándose
kubectl get pods --watch# Listar todos los pods
kubectl get pods
# Describir un pod específico
kubectl describe pod <nombre-del-pod>
# Ejecutar un comando dentro de un pod
kubectl exec -it <nombre-del-pod> -- /bin/bash# Ver el estado del deployment
kubectl get deployment spring
# Escalar manualmente (temporalmente)
kubectl scale deployment spring --replicas=3
# Ver el historial de rollouts
kubectl rollout history deployment/spring# Ver eventos del cluster
kubectl get events --sort-by=.metadata.creationTimestamp
# Ver información detallada del HPA
kubectl describe hpa spring
# Ver configuración del servicio
kubectl describe service spring- El HPA no funciona
# Verificar que metrics-server esté funcionando
kubectl get apiservice v1beta1.metrics.k8s.io -o yaml- Los pods no se crean
# Ver eventos del deployment
kubectl describe deployment spring- No se puede acceder a la aplicación
# Verificar el servicio
kubectl get svc spring
# En minikube, usar tunnel
minikube tunnel- Imagen no encontrada
- Verificar que la imagen existe en el registry
- Comprobar la configuración de
imagePullPolicy
Para eliminar todos los recursos creados:
kubectl delete -f k8s-hpa.yaml
kubectl delete -f k8s-service.yaml
kubectl delete -f k8s-deployment.yaml
kubectl delete -f k8s-metric-server.yaml- El autoescalado puede tardar unos minutos en reaccionar a los cambios de carga
- Los recursos definidos en el deployment son críticos para el funcionamiento del HPA
- En entornos de producción, considera usar límites de recursos más específicos
- Para clusters en la nube, ajusta el tipo de servicio según tus necesidades
Si encuentras algún problema o tienes sugerencias de mejora, no dudes en crear un issue o pull request.