Atlasingeniería

Incidentes en un servidor propioDeploys que fallan por la mitadTema 2

Contenedores que quedan renombrados y el monitor los da por caídos

El monitoreo avisó que un servicio estaba caído. Estaba corriendo perfecto, con un nombre temporal que le quedó de un recreado interrumpido. Por qué el chequeo por nombre exacto miente y qué mirar en su lugar.

Llega la alerta: un servicio caído. Se entra al servidor, se listan los contenedores, y el servicio está ahí, funcionando, respondiendo. Pero con un nombre raro: un prefijo hexadecimal antes del nombre esperado.

El recreado del despliegue anterior se interrumpió a mitad de camino. El contenedor viejo quedó renombrado y el nuevo nunca se creó.

Qué pasa durante un recreado

La secuencia normal

  1. El contenedor existente se renombra con un prefijo temporal, para liberar el nombre.
  2. Se crea el contenedor nuevo con el nombre definitivo.
  3. Se detiene y se elimina el viejo.

Si el paso 2 falla —imagen que no existe, puerto ocupado, memoria insuficiente, disco lleno—, el proceso se corta y queda el contenedor viejo con nombre temporal. Sigue corriendo y sigue sirviendo: desde el punto de vista del usuario no pasó nada. Desde el punto de vista del monitoreo, el nombre que buscaba no existe.

Por qué el chequeo por nombre miente en los dos sentidos

SituaciónChequeo por nombreLa realidad
Contenedor renombrado por recreado a mediasDice caídoEstá sirviendo
Contenedor arriba pero la aplicación colgadaDice bienNo responde a nadie
Contenedor reiniciándose en cicloDice bien si justo lo agarra arribaCae cada pocos segundos
Las tres filas son el mismo problema: se está midiendo el proceso y no el servicio.

La conclusión es la que se repite en todo monitoreo: medir lo que el usuario experimenta. Una petición real a la aplicación cubre las tres filas de la tabla; la existencia de un proceso, ninguna.

Cómo se arregla el contenedor y cómo el chequeo

Lo inmediato

  1. Forzar el recreado de ese servicio, sin reconstruir, para que se cree con su nombre y el viejo se elimine.
  2. Averiguar por qué falló la creación antes de repetir el despliegue: si fue memoria o disco, va a volver a pasar en el próximo servicio.

Lo que cambió en el monitoreo

  1. Chequeo por respuesta, no por nombre: una petición a la ruta de salud de cada servicio.
  2. Chequeos de salud declarados en la definición de cada contenedor, para que el estado refleje si la aplicación está lista y no sólo si el proceso arrancó.
  3. Detectar contenedores con nombre temporal como una condición propia, distinta de “caído”: es el rastro de un despliegue que falló y conviene verlo como tal.
  4. Alerta con contexto: qué servicio, desde cuándo y qué devuelve, en vez de un aviso genérico.

Antes de seguir, predecí

Un contenedor figura como arriba pero la aplicación no responde. ¿Qué chequeo lo habría detectado?

Que el despliegue no termine en silencio

El otro lado del problema es que el despliegue fallido no avisó. El comando devolvió un error que nadie leyó, y la alerta llegó mucho después por otra vía.

Tres hábitos que lo evitan

  1. Verificar después de desplegar, no al desplegar: que todos los servicios esperados estén arriba, con su nombre, y respondiendo.
  2. Que el script falle fuerte. Si un paso falla, que se detenga y lo diga, en vez de seguir con los siguientes.
  3. Espacio y memoria antes de empezar. Las dos causas más frecuentes de creación fallida son disco lleno y memoria insuficiente, y las dos se pueden chequear en un segundo.
Más a fondo · nivel seniorEl recreado no es atómico y no puede serlo

Entre que el contenedor viejo se detiene y el nuevo atiende, hay un intervalo. En un servidor chico eso es un corte de unos segundos, aceptable para la mayoría de las aplicaciones. Si no lo es, la solución no es un recreado más rápido sino levantar la versión nueva antes de bajar la vieja y mover el tráfico cuando la nueva esté lista, que es lo que hace un despliegue azul-verde. Tiene un costo: durante la transición conviven las dos versiones, y por eso las migraciones tienen que ser compatibles hacia atrás.

El recreado interrumpido en el log

Buscá en el log

La alerta dice que el servicio está caído y el contenedor está ahí, respondiendo. ¿Qué línea explica las dos cosas a la vez?

debug 2info 5warn 1error 311 de 11

Que el despliegue no termine en silencio

Cierre

Autoevaluación

¿Lo entendiste?

¿Por qué un contenedor puede quedar con un nombre con prefijo temporal?
¿Cuál es el problema de monitorear por existencia del contenedor?