• postmortem
  • cloud-service
  • incident

Postmortem: Imagen de Docker no encontrada

Informe del incidente para la interrupción del servicio Logto el 2023-12-17 debido a la pérdida de la imagen de producción de Docker.

Simeng
Simeng
Developer

Resumen

Hemos experimentado una interrupción del servicio el 2023-12-17 debido a la pérdida de la imagen de producción de Docker de Logto.

  • Hora del incidente: 2023-12-17 03:56:00 UTC
  • Duración del incidente: 18 minutos
  • Impacto en el servicio: El servicio en la nube de Logto y el servicio central de Logto no estaban disponibles durante el incidente.
  • Nivel de impacto: Crítico
  • Causa raíz: La imagen de producción de Docker de Logto fue eliminada por error. Falló la recuperación de la imagen desde GitHub Container Registry.

Cronología

HoraEvento
Temprano 2023-12-17 (Hora específica desconocida)Se ejecutó el flujo de trabajo de retención de imágenes de GitHub automatizado de Logto. Las imágenes de producción logto y logto-cloud fueron eliminadas por error.
2023-12-17 03:56:00 UTCEl servicio en la nube de Logto y el servicio central de Logto se volvieron no disponibles. El incidente fue detectado por nuestro sistema de monitoreo.
2023-12-17 04:03:00 UTCIncidente reconocido por nuestro ingeniero de guardia.
2023-12-17 04:10:00 UTCSe desencadenó una nueva implementación del servicio en la nube de Logto y el servicio central de Logto con la última imagen.
2023-12-17 04:15:00 UTCEl servicio en la nube de Logto y el servicio central de Logto se volvieron disponibles. El incidente se resolvió automáticamente.

Análisis del incidente

Qué sucedió

Las imágenes de producción del servicio Logto fueron eliminadas por nuestro flujo de trabajo de retención de imágenes de GitHub automatizado. El servicio en la nube no pudo recuperar la imagen de GitHub Container Registry y se volvió no disponible.

Registro de Servicio

Por qué sucedió

El flujo de trabajo de retención de imágenes de GitHub automatizado eliminó por error las imágenes de producción. El flujo de trabajo fue diseñado para eliminar todas las imágenes heredadas sin etiquetas que tengan más de 3 días.

Etiquetamos las imágenes de producción con la etiqueta prod para identificarlas como imágenes de producción. Cada vez que se desencadena una implementación de producción, se construye y se envía una nueva imagen con la etiqueta prod a GitHub Container Registry. La etiqueta prod se elimina de la imagen antigua después de que la nueva imagen se construye y se envía con éxito. La imagen antigua se vuelve sin etiqueta y será eliminada por el flujo de trabajo de retención de imágenes de GitHub automatizado.

La imagen del servicio Logto fue construida para soportar múltiples arquitecturas. La imagen fue construida con buildx y enviada a GitHub Container Registry con la opción --platform. Todas las etiquetas se aplicaron a la lista principal del manifiesto. La etiqueta prod también se aplicó a la lista principal del manifiesto. Todas las sub-imágenes listadas bajo la lista de manifiesto multi-arquitectura permanecen sin etiquetas.

Debido a la falta de una revisión cuidadosa de la estructura de la etiqueta y la lista de manifiesto de la imagen de Docker, simplemente configuramos el flujo de trabajo automatizado de retención de imágenes de GitHub para eliminar todas las imágenes sin etiquetas. El flujo de trabajo eliminó todas las sub-imágenes listadas en la lista de manifiesto multi-arquitectura.

Impacto

Este incidente causó que el servicio en la nube de Logto y el servicio central de Logto no estuvieran disponibles durante aproximadamente 18 minutos. Los usuarios finales no pudieron iniciar sesión en Logto ni acceder a sus aplicaciones cliente. El portal de administración en la nube de Logto también estuvo no disponible durante el incidente.

Resolución

Hemos detenido el flujo de trabajo automatizado de retención de imágenes de GitHub y hemos desplegado una nueva imagen con la etiqueta prod en GitHub Container Registry. La nueva imagen fue recuperada con éxito por el servicio en la nube de Logto y el servicio central de Logto. El servicio volvió a estar disponible.

Lecciones aprendidas

  • Nunca publique un flujo de trabajo sin una revisión y prueba cuidadosa en el entorno de producción.
  • Ejecute en modo de prueba cualquier trabajo de eliminación de recursos antes de ejecutarlo.
  • Siempre tenga un plan de respaldo para el entorno de producción.
  • Defina cuidadosamente una nueva política de retención de imágenes.

Medidas correctivas y preventivas

  • ✅ Detenga inmediatamente el flujo de trabajo de retención de imágenes automatizado de GitHub.