
Postmortem — El deploy que pasó el build y murió en el clúster
No todo incidente comienza con un apagón. Este comenzó con un deploy “verde” en el build y un rollout que nunca terminó.
Resumen
El pipeline construyó la imagen nueva, la importó en los nodos y actualizó el Deployment. Los pods nuevos entraron en CrashLoopBackOff. Los pods antiguos continuaron sirviendo, por lo que el sitio no cayó — pero el deploy quedó a medias durante 40 minutos, hasta el timeout del Jenkins.
Causa: el secret del clúster tenía APP_STORAGE_S3_ACCESSKEY/SECRETKEY = minioadmin. La imagen nueva incluía el guard ProdDefaultCredentialsGuard, que rechaza credenciales por defecto en el perfil prod. La imagen antigua no tenía el guard (o lo habían eliminado antes del cambio).
Peor: la imagen nueva ya había aplicado la migración Flyway 3.5. Volver a la imagen antigua pasó a fallar en la validación de Flyway. El camino era fix forward.
Línea de tiempo
| Hora | Evento |
|---|---|
| T+0 | Pipeline inicia; build e importación de imágenes en los 3 workers |
| T+40 min | Rollout del backend alcanza timeout de 900 s |
| T+41 min | Pods nuevos en CrashLoopBackOff; pods antiguos 2/2 sirviendo |
| T+45 min | Los logs muestran INF-SEC-01 (S3 por defecto) |
| T+50 min | Intento de rollback falla: Flyway 3.5 aplicada |
| T+55 min | Creado usuario MinIO dedicado; secret actualizado |
| T+60 min | Imagen nueva promovida; rollout concluye |
| T+65 min | Validación: readiness UP, /api/fornecedores 200, CNPG healthy |
Causa raíz
- Deriva de configuración. El secret del clúster tenía credenciales por defecto de MinIO (
minioadmin), mientras que la aplicación ya tenía un guard que las rechaza en producción. - Build no valida el runtime. El build pasó; el guard solo se ejecuta en el arranque.
- Rollout sin preflight de credenciales. El pipeline no verificó el secret antes de cambiar la imagen.
- Migración aplicada antes del guard. Flyway se ejecutó, aplicó
3.5y solo después el guard derribó el proceso. Esto hizo inviable el rollback.
Lo que funcionó
- Los pods antiguos continuaron sirviendo durante el rollout (estrategia RollingUpdate).
- El guard hizo su trabajo: rechazó la credencial por defecto en producción.
- Los logs señalaron la causa en una línea.
- El fix forward fue posible sin pérdida de datos.
Lo que no funcionó
- El pipeline no tenía preflight de credenciales.
- El rollback se intentó antes de notar la migración aplicada.
- La alerta de deploy no diferenció “build ok” de “rollout ok”.
- La credencial por defecto estaba en el clúster desde hace meses, sin rotación.
Corrección
- Crear un usuario MinIO dedicado (no por defecto) con política de lectura/escritura.
- Actualizar el secret
portal-secretscon el nuevo access/secret. - Promover la imagen nueva (fix forward).
- Validar readiness, endpoint crítico y base de datos.
El paso a paso está en el runbook docs/RUNBOOK-K8S-DEPLOY-INF-SEC-01.md del repositorio.
Lecciones
- Credencial por defecto es deuda técnica con intereses. Rota antes de que el guard te obligue.
- Preflight en el pipeline: falla antes del build si el secret tiene un valor por defecto.
- La migración es forward-only. Si la imagen nueva aplicó la migración, el rollback de imagen no es seguro.
- El rollout necesita timeout y alerta. 40 minutos es demasiado tiempo para descubrir un CrashLoop.
- Build verde no es deploy verde. Valida readiness y un endpoint de negocio, no solo
/health. - Ten un runbook de fix forward. El camino de vuelta puede no existir.
Checklist para tu pipeline
- [ ] El pipeline valida credenciales/secretos antes de cambiar la imagen.
- [ ] El rollout tiene timeout y alerta.
- [ ] La validación post-deploy incluye un endpoint de negocio.
- [ ] Sé si la imagen aplica migraciones.
- [ ] Tengo un plan de fix forward y rollback de datos.
- [ ] Las credenciales por defecto están rotadas.
Próximo
En el capítulo 09 vamos a exponer la aplicación con Services, Ingress, DNS y TLS — y a entender por qué la ruta real de tráfico importa incluso en las pruebas de carga.
Próximo: Curso Kubernetes 09 — Services, Ingress, DNS y TLS (próximamente). Mientras tanto, vuelve al índice del curso.
Seguir leyendo
Lea también
ArmazenamentoManual LSI / Broadcom MegaRAID — MegaCli y StorCLI
Con esta guía, su equipo gana autonomía para diagnosticar rebuilds, resolver foreign configurations, gestionar BBU y CacheCade — con escenarios reales de producción documentados.
20 min de leitura
Nginx Cheatsheet
Guía de bolsillo con ejemplos listos para configurar Nginx en producción: desde instalación y virtual hosts hasta ajuste de rendimiento y resolución de problemas.
12 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa
Qué prometer, cómo medir y qué hacer cuando el error se dispara: SLI, SLO, presupuesto de error, alertas que despiertan a alguien y postmortem sin caza de brujas.
5 min de leitura
Comentarios
Aún sin comentarios
Sea el primero en compartir su opinión sobre este artículo.
Deje un comentario