Día 35 - Desafío Final Semana 5
🎯 Desafío Final - ¡Roxs-voting-app en Kubernetes!
¡Llegaste al momento más emocionante de la semana!
Hoy vas a desplegar la aplicación completa roxs-voting-app en tu clúster local de Kubernetes, aplicando todos los conceptos aprendidos esta semana.
🏗️ Arquitectura de la Aplicación
Recuerda que roxs-voting-app tiene 5 componentes:
Componente | Imagen Docker | Rol principal | Exposición |
---|---|---|---|
vote | roxsross12/vote | Frontend de votación | NodePort |
result | roxsross12/result | Resultados | NodePort |
worker | roxsross12/worker | Procesa votos | Interno |
redis | redis:alpine | Cache | Interno |
postgres | postgres:15-alpine | Base de datos | Interno |
⚠️ Importante: Las imágenes
roxsross12/*
son solo referenciales. ¡Se recomienda que construyas y publiques tus propias imágenes Docker para tener control total sobre el código y la seguridad de tu aplicación!
🖼️ Diagrama: Flujo de la Aplicación
📋 Plan de Trabajo - ¿Cómo vas a abordarlo?
🎯 Estrategia Recomendada
-
📁 Organización primero
- Crear namespace dedicado para la aplicación
- Pensar en la estructura de archivos
-
💾 Datos permanentes
- Configurar almacenamiento persistente para PostgreSQL
- Asegurar que los votos no se pierdan
-
🔧 Configuraciones
- Externalizar configuraciones con ConfigMaps
- Gestionar credenciales con Secrets
-
🚀 Despliegue por capas
- Empezar con la base de datos (PostgreSQL)
- Continuar con cache (Redis)
- Luego las aplicaciones (vote, worker, result)
-
🌐 Conectividad
- Services para comunicación interna
- Acceso externo para frontend
🛠️ Preparación del Entorno
Antes de empezar, verifica:
# ¿Minikube está funcionando?
minikube status
# ¿kubectl responde?
kubectl get nodes
# ¿Tienes las imágenes disponibles?
# vote: roxsross12/vote
# worker: roxsross12/worker
# result: roxsross12/result
# redis: redis:alpine
# postgres: postgres:15-alpine
Estructura de archivos sugerida:
voting-app-k8s/
├── 01-namespace.yaml
├── 02-storage.yaml
├── 03-configs-secrets.yaml
├── 04-postgres.yaml
├── 05-redis.yaml
├── 06-vote.yaml
├── 07-worker.yaml
├── 08-result.yaml
└── deploy.sh
📝 Checklist de Componentes
📁 1. Namespace y Organización
🛡️ Buenas Prácticas y Recomendaciones
- Usa nombres descriptivos y consistentes para todos los recursos.
- Aplica RBAC por namespace para limitar accesos.
- Externaliza todas las configuraciones y secretos.
- Usa probes (
readinessProbe
,livenessProbe
) en todos los deployments. - Define resource requests/limits para cada contenedor.
- Usa labels y annotations para facilitar la gestión y monitoreo.
- Documenta cada manifiesto YAML con comentarios.
- Automatiza el despliegue con scripts o CI/CD.
💾 2. Almacenamiento para PostgreSQL
- PersistentVolume para datos de PostgreSQL
- PersistentVolumeClaim para solicitar almacenamiento
- Decidir tamaño apropiado (1-2Gi es suficiente)
⚙️ 3. Configuraciones y Secretos
- ConfigMap con variables de entorno comunes
- Secret con credenciales de base de datos
- Variables de conexión entre servicios
🗃️ 4. PostgreSQL (Base de Datos)
- Deployment con 1 réplica
- Usar imagen
postgres:15-alpine
- Montar almacenamiento persistente
- Service interno (ClusterIP)
- Variables de entorno desde Secret
🔄 5. Redis (Cache)
- Deployment con 1 réplica
- Usar imagen
redis:alpine
- Service interno (ClusterIP)
- Sin persistencia (cache temporal)
🗳️ 6. Vote App (Frontend)
- Deployment con 2-3 réplicas
- Usar imagen
roxsross12/vote
- Service externo (NodePort)
- Conectar con Redis
⚙️ 7. Worker (Procesador)
- Deployment con 1 réplica
- Usar imagen
roxsross12/worker
- Sin service (solo procesa)
- Conectar con Redis y PostgreSQL
📊 8. Result App (Resultados)
- Deployment con 2 réplicas
- Usar imagen
roxsross12/result
- Service externo (NodePort)
- Conectar con PostgreSQL
🔧 Variables de Entorno Importantes
Para las aplicaciones necesitarás configurar:
# Conexiones de base de datos
POSTGRES_HOST: "postgres-service"
POSTGRES_PORT: "5432"
POSTGRES_DB: "votes"
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres123"
# Conexiones de Redis
REDIS_HOST: "redis-service"
REDIS_PORT: "6379"
🚀 Estrategia de Despliegue
Orden sugerido de despliegue:
-
Infraestructura base
kubectl apply -f 01-namespace.yaml
kubectl apply -f 02-storage.yaml
kubectl apply -f 03-configs-secrets.yaml -
Servicios de datos
kubectl apply -f 04-postgres.yaml
# Esperar que PostgreSQL esté listo
kubectl apply -f 05-redis.yaml -
Aplicaciones
kubectl apply -f 06-vote.yaml
kubectl apply -f 07-worker.yaml
kubectl apply -f 08-result.yaml
Verificación entre pasos:
# Verificar que los pods estén corriendo
kubectl get pods -n voting-app
# Verificar que los services estén activos
kubectl get services -n voting-app
# Ver logs si algo falla
kubectl logs deployment/postgres -n voting-app
🧪 Plan de Testing
¿Cómo sabrás que funciona?
-
✅ Todos los pods en Running
kubectl get pods -n voting-app
-
✅ Services respondiendo
kubectl get services -n voting-app
-
✅ Aplicación vote accesible
- Acceder vía navegador al NodePort
- Poder votar entre gato y perro
kubectl logs deployment/worker -n voting-app
- Acceder vía navegador al NodePort
- Ver los votos reflejados en tiempo real
-
✅ Persistencia funcionando
- Eliminar pods y verificar que datos persisten kubectl delete pod -l app=postgres -n voting-app
Verificar que votos siguen ahí después de recrearse
🎯 Preguntas Guía para el Desarrollo
- ¿Está todo en el namespace correcto?
- ¿Los nombres de recursos son descriptivos?
- ¿Las labels ayudan a identificar componentes?
🤔 Sobre Conectividad:
- ¿Los nombres de servicios coinciden en las variables de entorno?
- ¿Los puertos están bien configurados?
🤔 Sobre Datos:
- ¿PostgreSQL tiene almacenamiento persistente?
- ¿Las credenciales están en Secrets?
- ¿Las configuraciones están en ConfigMaps?
🤔 Sobre Funcionalidad:
- ¿Puedo votar en la interfaz?
- ¿El worker procesa los votos?
- ¿Los resultados se actualizan?
📊 Métricas de Éxito
Al final del día deberías tener:
✅ Infraestructura:
- 5 deployments corriendo
- 4 services configurados
- 1 namespace organizado
- Almacenamiento persistente funcionando
✅ Funcionalidad:
- Flujo completo de votación funcionando
- Datos persistiendo entre reinicios
- Aplicaciones accesibles desde el navegador
✅ Mejores Prácticas:
- Configuraciones externalizadas
- Secretos protegidos
- Resources organizados por namespace
- Labels y selectores correctos
🆘 Recursos de Ayuda
Si te atascas:
-
Revisa los conceptos de la semana
- Día 29: Pods y Deployments
- Día 30: Services
- Día 31: ConfigMaps y Secrets
- Día 32: Volúmenes
- Día 33: Namespaces
-
Comandos de debug útiles
kubectl describe pod <pod-name> -n voting-app
kubectl logs <pod-name> -n voting-app
kubectl get events -n voting-app -
Compara con Docker Compose
- ¿Qué variables de entorno usaba?
- ¿Qué puertos exponía?
- ¿Cómo se conectaban los servicios?
🏆 Desafío Extra (Opcional)
Si terminas antes y quieres ir más allá:
- 🔍 Agregar health checks a todas las aplicaciones
- 📊 Configurar resource limits apropiados
- 🏷️ Mejorar labels y annotations para mejor organización
- 📱 Crear script de deploy automatizado
- 🧪 Probar eliminando pods y verificar auto-recovery
🎉 ¡Al Finalizar!
Cuando tengas todo funcionando:
-
📸 Toma screenshots de:
- La aplicación vote funcionando
- Los resultados actualizándose
- El dashboard de pods corriendo
-
🐙 Documenta tu experiencia:
- ¿Qué fue lo más difícil?
- ¿Qué aprendiste nuevo?
- ¿Qué harías diferente?
-
🚀 Comparte con la comunidad:
- Usa el hashtag #DevOpsConRoxs
- Comparte tus aprendizajes
🎯 ¡Este es tu momento! Tienes todas las herramientas y conocimientos necesarios. Confía en lo que has aprendido esta semana y construye algo increíble.
¡Vamos a por ese despliegue en Kubernetes! 🚀
Recuerda: El objetivo no es solo que funcione, sino que entiendas cada parte y por qué la necesitas. Tómate tu tiempo y disfruta el proceso. ✨