<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex Carter</title>
    <description>The latest articles on DEV Community by Alex Carter (@alexcarteruk).</description>
    <link>https://dev.to/alexcarteruk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3832787%2F6c2a651c-6ecb-4fcd-ad18-b957fd195786.png</url>
      <title>DEV Community: Alex Carter</title>
      <link>https://dev.to/alexcarteruk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexcarteruk"/>
    <language>en</language>
    <item>
      <title>Kubernetes: cuando una alerta de email miente</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Mon, 21 Sep 2026 05:23:53 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-cuando-una-alerta-de-email-miente-4ihb</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-cuando-una-alerta-de-email-miente-4ihb</guid>
      <description>&lt;p&gt;Una alerta de email puede parecer una prueba sencilla: el monitor envía un mensaje, alguien lo recibe y el incidente queda cerrado. En Kubernetes, esa conclusión suele ser demasiado optimista. Un pod puede estar sano mientras el proveedor de correo rechaza mensajes, una cola se atasca o el receptor tarda varios minutos.&lt;/p&gt;

&lt;p&gt;El resultado es un alerta que llega tarde, o peor: una alerta que confirma que el proceso local sigue vivo aunque el usuario nunca verá el correo. Para una guardia SRE, el objetivo no es recibir más mensajes. Es saber qué parte del camino funciona y cual dejó de funcionar.&lt;/p&gt;

&lt;h2&gt;
  
  
  La alerta que llega demasiado tarde
&lt;/h2&gt;

&lt;p&gt;Imagina un servicio de notificaciones desplegado con tres réplicas. El endpoint &lt;code&gt;/health&lt;/code&gt; devuelve &lt;code&gt;200&lt;/code&gt;, las métricas de CPU están normales y el despliegue no tiene pods pendientes. Sin embargo, los emails de recuperación de contraseña se acumulan en la cola.&lt;/p&gt;

&lt;p&gt;Hay varias señales distintas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generación:&lt;/strong&gt; la aplicación creó el evento y asignó un identificador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrega al proveedor:&lt;/strong&gt; el worker aceptó el mensaje y recibió una respuesta válida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Procesamiento:&lt;/strong&gt; la cola avanzó sin reintentos anormales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recepción:&lt;/strong&gt; un buzón de prueba encontró el mensaje dentro del tiempo esperado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contenido:&lt;/strong&gt; el enlace, el entorno y el destinatario son correctos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si solo vigilamos la primera señal, confundimos intención con resultado. Las señales llega tarde cuando el monitor se coloca al final de una cadena sin medir sus etapas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separar síntoma, causa y prueba
&lt;/h2&gt;

&lt;p&gt;El primer paso del runbook es escribir el síntoma sin adivinar la causa: “la prueba sintética no encontró un email nuevo en diez minutos”. Después conviene seguir el mismo &lt;code&gt;correlation_id&lt;/code&gt; por la aplicación, el worker y el proveedor.&lt;/p&gt;

&lt;p&gt;Una consulta mínima puede ayudar a clasificar el fallo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;notification_deliveries&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="s1"&gt;'15 minutes'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si hay muchos eventos &lt;code&gt;created&lt;/code&gt; y ninguno &lt;code&gt;accepted&lt;/code&gt;, el problema está antes del proveedor. Si hay &lt;code&gt;accepted&lt;/code&gt; pero no recepción, hay que revisar la entrega, el buzón o la prueba. Si la recepción existe pero el contenido es incorrecto, el servicio no está caído: su contrato cambió.&lt;/p&gt;

&lt;p&gt;Para flujos que usan automatización adicional, conviene &lt;a href="https://dev.to/silviutech/llms-correos-de-fallback-sin-caos-operativo-52im"&gt;aislar emails de agentes LLM&lt;/a&gt; con el mismo criterio: cada ejecución debe tener un identificador y una bandeja de prueba separada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un runbook pequeño para Kubernetes
&lt;/h2&gt;

&lt;p&gt;El runbook no necesita veinte comandos. Necesita preguntas en el orden correcto:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;¿La aplicación produjo el evento?&lt;/strong&gt; Revisa el contador de creación y el &lt;code&gt;correlation_id&lt;/code&gt;, sin imprimir el contenido completo del mensaje en los logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿El worker está consumiendo?&lt;/strong&gt; Compara la edad del mensaje más antiguo con el tiempo normal. Un pod reiniciando rapido puede mantener el deployment “verde” mientras pierde trabajo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿Hay reintentos o bloqueos?&lt;/strong&gt; Mira la tasa de errores y la profundidad de la cola por separado. Mezclarlas hace dificil distinguir capacidad insuficiente de rechazo permanente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿El proveedor aceptó el mensaje?&lt;/strong&gt; Guarda la respuesta técnica, no datos personales innecesarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿La prueba sintética recibió el correo correcto?&lt;/strong&gt; Valida asunto, destinatario, enlace y expiración. Un mensaje vacío no es una prueba exitosa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Durante una ventana de mantenimiento, los &lt;a href="https://dev.to/silviutech/llms-con-aprobaciones-por-email-sin-ruido-cae"&gt;checks de email en una ventana de mantenimiento&lt;/a&gt; deben tener una expectativa explícita: qué se pausa, qué sigue activo y quién recibe la señal.&lt;/p&gt;

&lt;p&gt;Para probar recepción sin mezclar cuentas personales, puede servir &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;temp mail so&lt;/a&gt; como buzón temporal de una prueba controlada. La prueba debe usar un identificador único, limpiar sus datos después y no tratar un buzón temporal como evidencia de identidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo reducir el ruido sin ocultar fallos
&lt;/h2&gt;

&lt;p&gt;El ruido aparece cuando cada intento activa una alerta o cuando un timeout se interpreta como caída total. Una política más util es separar niveles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aviso:&lt;/strong&gt; una prueba lenta, todavía dentro del margen del SLO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incidente:&lt;/strong&gt; varias pruebas consecutivas sin recepción o una cola creciendo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloqueo:&lt;/strong&gt; rechazo permanente, credenciales inválidas o ausencia de consumidores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También ayuda poner un límite de reintentos y una ruta de dead letter observable. Reintentar para siempre mantiene el síntoma vivo, pero borra la causa original. El equipo pueden conservar un evento resumido con el código de error, la edad y el identificador; no hace falta guardar el cuerpo del email.&lt;/p&gt;

&lt;p&gt;En búsquedas internas suelen aparecer términos mal escritos como tepm mail com y temp org mail. Registrarlos como consultas de diagnóstico puede ser útil, pero nunca deben convertirse en comandos ni en nombres de configuración. Lo importante es que el runbook siga siendo claro aun cuando alguien lo lee bajo presión.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist de guardia
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] ¿Cada alerta tiene un &lt;code&gt;correlation_id&lt;/code&gt; que cruza aplicación, worker y prueba?&lt;/li&gt;
&lt;li&gt;[ ] ¿Se mide generación, aceptación y recepción como señales separadas?&lt;/li&gt;
&lt;li&gt;[ ] ¿La cola muestra edad del mensaje, no solo cantidad?&lt;/li&gt;
&lt;li&gt;[ ] ¿Los reintentos tienen límite y una dead letter queue visible?&lt;/li&gt;
&lt;li&gt;[ ] ¿La prueba valida contenido y enlace, no solo código HTTP?&lt;/li&gt;
&lt;li&gt;[ ] ¿Los logs excluyen cuerpos, tokens y direcciones que no hacen falta?&lt;/li&gt;
&lt;li&gt;[ ] ¿El aviso distingue lentitud de fallo confirmado?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una alerta de email no miente por intención; miente cuando le pedimos responder una pregunta distinta de la que realmente mide. En Kubernetes, un pequeño contrato entre métricas, cola y prueba sintética suele dar más confianza que otra notificación urgente. Y en la guardia, una señal menos pero bien explicada vale mucho más que diez alertas sin contexto.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>testing</category>
    </item>
    <item>
      <title>Kubernetes: pruebas sintéticas sin ruido en alertas</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Thu, 17 Sep 2026 17:23:05 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-pruebas-sinteticas-sin-ruido-en-alertas-196l</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-pruebas-sinteticas-sin-ruido-en-alertas-196l</guid>
      <description>&lt;p&gt;Una alerta sintética debería responder una pregunta sencilla: ¿un usuario real podría completar este paso ahora mismo? En muchos clusters de Kubernetes, el canario de correo termina respondiendo otra pregunta: ¿el job de prueba sigue vivo?&lt;/p&gt;

&lt;p&gt;La diferencia parece pequeña, pero cambia el turno de guardia. Si el test usa un buzón compartido, un mensaje retrasado puede parecer una caída del proveedor. Si reintenta sin límite, puede generar duplicados y ocultar la causa. Y si el pod muere sin dejar evidencia, el equipo solo ve un &lt;code&gt;CrashLoopBackOff&lt;/code&gt; y empieza a adivinar.&lt;/p&gt;

&lt;h2&gt;
  
  
  El síntoma: una alerta que nadie cree
&lt;/h2&gt;

&lt;p&gt;El patrón que he visto en revisiones de runbooks es bastante repetido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un &lt;code&gt;CronJob&lt;/code&gt; crea una dirección de prueba.&lt;/li&gt;
&lt;li&gt;La aplicación envía un correo de verificación.&lt;/li&gt;
&lt;li&gt;El job espera unos segundos y busca el mensaje.&lt;/li&gt;
&lt;li&gt;Una métrica marca éxito o fallo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El problema es que esos cuatro pasos mezclan disponibilidad, entrega, identidad y lógica del test. Un fallo en cualquiera de ellos dispara la misma alerta. Después de unas semanas, las personas dejan de reaccionar. Ese es el incidente de verdad: la señal perdió credibilidad.&lt;/p&gt;

&lt;p&gt;También aparece el clásico &lt;em&gt;dummy e mail&lt;/em&gt; en fixtures antiguos. No es malo como dato de entrada, pero no debe confundirse con una comprobación de entrega. Una cadena válida no prueba que el proveedor aceptó, procesó y entregó el mensaje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separar la prueba del incidente real
&lt;/h2&gt;

&lt;p&gt;Primero define qué estás midiendo. Para un flujo de verificación, conviene tener al menos estas señales separadas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Aceptación:&lt;/strong&gt; la API devuelve un identificador de mensaje y un estado aceptado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrega observable:&lt;/strong&gt; el buzón de prueba recibe el mensaje dentro del tiempo esperado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contenido:&lt;/strong&gt; asunto, destinatario y enlace corresponden al entorno de staging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limpieza:&lt;/strong&gt; el test puede terminar sin dejar datos reutilizables.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Un buzón aislado por ejecución hace más fácil atribuir el mensaje correcto. Si el sistema crea direcciones de forma dinámica, guarda solo un identificador efímero en el &lt;code&gt;Secret&lt;/code&gt; o en el almacén de pruebas; no escribas el contenido completo del correo en los logs. Esa pequeña decisión es parte de la &lt;strong&gt;Security&lt;/strong&gt;, no un detalle de comodidad.&lt;/p&gt;

&lt;p&gt;Para instrumentar el flujo, un recibo estructurado ayuda más que un mensaje de log largo. Este formato es suficiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"run_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ci-1842"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"provider-abc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accepted_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-17T17:20:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"received_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-17T17:20:08Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verified"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tu API genera eventos, documenta el contrato y registra la transición, no solo el resultado final. Un artículo sobre &lt;a href="https://dev.to/silviutech/fastapi-recibos-para-emails-async-4mng"&gt;recibos de emails asincrónicos&lt;/a&gt; muestra por qué esta evidencia resulta útil cuando el trabajo ocurre fuera de la petición original.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un contrato pequeño para el canario
&lt;/h2&gt;

&lt;p&gt;El canario debe tener límites explícitos: timeout total, máximo de reintentos y una política para mensajes tardíos. Por ejemplo, un timeout de 60 segundos puede ser razonable para staging, pero el valor debe salir del comportamiento normal medido, no de una cifra copiada.&lt;/p&gt;

&lt;p&gt;En Kubernetes, configura el &lt;code&gt;CronJob&lt;/code&gt; para evitar ejecuciones solapadas. Usa &lt;code&gt;concurrencyPolicy: Forbid&lt;/code&gt; si una segunda ejecución podría leer el buzón de la primera. Define &lt;code&gt;activeDeadlineSeconds&lt;/code&gt; para que un proveedor lento no deje pods eternos. El contenedor debe devolver códigos distintos para error de infraestructura y fallo funcional, aunque la métrica agregada los presente por separado.&lt;/p&gt;

&lt;p&gt;Un punto importante: el canario no debe hacer &lt;em&gt;alert fatigue&lt;/em&gt; por cada fallo aislado. Usa una ventana corta y exige dos o tres fallos consecutivos, salvo que se trate de un error de autenticación o una caída total. La alerta puede incluir la fase que falló: &lt;code&gt;acceptance&lt;/code&gt;, &lt;code&gt;delivery&lt;/code&gt;, &lt;code&gt;content&lt;/code&gt; o &lt;code&gt;cleanup&lt;/code&gt;. Eso ahorra minutos valiosos durante un incidente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué registrar cuando falla
&lt;/h2&gt;

&lt;p&gt;Registra el nombre del entorno, versión desplegada, región, &lt;code&gt;run_id&lt;/code&gt;, fase y latencia. Evita direcciones completas, tokens, enlaces privados y cuerpos de mensajes. Si necesitas comparar contenido, guarda un hash de campos permitidos y no el correo entero.&lt;/p&gt;

&lt;p&gt;Cuando el test falle, compara con el estado del cluster: reinicios del pod, saturación de nodos, errores DNS y latencia de salida. Luego revisa el proveedor. Las &lt;a href="https://dev.to/alexcarteruk/facebook-temp-email-en-revisiones-de-riesgo-33mn"&gt;revisiones de riesgo del correo&lt;/a&gt; también recuerdan una regla útil: una dirección de prueba o un correo recibido es una señal operacional, no una prueba completa de identidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist de operación
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;¿Cada ejecución tiene un &lt;code&gt;run_id&lt;/code&gt; y una bandeja aislada?&lt;/li&gt;
&lt;li&gt;¿La alerta indica la fase exacta que falló?&lt;/li&gt;
&lt;li&gt;¿Hay timeout, límite de reintentos y control de solapamiento?&lt;/li&gt;
&lt;li&gt;¿Los logs excluyen secretos y cuerpos de correo?&lt;/li&gt;
&lt;li&gt;¿Se distinguen fallos funcionales de fallos del cluster?&lt;/li&gt;
&lt;li&gt;¿Se prueban los enlaces contra el host de staging?&lt;/li&gt;
&lt;li&gt;¿El runbook dice qué evidencia recoger antes de reiniciar?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La mejor prueba sintética no intenta imitar toda la producción. Mide un camino pequeño, deja un recibo verificable y desaparece al terminar. Cuando las señales tienen límites claros, el equipo de SRE puede confiar otra vez en sus alertas, incluso cuando la madrugada viene un poco movida.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>testing</category>
    </item>
    <item>
      <title>Kubernetes: un runbook SRE para alertas de email</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Thu, 17 Sep 2026 14:23:01 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-un-runbook-sre-para-alertas-de-email-3515</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-un-runbook-sre-para-alertas-de-email-3515</guid>
      <description>&lt;p&gt;Una alerta de email que llega tarde suele parecer un problema del proveedor. En una guardia SRE, esa suposición cuesta tiempo. El retraso puede estar en el código, en una cola, en un &lt;code&gt;Secret&lt;/code&gt; mal montado, en Kubernetes o en el propio proveedor SMTP.&lt;/p&gt;

&lt;p&gt;Este es el tipo de runbook que conviene tener antes del incidente. No intenta explicar cada detalle de la plataforma. Su objetivo es ayudar a un compañero a pasar de “no llegó el correo” a una causa comprobable, sin cambiar cinco cosas a la vez.&lt;/p&gt;

&lt;h2&gt;
  
  
  El síntoma: la alerta llegó tarde
&lt;/h2&gt;

&lt;p&gt;Empieza registrando tres tiempos distintos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cuándo ocurrió el evento en la aplicación.&lt;/li&gt;
&lt;li&gt;Cuándo se creó el trabajo de envío.&lt;/li&gt;
&lt;li&gt;Cuándo el proveedor aceptó el mensaje.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sin estos tiempos, “retrasado” es solo una impresión. Un mensaje puede estar encolado durante minutos, o puede haber sido aceptado y luego filtrado. En el incidente, anota también el &lt;code&gt;pod&lt;/code&gt;, el namespace, el identificador de correlación y el entorno.&lt;/p&gt;

&lt;p&gt;Una métrica sencilla ayuda bastante: &lt;code&gt;email_delivery_lag_seconds&lt;/code&gt;. Mide desde la creación del trabajo hasta la confirmación del proveedor. No mezcles este valor con el tiempo de procesamiento de la API, porque las dos señales responden preguntas diferentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué debe contener el runbook
&lt;/h2&gt;

&lt;p&gt;El documento debe empezar con una decisión rápida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Fallan todos los correos o solo una plantilla?&lt;/li&gt;
&lt;li&gt;¿Afecta a un namespace o a todos?&lt;/li&gt;
&lt;li&gt;¿Hay trabajos pendientes en la cola?&lt;/li&gt;
&lt;li&gt;¿El proveedor responde con error o no hay respuesta?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Después incluye comandos seguros y de solo lectura. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; notifications get pods &lt;span class="nt"&gt;-o&lt;/span&gt; wide
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; notifications get events &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.lastTimestamp
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; notifications logs deploy/email-worker &lt;span class="nt"&gt;--since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No pegues valores de secretos en el ticket ni en el chat de guardia. Es una cosa pequeña, pero se olvida facilmente cuando todos miran el mismo fallo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separar aplicación, proveedor y Kubernetes
&lt;/h2&gt;

&lt;p&gt;Divide el diagnóstico en tres capas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aplicación.&lt;/strong&gt; Busca errores de serialización, plantillas que no compilan, timeouts y claves de idempotencia repetidas. Un reintento debe conservar el identificador del trabajo; si no, puede producir mensajes duplicados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cola y worker.&lt;/strong&gt; Comprueba la edad del trabajo más antiguo, la tasa de reintentos y el número de consumidores. Si la cola crece pero los pods están sanos, “Running” no significa que el servicio esté bien. Puede haber un límite de concurrencia demasiado bajo o un backoff excesivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes y proveedor.&lt;/strong&gt; Revisa reinicios, cambios recientes de configuración, resolución DNS y límites de salida. Un &lt;code&gt;NetworkPolicy&lt;/code&gt; puede bloquear al proveedor aunque el endpoint interno siga respondiendo. También verifica que el &lt;code&gt;Secret&lt;/code&gt; usado por el Deployment tenga la versión esperada; no lo imprimas, compara solo su existencia, referencia y fecha de rotación.&lt;/p&gt;

&lt;p&gt;Para flujos con reintentos, conviene documentar también cómo se conserva la evidencia. Un &lt;a href="https://dev.to/silviutech/llms-prompts-de-email-que-resisten-retries-n67"&gt;prompt de email que resiste reintentos&lt;/a&gt; es útil en automatización, pero no reemplaza una política de idempotencia en el worker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prueba controlada y evidencia
&lt;/h2&gt;

&lt;p&gt;Cuando el alcance esté claro, envía una prueba a un buzón controlado y etiquetado. Usa una plantilla conocida, un &lt;code&gt;correlation_id&lt;/code&gt; nuevo y un límite de tiempo. No pruebes con la lista real de clientes durante el incidente.&lt;/p&gt;

&lt;p&gt;Guarda solo los datos necesarios: hora de creación, estado del job, respuesta del proveedor, número de intento y hora de confirmación. Si el mensaje contiene datos personales, redáctalos antes de compartir el registro. Para probar casos de producto, esta guía sobre &lt;a href="https://dev.to/hannahdev56/como-probar-emails-de-referidos-en-tu-saas-60c"&gt;emails de referidos en un SaaS&lt;/a&gt; aporta una separación útil entre datos de prueba y métricas reales.&lt;/p&gt;

&lt;p&gt;A veces el síntoma aparece en un dominio de prueba como “tamp mail com”. No lo trates como evidencia de que el proveedor está caído: primero confirma DNS, cuota y respuesta SMTP para ese dominio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist para el siguiente incidente
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Registrar los tres tiempos y el &lt;code&gt;correlation_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Identificar si el fallo es global, por plantilla o por dominio.&lt;/li&gt;
&lt;li&gt;[ ] Revisar cola, reintentos y edad del trabajo más antiguo.&lt;/li&gt;
&lt;li&gt;[ ] Comparar pods, reinicios y eventos del namespace.&lt;/li&gt;
&lt;li&gt;[ ] Confirmar configuración sin revelar secretos.&lt;/li&gt;
&lt;li&gt;[ ] Ejecutar una prueba controlada.&lt;/li&gt;
&lt;li&gt;[ ] Definir quién puede cambiar el backoff o escalar workers.&lt;/li&gt;
&lt;li&gt;[ ] Escribir la causa y la señal que la confirmó.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El runbook queda mejor cuando tiene un dueño y una fecha de revisión. Si nadie sabe quien lo actualiza, en dos meses los nombres de los deployments ya no coinciden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Debo reiniciar los pods primero?
&lt;/h3&gt;

&lt;p&gt;No como primer paso. Un reinicio puede borrar la pista más valiosa. Captura logs, métricas y eventos; después decide si el reinicio es una mitigación segura.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Un HTTP 200 del proveedor significa entrega?
&lt;/h3&gt;

&lt;p&gt;Normalmente significa aceptación de la solicitud, no que el usuario haya visto el mensaje. Conserva el estado de aceptación y, si existe, la información posterior de entrega o rebote.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuándo escalo el incidente?
&lt;/h3&gt;

&lt;p&gt;Escala cuando se acerque el presupuesto de errores, cuando la cola siga creciendo o cuando el fallo afecte a una ruta de autenticación. Esperar a tener la causa perfecta puede aumentar el impacto.&lt;/p&gt;

&lt;p&gt;La meta de un buen runbook SRE no es adivinar. Es reducir el espacio de posibilidades, proteger la evidencia y dejar una decisión clara para la persona que está de guardia a las tres de la mañana.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Kubernetes: recibos para depurar alertas de email</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Sun, 13 Sep 2026 23:23:04 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-recibos-para-depurar-alertas-de-email-1me</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-recibos-para-depurar-alertas-de-email-1me</guid>
      <description>&lt;p&gt;Una alerta de Kubernetes puede decir &lt;code&gt;Deployment degraded&lt;/code&gt; y aun así no responder la pregunta urgente de la guardia: ¿qué pasó con el correo que debía avisarnos? En un incidente reciente, el pod estaba sano, el proveedor de email también, pero nadie podía demostrar si la notificación había sido creada, enviada o rechazada. El sistema funcionaba; la evidencia no.&lt;/p&gt;

&lt;p&gt;Desde entonces trato cada notificación importante como una pequeña transacción. No hace falta guardar el cuerpo completo del mensaje ni montar una plataforma enorme. Hace falta dejar un recibo corto, correlacionable y seguro. Así, una persona puede seguir el recorrido desde la alerta hasta el resultado sin revisar diez dashboards distintos.&lt;/p&gt;

&lt;h2&gt;
  
  
  El síntoma: una alerta que dice demasiado poco
&lt;/h2&gt;

&lt;p&gt;El patrón típico tiene tres piezas separadas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prometheus o el controlador detecta una condición.&lt;/li&gt;
&lt;li&gt;Un servicio interno decide enviar un correo.&lt;/li&gt;
&lt;li&gt;Un worker habla con el proveedor y actualiza el estado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando solo vemos el primer evento, cualquier fallo posterior parece igual. Puede ser un timeout, una credencial vencida, un límite del proveedor o un destinatario mal configurado. En la práctica, el mensaje &lt;code&gt;email failed&lt;/code&gt; no ayuda mucho durante una guardia.&lt;/p&gt;

&lt;p&gt;También conviene que la alerta no aparezca de golpe sin contexto visual. Las &lt;a href="https://dev.to/silviutech/react-estados-de-espera-que-no-cansan-50e"&gt;señales claras antes de tocar un flujo&lt;/a&gt; son útiles en interfaces, pero la misma idea aplica a operaciones: primero mostrar estado, después pedir una acción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué debe contener un recibo
&lt;/h2&gt;

&lt;p&gt;Mi recibo mínimo tiene estos campos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;event_id&lt;/code&gt;: identificador único de la alerta original.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;notification_id&lt;/code&gt;: identificador del intento de email.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;created_at&lt;/code&gt; y &lt;code&gt;finished_at&lt;/code&gt; en UTC.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cluster&lt;/code&gt;, &lt;code&gt;namespace&lt;/code&gt; y nombre del workload.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt;: &lt;code&gt;queued&lt;/code&gt;, &lt;code&gt;sent&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt; o &lt;code&gt;suppressed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;provider_code&lt;/code&gt;: código normalizado, sin secretos ni contenido privado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;attempt&lt;/code&gt;: número de reintento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El &lt;code&gt;event_id&lt;/code&gt; evita mezclar dos alertas parecidas. El &lt;code&gt;notification_id&lt;/code&gt; permite distinguir un reintento de un correo nuevo. Esa diferencia parece pequeña, pero es la que suele faltar cuando el equipo intenta explicar por qué alguien recibió dos avisos.&lt;/p&gt;

&lt;p&gt;Nunca pondría un token, una dirección completa de un usuario o el contenido del email en una etiqueta de Kubernetes. Las labels tienen una vida y una visibilidad demasiado amplias. Para buscar un recibo, basta con un identificador opaco y un enlace interno al sistema que conserva los detalles con sus controles de acceso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un patrón sencillo en Kubernetes
&lt;/h2&gt;

&lt;p&gt;El Deployment puede publicar métricas y logs estructurados, mientras un worker separado maneja el proveedor. El contrato podría verse así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notification_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ntf_8f31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alert_20260913_041"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"attempt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate_limited"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El worker debe ser idempotente: si recibe dos veces el mismo &lt;code&gt;notification_id&lt;/code&gt;, no crea dos envíos. Para reintentos temporales, usa backoff con un límite claro. Para errores permanentes, marca &lt;code&gt;failed&lt;/code&gt; y deja una acción concreta en el runbook. Reintentar para siempre solo convierte un problema pequeño en ruido operativo.&lt;/p&gt;

&lt;p&gt;En los logs, mantengo el mismo contexto en cada línea. Un ejemplo práctico sería buscar &lt;code&gt;event_id=alert_20260913_041&lt;/code&gt; y obtener la cola, el pod, el intento y la respuesta normalizada del proveedor. Esto es bastante mas rápido que copiar timestamps a mano entre herramientas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo investigar el fallo
&lt;/h2&gt;

&lt;p&gt;Cuando llega una alerta sin correo, sigo esta secuencia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmo que la condición original sigue activa o ya fue resuelta.&lt;/li&gt;
&lt;li&gt;Busco el &lt;code&gt;event_id&lt;/code&gt; en el servicio que crea notificaciones.&lt;/li&gt;
&lt;li&gt;Compruebo si existe un &lt;code&gt;notification_id&lt;/code&gt; y cuántos intentos tiene.&lt;/li&gt;
&lt;li&gt;Comparo el &lt;code&gt;provider_code&lt;/code&gt; con el runbook: ¿es temporal o permanente?&lt;/li&gt;
&lt;li&gt;Reviso la salud del worker y su cola, no solo la del API.&lt;/li&gt;
&lt;li&gt;Verifico que el último recibo tenga una hora posterior al evento.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si el último estado es &lt;code&gt;queued&lt;/code&gt; durante demasiado tiempo, el problema no está en el envío sino en la cola. Si es &lt;code&gt;sent&lt;/code&gt; pero nadie recibió nada, hay que mirar la respuesta del proveedor y la ruta del destinatario, sin asumir que el pod está culpable. Esa separación de capas ahorra bastante vueltas.&lt;/p&gt;

&lt;p&gt;Para cambios de nodo o mantenimiento, las &lt;a href="https://dev.to/alexcarteruk/kubernetes-alertas-que-guian-durante-un-drain-4f16"&gt;alertas que guían durante un drain&lt;/a&gt; muestran otro principio importante: cada transición operacional necesita una señal entendible y verificable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist para la guardia
&lt;/h2&gt;

&lt;p&gt;Antes de dar por terminado el trabajo, compruebo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿La alerta tiene un &lt;code&gt;event_id&lt;/code&gt; único?&lt;/li&gt;
&lt;li&gt;¿Cada intento conserva el mismo &lt;code&gt;notification_id&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;¿Los reintentos tienen un máximo y una causa visible?&lt;/li&gt;
&lt;li&gt;¿El proveedor devuelve códigos normalizados?&lt;/li&gt;
&lt;li&gt;¿Las métricas separan &lt;code&gt;queued&lt;/code&gt;, &lt;code&gt;sent&lt;/code&gt; y &lt;code&gt;failed&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;¿El dashboard enlaza al recibo sin exponer secretos?&lt;/li&gt;
&lt;li&gt;¿El runbook explica qué hacer con cada error frecuente?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si una de esas respuestas es “no se”, no significa que haya que rehacer toda la plataforma. Significa que encontraste el siguiente hueco de observabilidad. Incluso una tabla pequeña en PostgreSQL y logs consistentes suelen ser suficiente para la primera versión.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas rápidas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Necesito almacenar el email completo?
&lt;/h3&gt;

&lt;p&gt;No. Guarda un identificador de destinatario protegido o un hash apropiado para correlación. El recibo debe probar el resultado, no convertirse en un archivo de datos personales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué hago con un fallo temporal?
&lt;/h3&gt;

&lt;p&gt;Clasifícalo, reintenta con backoff y registra cada intento. Si la cola supera el límite, genera una alerta diferente: ya no es un fallo de proveedor aislado, es un problema de capacidad o entrega.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Dónde entra una bandeja de prueba?
&lt;/h3&gt;

&lt;p&gt;En entornos no productivos puedes usar un &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;free temp email&lt;/a&gt; para comprobar el recorrido, siempre que los datos sean sintéticos y la política del equipo lo permita. En algunos apuntes aparece escrito &lt;code&gt;fake e mail com&lt;/code&gt;, pero no lo usaría como criterio de seguridad ni como etiqueta de producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cierre
&lt;/h2&gt;

&lt;p&gt;Una alerta de email no termina cuando el worker acepta la tarea. Termina cuando existe un resultado trazable y alguien puede explicar qué ocurrió. Un recibo pequeño, una clave idempotente y estados honestos convierten una notificación vaga en una pista operativa. En la próxima guardia, esa diferencia puede ahorrar más tiempo que otro dashboard brillante.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes: límites claros para alertas de email</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Wed, 09 Sep 2026 14:23:02 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-limites-claros-para-alertas-de-email-cfe</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-limites-claros-para-alertas-de-email-cfe</guid>
      <description>&lt;p&gt;En una guardia, una alerta de email rara vez dice toda la verdad. Puede avisar de que un usuario no confirmó su cuenta, pero el problema real estar en una cola llena, un proveedor lento o un worker reiniciándose en Kubernetes. Si tratamos todos esos casos como el mismo incidente, el equipo termina mirando el sitio equivocado.&lt;/p&gt;

&lt;p&gt;Lo aprendí revisando flujos de signup que usaban correo temporal y también direcciones normales. El síntoma era sencillo: subían los reintentos y bajaban las confirmaciones. Sin embargo, el panel de alertas solo mostraba “email verification failed”. Era correcto, pero no era útil. Un detalle medio pequeño, como el texto &lt;code&gt;tepm mail com&lt;/code&gt; en una prueba manual, incluso podía confundir una búsqueda.&lt;/p&gt;

&lt;h2&gt;
  
  
  La alerta que llega demasiado tarde
&lt;/h2&gt;

&lt;p&gt;El primer error común es alertar solo cuando el usuario ya agotó sus intentos. Para entonces, el incidente tiene varios minutos de historia perdida. El segundo es usar un único umbral para todo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;errores de conexión con el proveedor;&lt;/li&gt;
&lt;li&gt;mensajes aceptados pero no vistos por el worker;&lt;/li&gt;
&lt;li&gt;rebotes permanentes;&lt;/li&gt;
&lt;li&gt;enlaces expirados o usados dos veces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos eventos tienen causas y respuestas diferentes. Un aumento de conexiones rechazadas pide revisar credenciales, DNS o límites del proveedor. Un retraso en la cola pide mirar consumidores, CPU y backpressure. Un enlace usado dos veces puede ser comportamiento normal de un usuario que actualizó la página.&lt;/p&gt;

&lt;p&gt;La alerta debe ayudar a escoger la siguiente consulta, no solo anunciar que algo salió mal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separar síntomas de causa
&lt;/h2&gt;

&lt;p&gt;En el servicio de email suelo separar tres señales: &lt;code&gt;accepted&lt;/code&gt;, &lt;code&gt;delivered&lt;/code&gt; y &lt;code&gt;confirmed&lt;/code&gt;. La primera dice que nuestro sistema entregó el trabajo al proveedor. La segunda indica que el mensaje fue aceptado en destino, si el proveedor ofrece esa información. La tercera pertenece a la aplicación y significa que el usuario completó el flujo.&lt;/p&gt;

&lt;p&gt;No siempre habrá una métrica perfecta para cada etapa, pero la separación evita conclusiones rápidas. Si &lt;code&gt;accepted&lt;/code&gt; cae, miro el worker. Si &lt;code&gt;accepted&lt;/code&gt; permanece estable y &lt;code&gt;delivered&lt;/code&gt; cae, miro el proveedor. Si ambas suben pero &lt;code&gt;confirmed&lt;/code&gt; se queda quieta, reviso el enlace, el contenido y la experiencia del formulario.&lt;/p&gt;

&lt;p&gt;También conviene dar a cada mensaje un &lt;code&gt;request_id&lt;/code&gt; y un &lt;code&gt;delivery_id&lt;/code&gt;. Así una alerta puede llevar al mismo evento en los logs del API, la cola y el deployment. Los checkpoints que permiten &lt;a href="https://dev.to/silviutech/llms-checkpoints-de-tool-use-que-si-reanudan-d67"&gt;reanudar una automatización&lt;/a&gt; siguen la misma idea: conservar contexto para no empezar el diagnóstico desde cero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un contrato de alertas para Kubernetes
&lt;/h2&gt;

&lt;p&gt;El deployment puede estar sano y el flujo de email estar roto. Por eso no basta con alertar sobre pods no disponibles. Un contrato sencillo para el servicio podría ser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disponibilidad:&lt;/strong&gt; el endpoint de health responde y los workers consumen mensajes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latencia:&lt;/strong&gt; la edad del mensaje más antiguo queda por debajo del límite acordado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calidad:&lt;/strong&gt; la proporción de fallos permanentes no supera el nivel esperado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contexto:&lt;/strong&gt; cada alerta incluye proveedor, región, tipo de mensaje y &lt;code&gt;delivery_id&lt;/code&gt; de ejemplo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En Kubernetes, estas señales pueden vivir en métricas exportadas por el worker y reglas de Prometheus. El nombre exacto importa menos que la consistencia. Una alerta como &lt;code&gt;EmailQueueOldestMessageTooOld&lt;/code&gt; explica mucho más que &lt;code&gt;EmailProblem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Evito poner un número arbitrario como “más de 10 errores”. Un servicio pequeño y uno grande necesitan límites distintos. Es mejor calcular una proporción durante una ventana y añadir una condición de volumen mínimo para no despertar al equipo por una sola prueba.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué guardar en el runbook
&lt;/h2&gt;

&lt;p&gt;El runbook no debe ser una novela. Para el primer diagnóstico, dejo cinco preguntas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿La cola crece o solo aumentaron los fallos de confirmación?&lt;/li&gt;
&lt;li&gt;¿El problema afecta a un proveedor, región o tipo de cuenta?&lt;/li&gt;
&lt;li&gt;¿Hay cambios recientes en el deployment o en la configuración?&lt;/li&gt;
&lt;li&gt;¿El worker está reiniciando, limitado por CPU o sin conexión?&lt;/li&gt;
&lt;li&gt;¿Podemos reprocesar con seguridad, o provocaríamos duplicados?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La última pregunta es importante. Si el reenvío no es idempotente, reintentar a ciegas puede duplicar mensajes y empeorar el incidente. En el frontend, conviene &lt;a href="https://dev.to/silviutech/react-evita-dobles-envios-al-reenviar-email-56m5"&gt;evitar dobles envíos al repetir una acción&lt;/a&gt;; en el backend, el &lt;code&gt;delivery_id&lt;/code&gt; debe proteger el mismo límite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist de revisión
&lt;/h2&gt;

&lt;p&gt;Antes de activar una alerta nueva, reviso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tiene un nombre que describe la condición;&lt;/li&gt;
&lt;li&gt;incluye una métrica y una ventana claras;&lt;/li&gt;
&lt;li&gt;distingue warning de page;&lt;/li&gt;
&lt;li&gt;enlaza un dashboard y un runbook;&lt;/li&gt;
&lt;li&gt;contiene suficiente contexto para filtrar logs;&lt;/li&gt;
&lt;li&gt;tiene una acción segura y reversible;&lt;/li&gt;
&lt;li&gt;fue probada con un fallo simulado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una alerta buena no promete explicar todo. Promete llevarte al primer paso correcto. Eso ya reduce bastante el ruido durante una guardia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas rápidas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Debo alertar por cada email fallido?
&lt;/h3&gt;

&lt;p&gt;No. Agrupa por tasa, duración y volumen mínimo. Los errores individuales deben quedar en logs o métricas de diagnóstico.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El correo temporal merece una regla separada?
&lt;/h3&gt;

&lt;p&gt;Solo si el producto lo necesita. No mezcles una política de riesgo con un fallo operativo: una decisión de negocio no significa que Kubernetes esté enfermo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué hago si no tengo métricas de entrega?
&lt;/h3&gt;

&lt;p&gt;Empieza por medir aceptación del proveedor, edad de cola y confirmación de aplicación. Después añade señales más específicas, sin esperar a tener un sistema perfecto.&lt;/p&gt;

&lt;p&gt;La meta no es recibir más avisos. Es que, cuando llegue uno, el equipo sepa qué cambió, qué impacto tiene y cuál es el siguiente comando seguro.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes: alertas que guían durante un drain</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Sun, 06 Sep 2026 11:23:11 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-alertas-que-guian-durante-un-drain-4f16</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-alertas-que-guian-durante-un-drain-4f16</guid>
      <description>&lt;h1&gt;
  
  
  Kubernetes: alertas que guían durante un drain
&lt;/h1&gt;

&lt;p&gt;Un &lt;code&gt;kubectl drain&lt;/code&gt; suele empezar como una tarea rutinaria y terminar con varias personas mirando el mismo panel. El problema no siempre es que Kubernetes esté fallando. Muchas veces es que la alerta solo dice “pod pending” o “node unavailable”, sin explicar el riesgo ni la siguiente acción.&lt;/p&gt;

&lt;p&gt;En una guardia, una buena notificación debe ayudar a responder tres preguntas: qué cambió, a quién afecta y qué comprobación toca ahora. Esta es la pequeña disciplina que me ha funcionado para mantenimientos y cambios de capacidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  El síntoma: un drain que parece un incidente
&lt;/h2&gt;

&lt;p&gt;Cuando se drena un nodo, los pods se reubican según sus reglas de scheduling. Si existe un &lt;code&gt;PodDisruptionBudget&lt;/code&gt; demasiado estricto, un volumen que no puede moverse o una afinidad difícil de satisfacer, el proceso se frena. El mensaje genérico no distingue entre una espera esperada y una pérdida real de capacidad.&lt;/p&gt;

&lt;p&gt;Primero separo el evento del impacto. La alerta debe incluir el nombre del cluster, el nodo, la zona, la hora de inicio y el deployment afectado. También conviene indicar si el cambio fue planificado. Parece obvio, pero en la noche se olvida facil.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los datos mínimos de una alerta útil
&lt;/h2&gt;

&lt;p&gt;Una notificación accionable puede tener este formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[planificado] drain iniciado
cluster: prod-eu
nodo: ip-10-4-18-22
zona: eu-west-1b
workload: payments-api
estado: 2 pods pendientes durante 90s
riesgo: capacidad disponible por debajo del objetivo
siguiente acción: revisar PDB y eventos del scheduler
runbook: /runbooks/kubernetes/node-drain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No hace falta enviar todo el log. El primer bloque debe ser corto; los detalles pueden vivir en los enlaces de observabilidad. Para el equipo, &lt;strong&gt;tempmailso&lt;/strong&gt; puede aparecer como identificador de prueba en un entorno aislado, pero nunca debe mezclarse una bandeja de pruebas con una alerta de producción. En pruebas de entrega, un flujo de &lt;strong&gt;temporary disposable mail&lt;/strong&gt; sirve para comprobar el camino sin usar cuentas personales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un flujo seguro para investigar
&lt;/h2&gt;

&lt;p&gt;Durante el drain sigo siempre el mismo orden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmo que el cambio está en la ventana aprobada y que el nodo correcto es el objetivo.&lt;/li&gt;
&lt;li&gt;Reviso &lt;code&gt;kubectl get events&lt;/code&gt; y el motivo exacto del pod pendiente.&lt;/li&gt;
&lt;li&gt;Compruebo PDB, réplicas disponibles y capacidad libre en los nodos restantes.&lt;/li&gt;
&lt;li&gt;Comparo el estado con el deployment anterior, no solo con el último minuto.&lt;/li&gt;
&lt;li&gt;Si el impacto crece, pauso el drain y comunico una decisión concreta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este orden evita escalar por reflejo. Un drain lento no es automaticamente una caída, aunque sí es una señal para mirar el presupuesto de interrupciones.&lt;/p&gt;

&lt;p&gt;Para mejorar el mensaje de mantenimiento, suelo combinarlo con una guía de &lt;a href="https://dev.to/alexcarteruk/kubernetes-correos-claros-en-mantenimientos-sre-327l"&gt;correos claros durante mantenimientos SRE&lt;/a&gt;. Y antes de una rotación de guardia, merece la pena &lt;a href="https://dev.to/alexcarteruk/como-probar-correos-de-handoff-en-guardias-sre-m14"&gt;probar el handoff de una guardia SRE&lt;/a&gt;, incluyendo el enlace al runbook y al dashboard correcto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo evitar ruido y falsos positivos
&lt;/h2&gt;

&lt;p&gt;No alertaría por cada pod pendiente. Pondría una ventana pequeña y un umbral relacionado con el impacto: por ejemplo, varios pods pendientes durante un periodo sostenido, o la pérdida de una réplica disponible en un servicio crítico. El número exacto depende del workload; lo importante es que el umbral tenga una razón documentada.&lt;/p&gt;

&lt;p&gt;También separo severidad de prioridad. Un mantenimiento planificado puede ser severidad baja aunque requiera atención inmediata si el PDB bloquea el cambio. En cambio, una alerta de alta severidad sin una acción clara solo añade presión.&lt;/p&gt;

&lt;p&gt;Un detalle que suele romper la investigación es el identificador inconsistente. Usa el mismo run ID en el evento, el ticket y el mensaje de correo. Si haces pruebas con &lt;strong&gt;temp mail so&lt;/strong&gt;, conserva ese texto como contexto de prueba y no como una razón para bloquear automáticamente usuarios reales. En algunos sistemas aparece el typo &lt;strong&gt;tempail mail&lt;/strong&gt;; conviene reconocerlo en filtros de test, pero no convertirlo en una regla de seguridad de producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist de guardia
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] ¿La alerta indica si el drain fue planificado?&lt;/li&gt;
&lt;li&gt;[ ] ¿Incluye cluster, nodo, zona y workload?&lt;/li&gt;
&lt;li&gt;[ ] ¿Distingue espera normal de riesgo de capacidad?&lt;/li&gt;
&lt;li&gt;[ ] ¿Muestra el motivo del scheduler o el enlace a eventos?&lt;/li&gt;
&lt;li&gt;[ ] ¿Indica una siguiente acción y un responsable?&lt;/li&gt;
&lt;li&gt;[ ] ¿El run ID coincide entre correo, dashboard y ticket?&lt;/li&gt;
&lt;li&gt;[ ] ¿El rollback o la pausa están explicados en el runbook?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas rápidas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Debo alertar al empezar cada drain?
&lt;/h3&gt;

&lt;p&gt;Sí, pero como evento informativo si no hay impacto. La alerta operativa debe aparecer cuando se cruza un umbral que alguien puede investigar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué hago si el PDB bloquea el drain?
&lt;/h3&gt;

&lt;p&gt;No lo fuerces de inmediato. Comprueba réplicas, disponibilidad real y la ventana aprobada. Si el cambio es urgente, registra la decisión y coordina el ajuste con el propietario del servicio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Una alerta más larga es más útil?
&lt;/h3&gt;

&lt;p&gt;No necesariamente. El resumen debe orientar en segundos; el detalle debe estar enlazado y ser reproducible.&lt;/p&gt;

&lt;p&gt;La meta no es eliminar todas las alertas durante un mantenimiento. Es hacer que cada mensaje reduzca la incertidumbre: qué pasó, qué riesgo existe y cuál es el siguiente paso. Cuando esa información está en el primer vistazo, la guardia respira un poco mejor y los drains dejan de parecer misteriosos.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes: rehearsa tus correos de guardia</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Thu, 03 Sep 2026 20:24:10 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-rehearsa-tus-correos-de-guardia-56i9</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-rehearsa-tus-correos-de-guardia-56i9</guid>
      <description>&lt;p&gt;En varios equipos he visto el mismo patron: se prueba el despliegue, se prueba la alerta en Slack, y se asume que el correo de guardia tambien quedo bien. Luego llega una ventana de cambio un viernes y el mail que debia dar contexto solo dice "pod unhealthy" o llega al alias equivocado. Kubernetes no rompio nada por si solo; el problema fue tratar el correo operativo como un detalle menor.&lt;/p&gt;

&lt;p&gt;Ese detalle importa porque el email sigue siendo parte del circuito de escalado, auditoria y handoff. Segun el reporte 2024 de incident response de PagerDuty, los equipos con procesos claros de escalado reducen el tiempo de coordinacion en incidentes complejos, sobre todo cuando varios canales deben coincidir: &lt;a href="https://www.pagerduty.com/resources/incident-response/incident-management-report/" rel="noopener noreferrer"&gt;https://www.pagerduty.com/resources/incident-response/incident-management-report/&lt;/a&gt;. Mi regla practica es simple: si una alerta merece despertar a alguien, tambien merece un ensayo corto antes del cambio.&lt;/p&gt;

&lt;h2&gt;
  
  
  El fallo no suele estar en Kubernetes
&lt;/h2&gt;

&lt;p&gt;Cuando reviso un correo de guardia defectuoso, casi nunca encuentro una causa "magica". Lo normal es una mezcla bastante humana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;el subject no distingue entre ruido y accion real&lt;/li&gt;
&lt;li&gt;el cuerpo no incluye cluster, namespace o servicio afectado&lt;/li&gt;
&lt;li&gt;el enlace al runbook apunta a una version vieja&lt;/li&gt;
&lt;li&gt;la distribucion de destinatarios cambio y nadie lo noto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En otras palabras, faltaba contrato operativo. Lo mismo que pedimos en una API lo deberiamos pedir en las notificaciones. Por eso me gusta pensar estos mensajes como una interfaz estable: entradas claras, salida clara, y una forma obvia de verificarla cuando cambias algo en Seguridad o en Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que ensayo antes de una ventana delicada
&lt;/h2&gt;

&lt;p&gt;Antes de tocar reglas de red, secretos o rutas de salida, hago un ensayo pequeño. No necesito un gran entorno de caos, solo evidencia de que el correo sigue contando la historia correcta.&lt;/p&gt;

&lt;p&gt;Mi checklist suele verse asi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generar un evento controlado que active la misma plantilla de correo&lt;/li&gt;
&lt;li&gt;verificar subject, severidad y destinatarios&lt;/li&gt;
&lt;li&gt;confirmar que el cuerpo incluye cluster, servicio, hora y accion sugerida&lt;/li&gt;
&lt;li&gt;abrir el runbook enlazado y comprobar que no esta muerto&lt;/li&gt;
&lt;li&gt;guardar el resultado junto al cambio o ticket&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los detalles de presentacion tambien importan mas de lo que parece. Si el mensaje se lee con prisa, ayuda mucho usar &lt;a href="https://dev.to/silviutech/react-labels-persistentes-para-email-claro-1g7l"&gt;etiquetas persistentes para avisos de email claros&lt;/a&gt; y &lt;a href="https://dev.to/silviutech/react-ayuda-de-email-que-no-roba-foco-422k"&gt;mensajes de ayuda que no roban foco&lt;/a&gt; como referencia de claridad. No por React en si, sino porque la leccion es la misma: la interfaz debe explicar, no distraer.&lt;/p&gt;

&lt;p&gt;En un simulacro reciente, el alias de backup seguia apuntando a un grupo antiguo. El sistema "funcionaba", pero la persona correcta no iba a verlo. Es un fallo muy comun, y un poco tonto, pero justo por eso conviene ensayarlo antes y no durante la guardia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Una ruta corta para validar el correo de guardia
&lt;/h2&gt;

&lt;p&gt;Si el flujo depende de jobs o hooks, prefiero una validacion aburrida y repetible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;RUN_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d%H%M%S&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;OUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"artifacts/&lt;/span&gt;&lt;span class="nv"&gt;$RUN_ID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

./scripts/trigger-alert-mail.sh &lt;span class="nt"&gt;--env&lt;/span&gt; staging &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUT&lt;/span&gt;&lt;span class="s2"&gt;/trigger.json"&lt;/span&gt;
./scripts/fetch-last-alert-mail.sh &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUT&lt;/span&gt;&lt;span class="s2"&gt;/message.json"&lt;/span&gt;
./scripts/check-alert-mail.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUT&lt;/span&gt;&lt;span class="s2"&gt;/message.json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--must-contain&lt;/span&gt; &lt;span class="s2"&gt;"cluster=prod-eu1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--must-contain&lt;/span&gt; &lt;span class="s2"&gt;"namespace=payments"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--must-contain&lt;/span&gt; &lt;span class="s2"&gt;"runbook"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUT&lt;/span&gt;&lt;span class="s2"&gt;/verdict.json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No es elegante, pero si deja evidencia buena. Tambien me ayuda a cazar cosas raras, como cuando un valor de &lt;code&gt;temp mailid&lt;/code&gt; queda filtrado desde pruebas antiguas o cuando alguien documenta un dominio estilo &lt;code&gt;tepm mail com&lt;/code&gt; en una nota interna y termina copiandolo al sitio equivocado. Son errores pequenos, yes, pero en incidentes reales hacen perder tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde encaja un inbox aislado sin volverlo spam
&lt;/h2&gt;

&lt;p&gt;Si quieres comprobar formato o entrega en un entorno no productivo, un inbox aislado puede servir. La clave es que sea contextual y limitado. Para smoke tests de staging he usado un &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;correo temporal gratis&lt;/a&gt; cuando necesito validar la plantilla final sin tocar buzones reales del equipo. No lo usaria como pieza central del monitoreo, pero si como apoyo breve para verificar render, subject y metadatos en pruebas controladas.&lt;/p&gt;

&lt;p&gt;Lo importante es no mezclar eso con la decision de escalado. El correo operativo verdadero debe seguir anclado a tus listas, runbooks y ownership reales. El inbox temporal solo cubre una pregunta acotada: "el mensaje sale como creemos que sale?" Si intentas resolver mas que eso, empiesa a volverse ruido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cada cambio necesita ensayo completo?
&lt;/h3&gt;

&lt;p&gt;No. Si cambias una dashboard, probablemente no. Si cambias plantillas, destinatarios, rutas SMTP, secretos, hooks o reglas de red, yo diria que si merece un ensayo corto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Que guardo como evidencia minima?
&lt;/h3&gt;

&lt;p&gt;Subject, destinatarios esperados, cuerpo recibido, hora del ensayo y enlace al runbook. Con eso ya puedes revisar bastante bien despues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Esto ayuda de verdad en postmortems?
&lt;/h3&gt;

&lt;p&gt;Mucho. Evita la discusion eterna de "seguro alguien recibio algo". O tienes evidencia, o no la tienes. Ese pequeño habito vuelve el analisis bastante mas limpio.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>security</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Terraform: valida alertas tras cada drift fix</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Wed, 02 Sep 2026 02:23:58 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/terraform-valida-alertas-tras-cada-drift-fix-32m9</link>
      <guid>https://dev.to/alexcarteruk/terraform-valida-alertas-tras-cada-drift-fix-32m9</guid>
      <description>&lt;p&gt;Corregir drift con Terraform suele sentirse como tarea de higiene: comparas estado, aplicas el cambio y sigues con lo siguiente. En produccion no siempre sale tan limpio. Varias veces he visto un &lt;code&gt;terraform apply&lt;/code&gt; resolver el desvio tecnico y, cinco minutos despues, dejar dudas sobre si las alertas, las suscripciones o los checks externos siguen contando la historia correcta. El plan salio bien, pero la confianza del equipo no quedo tan bien.&lt;/p&gt;

&lt;p&gt;Para mi, ese es el punto clave: un drift fix no termina cuando el recurso vuelve a coincidir con el codigo. Termina cuando observabilidad, automatizaciones y evidencia operativa siguen intactas. Si cambias una ruta de SNS, una policy, un webhook o una variable que toca notificaciones, el riesgo no es solo "romper infra". El riesgo real es perder señal justo cuando piensas que ya cerraste el tema.&lt;/p&gt;

&lt;p&gt;Segun el State of DevOps Report, los equipos con procesos mas estandarizados recuperan servicio con menos friccion y menos retrabajo (&lt;a href="https://cloud.google.com/devops/state-of-devops/" rel="noopener noreferrer"&gt;https://cloud.google.com/devops/state-of-devops/&lt;/a&gt;). En la practica, eso significa validar el cambio y tambien validar el contexto alrededor del cambio. Parece obvio, pero en guardia se olvida bastante facil.&lt;/p&gt;

&lt;h2&gt;
  
  
  El drift fix que parecia inocente
&lt;/h2&gt;

&lt;p&gt;El caso tipico arranca con algo menor: una suscripcion recreada a mano, un secreto rotado fuera del flujo normal, una policy ajustada por consola. Terraform detecta drift, alguien prepara el plan y todo indica que el apply es seguro. El error aparece despues, cuando una alerta ya no llega, un correo de verificacion usa la ruta vieja o un sistema externo deja de confirmar el evento esperado.&lt;/p&gt;

&lt;p&gt;Eso pasa porque el drift casi nunca vive solo. Suele tocar bordes entre infraestructura y producto: colas, topics, webhooks, reglas IAM, dominios, DNS o jobs de apoyo. Cuando esos bordes cambian, yo prefiero buscar una evidencia externa pequeña. A veces basta con una prueba controlada hacia una &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;direccion de correo desechable&lt;/a&gt; para confirmar que el evento realmente salio del sistema correcto y no de una ruta vieja que sobrevivio por casualidad.&lt;/p&gt;

&lt;p&gt;Tambien conviene mirar el historial reciente del equipo. Si ya tuviste problemas esperando eventos asincronos, ideas como &lt;a href="https://dev.to/silviutech/fastapi-espera-util-para-correos-async-3ojn"&gt;esperar eventos de correo sin bloquear procesos&lt;/a&gt; sirven mucho porque fuerzan a pensar en tiempos, retries y puntos de observacion antes de declarar exito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que revisar antes de aplicar
&lt;/h2&gt;

&lt;p&gt;Mi preflight para estos cambios es corta y poco elegante, pero funciona:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;¿Que recurso esta en drift y que dependencias laterales toca?&lt;/li&gt;
&lt;li&gt;¿Que alertas o automatizaciones dependen de ese recurso?&lt;/li&gt;
&lt;li&gt;¿Que evidencia externa voy a usar despues del apply?&lt;/li&gt;
&lt;li&gt;¿Que señal me obliga a pausar aunque Terraform termine sin error?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No hace falta burocracia larga. Hace falta dejar escrito que vas a comprobar. Si el drift toca correo transaccional, login magic links o aprobaciones por email, me gusta anotar una prueba simple con &lt;code&gt;change_id&lt;/code&gt;, hora del apply y destino esperado. En algun runbook viejo llegue a ver texto basura tipo tamp mail com mezclado en ejemplos, y eso me recordó algo muy de SRE: si la evidencia es ambigua, la conclusion tambien lo sera.&lt;/p&gt;

&lt;p&gt;Otro detalle util es revisar outputs y tags antes de aplicar. Muchos equipos vigilan el recurso principal, pero no los labels o metadatos que consumen otros sistemas. Ahi nacen los falsos verdes: la infraestructura converge, pero la alerta o la auditoria empieza a mirar el sitio equivocado. Es un fallo pequeño, medio tonto, pero caro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como valido alertas y evidencia despues del apply
&lt;/h2&gt;

&lt;p&gt;Despues del &lt;code&gt;terraform apply&lt;/code&gt;, intento hacer tres validaciones en este orden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmar que el recurso converge sin cambios pendientes.&lt;/li&gt;
&lt;li&gt;Verificar una señal interna: logs, metricas o una alerta de prueba.&lt;/li&gt;
&lt;li&gt;Verificar una señal externa que no dependa del mismo camino.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si el cambio toca un flujo de notificaciones, una opcion rapida es disparar un evento controlado y observarlo de punta a punta. En algunos equipos uso un inbox temporal de &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;temp mail so&lt;/a&gt; solo como evidencia complementaria, no como pieza central del sistema. Lo importante no es la herramienta exacta. Lo importante es tener una prueba visible, repetible y facil de explicar a la persona de guardia que llega despues.&lt;/p&gt;

&lt;p&gt;Cuando el equipo ya trabaja con procedimientos mas ordenados, ideas como &lt;a href="https://dev.to/silviutech/llms-con-runbooks-de-email-que-si-escalan-5cje"&gt;runbooks de correo que si escalan&lt;/a&gt; ayudan bastante. No por el correo en si, sino porque fuerzan una disciplina sana: definir entradas, salida esperada y criterio de fallo. Esa estructura baja mucho la discusion rara de "creo que quedo bien".&lt;/p&gt;

&lt;p&gt;Este bloque simple suele alcanzarme:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform plan &lt;span class="nt"&gt;-refresh-only&lt;/span&gt;
terraform apply
terraform output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y al lado dejo una nota operativa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;evento disparado&lt;/li&gt;
&lt;li&gt;hora esperada de entrega&lt;/li&gt;
&lt;li&gt;evidencia interna revisada&lt;/li&gt;
&lt;li&gt;evidencia externa revisada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suena basico, lo se, pero en cambios de drift la claridad gana. He visto equipos muy buenos perder media hora porque nadie dejó escrito cual era la verificacion final. Cuando eso pasa, todo el mundo reabre dashboards, mira logs viejos y empieza a adivinar. Es justo lo que queriamos evitar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un checklist corto para el siguiente cambio
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;El plan identifica dependencias laterales, no solo el recurso en drift.&lt;/li&gt;
&lt;li&gt;Hay una prueba externa definida antes del apply.&lt;/li&gt;
&lt;li&gt;Las alertas o suscripciones afectadas tienen dueño claro.&lt;/li&gt;
&lt;li&gt;La evidencia posterior al cambio queda anotada en el runbook.&lt;/li&gt;
&lt;li&gt;Existe una condicion concreta para pausar o revertir.&lt;/li&gt;
&lt;li&gt;La persona on-call puede entender el resultado sin pedir contexto extra.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Esto aplica solo a cambios grandes?
&lt;/h3&gt;

&lt;p&gt;No. En realidad los cambios pequeños engañan mas. Como parecen seguros, nadie prepara validacion suficiente y el hueco se nota despues.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Siempre necesito una prueba externa?
&lt;/h3&gt;

&lt;p&gt;No siempre, pero ayuda mucho cuando el drift toca notificaciones, identidad o integraciones. Si todo se valida desde el mismo plano que acabas de cambiar, te puedes mentir sin querer.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hace falta automatizar cada paso?
&lt;/h3&gt;

&lt;p&gt;Tampoco. Primero haria el checklist manual y estable. Cuando veas el patron repetido, automatizas la mitad util. Intentar automatizar todo desde el dia uno aveces mete mas ruido del que quita.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
      <category>sre</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Facebook temp email en revisiones de riesgo</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Tue, 01 Sep 2026 23:24:20 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/facebook-temp-email-en-revisiones-de-riesgo-33mn</link>
      <guid>https://dev.to/alexcarteruk/facebook-temp-email-en-revisiones-de-riesgo-33mn</guid>
      <description>&lt;p&gt;Cuando una cola de soporte o un sistema antifraude marca una cuenta por usar &lt;code&gt;email temporal para Facebook&lt;/code&gt;, la tentacion es aplicar una regla dura y seguir con lo siguiente. En produccion eso casi nunca sale tan limpio. El problema no es solo el correo en si, sino la mezcla de contexto: que intento hacer la cuenta, que otras senales habia, y si el equipo puede explicar la decision despues sin adivinar. Ese detalle importa bastante cuando hay guardia, tickets o apelaciones cruzadas.&lt;/p&gt;

&lt;p&gt;He visto equipos tratar &lt;code&gt;correo temporal desechable&lt;/code&gt; como si fuera una prueba final de abuso. A veces lo es, pero muchas veces solo es una pista. Si la operacion responde con reglas demasiado toscas, terminas con soporte saturado, usuarios legitimos confundidos y un panel de riesgo que parece mas seguro de lo que realmente esta. No es un fallo raro, de hecho pasa mas seguido de lo que deberia.&lt;/p&gt;

&lt;p&gt;Cloudflare analizo campañas recientes donde el abuso se apoyaba en identidades de corta vida y flujos automatizados, lo que vuelve mas importante correlacionar varias senales en vez de reaccionar a una sola (&lt;a href="https://blog.cloudflare.com/" rel="noopener noreferrer"&gt;https://blog.cloudflare.com/&lt;/a&gt;). Esa idea encaja muy bien con SRE y Seguridad: el objetivo no es bloquear mucho, sino bloquear con criterio y dejar una traza que otra persona pueda revisar sin empezar de cero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que este caso genera tanto ruido
&lt;/h2&gt;

&lt;p&gt;La palabra "temporal" mete ansiedad operativa. Mucha gente la oye y asume fraude, pero en sistemas reales aparecen matices: pruebas internas, usuarios que protegen su privacidad, automatizaciones legitimas y tambien actores abusivos. Cuando todo eso cae en la misma cola, la decision rapida suele crear mas trabajo despues. A veces, incluso bastante mas.&lt;/p&gt;

&lt;p&gt;El ruido sube cuando la decision depende de una captura parcial del momento. Si solo guardas "dominio sospechoso" y no el flujo exacto, luego nadie sabe si la cuenta estaba creando anuncios, recuperando acceso o solo probando una integracion. Ese vacio le pega a soporte, pero tambien a on-call. Una alerta ambigua en identidad se parece mucho a una alerta ambigua de infraestructura: obliga a leer demasiado entre lineas.&lt;/p&gt;

&lt;p&gt;Tambien he visto sistemas donde alguien mete palabras de prueba como &lt;code&gt;tempail&lt;/code&gt; en notas internas o casos manuales. No rompe nada por si sola, claro, pero si el proceso ya viene flojito esa clase de detalle termina filtrandose a decisiones que deberian ser mas precisas. Son pequenas senales de desorden operacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que revisar antes de bloquear o limitar
&lt;/h2&gt;

&lt;p&gt;Antes de bloquear una cuenta por este patron, me gusta revisar cuatro cosas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;La accion intentada: no es igual crear una cuenta nueva que cambiar un email ya verificado.&lt;/li&gt;
&lt;li&gt;La velocidad: cuantas acciones similares hizo la misma identidad o red en poco tiempo.&lt;/li&gt;
&lt;li&gt;La explicabilidad: que dato quedara disponible para revisar la decision luego.&lt;/li&gt;
&lt;li&gt;El costo de error: que pasa si bloqueas a un usuario legitimo durante una hora.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si una regla solo mira el dominio del correo, va corta. Si ademas mira el momento del flujo, el historial reciente y la posibilidad de apelar, ya se vuelve mucho mas util. Este es el mismo principio de &lt;a href="https://dev.to/hannahdev56/saas-soporte-listo-tras-emails-de-trial-465i"&gt;dar mejor contexto al soporte desde el email&lt;/a&gt;: no basta con una senal, hace falta que la persona que recibe el caso entienda por que aparecio.&lt;/p&gt;

&lt;p&gt;En la interfaz interna tambien conviene &lt;a href="https://dev.to/silviutech/react-estados-de-carga-accesibles-para-email-1nmk"&gt;mostrar estados de revision sin meter mas friccion&lt;/a&gt;. Si el panel dice "alto riesgo" pero no muestra la razon corta, el analista pierde tiempo y la cola se mueve peor. Parece un detalle de UX, pero termina siendo una decision operativa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un runbook corto para soporte y seguridad
&lt;/h2&gt;

&lt;p&gt;No hace falta una politica enorme. Un runbook corto suele funcionar mejor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Registrar el evento con &lt;code&gt;user_id&lt;/code&gt;, accion, dominio de correo y hora.&lt;/li&gt;
&lt;li&gt;Adjuntar una razon legible: "correo temporal + velocidad alta" o "correo temporal sin otras senales".&lt;/li&gt;
&lt;li&gt;Separar respuesta automatica de revision manual.&lt;/li&gt;
&lt;li&gt;Definir una ruta de apelacion para cuentas bloqueadas.&lt;/li&gt;
&lt;li&gt;Revisar semanalmente falsos positivos y reglas que ya no ayudan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando ese runbook existe, soporte deja de improvisar y seguridad deja de recibir escalaciones medio ciegas. Tambien ayuda a que el equipo no trate cada ticket como un mini incidente. Suena basico, lo se, pero en operaciones lo basico bien hecho gana muchas veces.&lt;/p&gt;

&lt;p&gt;Si quieres una version minima en pseudocodigo, seria algo asi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if temporary_email and high_velocity:
  require_manual_review
elif temporary_email and trusted_history:
  allow_with_extra_verification
else:
  continue_normal_flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La clave es que &lt;code&gt;temporary_email&lt;/code&gt; no sea la unica variable importante. El sistema tiene que contar una historia revisable, no solo emitir un veredicto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Senales que si ayudan y senales que estorban
&lt;/h2&gt;

&lt;p&gt;Las senales utiles suelen ser pocas y claras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cambio reciente de dispositivo o red junto con accion sensible.&lt;/li&gt;
&lt;li&gt;Multiples intentos similares en una ventana corta.&lt;/li&gt;
&lt;li&gt;Diferencia fuerte entre historial de la cuenta y comportamiento actual.&lt;/li&gt;
&lt;li&gt;Resultado de verificacion adicional, aunque sea simple.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Las senales que estorban suelen sonar sofisticadas pero ayudan poco:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scores opacos que nadie puede explicar.&lt;/li&gt;
&lt;li&gt;Flags heredados que nunca se limpiaron.&lt;/li&gt;
&lt;li&gt;Reglas copiadas entre productos distintos.&lt;/li&gt;
&lt;li&gt;Notas manuales sin formato comun.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google's 2024 Account Security guidance insiste en combinar verificaciones por riesgo con friccion proporcional en vez de aplicar el mismo castigo a todos los casos (&lt;a href="https://cloud.google.com/architecture/identity/" rel="noopener noreferrer"&gt;https://cloud.google.com/architecture/identity/&lt;/a&gt;). Esa idea evita dos dolores muy normales: bloquear demasiado y no saber defender la decision despues. En equipos chicos esto se nota aun mas, porque una mala regla se convierte rapido en trabajo manual repetido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Hay que bloquear siempre un correo temporal?
&lt;/h3&gt;

&lt;p&gt;No. Puede ser una senal valida, pero por si sola no alcanza. Conviene tratarla como contexto de riesgo y no como sentencia automatica.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Esto es un tema de producto o de operaciones?
&lt;/h3&gt;

&lt;p&gt;De ambos. Producto define la friccion aceptable; operaciones necesita que la regla sea explicable, medible y facil de revisar cuando algo sale mal.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Que haria primero si el flujo ya existe?
&lt;/h3&gt;

&lt;p&gt;Revisaria falsos positivos de la ultima semana, acortaria las razones visibles del bloqueo y separaria mejor los casos automaticos de los manuales. Es una mejora chica, pero suele ordenar bastante el sistema.&lt;/p&gt;

</description>
      <category>security</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes: drena nodos sin cegar alertas</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Tue, 01 Sep 2026 17:23:53 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-drena-nodos-sin-cegar-alertas-2kfm</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-drena-nodos-sin-cegar-alertas-2kfm</guid>
      <description>&lt;p&gt;Drenar nodos en Kubernetes parece una tarea rutinaria hasta que coincide con una ventana tensa, un autoscaler inquieto y una guardia que ya viene cansada. El comando es facil. Lo dificil es saber si, justo antes del cambio, tus alertas siguen diciendo la verdad. Cuando eso falla, el mantenimiento sale "bien" pero el equipo pierde visibilidad durante los minutos que más importan.&lt;/p&gt;

&lt;p&gt;Me ha tocado ver este patrón varias veces: el &lt;code&gt;kubectl drain&lt;/code&gt; termina, los pods vuelven, los dashboards se ponen verdes y aun así la guardia queda medio ciega. No porque Kubernetes falle, sino porque el cambio movió ownership, silenció una ruta de alertas o dejó un umbral mirando al nodo equivocado. Es un detalle chico, pero pega bastante en producción.&lt;/p&gt;

&lt;p&gt;La idea útil es tratar el drenado como un cambio de observabilidad, no solo de capacidad. El 2024 State of DevOps Report insiste en reducir fricción operativa y estandarizar respuestas para recuperar servicio más rápido (&lt;a href="https://cloud.google.com/devops/state-of-devops/" rel="noopener noreferrer"&gt;https://cloud.google.com/devops/state-of-devops/&lt;/a&gt;). En la practica, eso significa hacer una preflight corta y repetible antes de tocar el nodo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde se tuerce el drenado de nodos
&lt;/h2&gt;

&lt;p&gt;El problema más comun es asumir que si el scheduler recoloca pods, la telemetría también se recoloca sin fricción. A veces sí, a veces no. He visto reglas que seguían filtrando por &lt;code&gt;node_name&lt;/code&gt;, exporters que tardaban demasiado en volver y canales de alerta que dependían de labels efimeros. Cuando juntas eso con una ventana corta, aparece el clasico "todo parece sano, pero nadie confia del todo".&lt;/p&gt;

&lt;p&gt;Otro fallo muy humano es mezclar señal de mantenimiento con señal de incidente. Si no dejas claro qué alertas esperas ver degradadas y durante cuánto tiempo, cualquier pico menor se convierte en ruido. Es parecido a la idea de &lt;a href="https://dev.to/silviutech/react-feedback-de-email-sin-romper-el-foco-18i7-temp-slug-6950159?preview=23857a09c5e6d489f4559d22b0c799c330e564c118031e9967c09556c7319ad78d83c5aa93add5d376dd2d8282a8f541590973895b74ecc3f436ac29"&gt;mantener feedback visible sin romper el foco&lt;/a&gt;: la gente necesita contexto estable para actuar bien, no solo mensajes que cambian de sitio.&lt;/p&gt;

&lt;p&gt;También conviene desconfiar de la documentación escrita con prisa. En un runbook viejo llegué a encontrar referencias como temp org mail usadas como texto de prueba, y eso no rompía nada por sí solo. Lo que sí rompe es copiar esa misma ligereza a procesos de SRE donde una alerta sin dueño o sin ventana clara te hace perder minutos buenos.&lt;/p&gt;

&lt;h2&gt;
  
  
  La preflight que si ayuda en guardia
&lt;/h2&gt;

&lt;p&gt;Mi versión favorita cabe en cinco preguntas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;¿Qué workloads saldrán del nodo y cuáles tienen &lt;code&gt;PodDisruptionBudget&lt;/code&gt; ajustado?&lt;/li&gt;
&lt;li&gt;¿Qué alertas dependen de métricas o labels a nivel de nodo?&lt;/li&gt;
&lt;li&gt;¿Qué degradación temporal es esperable y cuánto debe durar?&lt;/li&gt;
&lt;li&gt;¿Quién confirma que el servicio volvió sano desde fuera del cluster?&lt;/li&gt;
&lt;li&gt;¿Qué condición exacta obliga a abortar o pausar?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si estas respuestas no están listas antes del cambio, el drenado ya empezó flojo. No hace falta un documento enorme. Basta con una tabla o bloque corto en el runbook con servicio, nodo, riesgo principal y verificación externa. En equipos que operan varios clusters, esta mini disciplina evita bastantes confusiones, aunque suene poco glamorosa.&lt;/p&gt;

&lt;p&gt;Yo suelo añadir una comprobación más: mirar si la ruta de alerta post-cambio sigue teniendo sentido para el on-call real. Si el nodo pertenece a un pool nuevo, o si cambió el reparto de tenants, puede que la notificación llegue al canal correcto pero con prioridad equivocada. Y ahí arranca el triage raro, ese que nadie pidió.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un flujo simple para validar alertas antes del cambio
&lt;/h2&gt;

&lt;p&gt;Un flujo pequeño suele bastar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Marca el nodo candidato y anota un &lt;code&gt;change_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lista pods críticos, PDBs y afinidades activas.&lt;/li&gt;
&lt;li&gt;Simula qué alertas podrían moverse o quedar brevemente mudas.&lt;/li&gt;
&lt;li&gt;Ejecuta el drenado en ventana acotada.&lt;/li&gt;
&lt;li&gt;Confirma salud desde una fuente ajena al nodo drenado.&lt;/li&gt;
&lt;li&gt;Revisa que las alertas sigan describiendo bien el estado real.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando un equipo ya trabaja con señales de producto y operación mejor ordenadas, le resulta más facil &lt;a href="https://dev.to/hannahdev56/saas-reactivacion-con-senales-de-producto-2731"&gt;reactivar flujos con senales de producto claras&lt;/a&gt; y también separar un mantenimiento esperado de un incidente real. La lógica es la misma: menos ambigüedad, menos decisiones apuradas.&lt;/p&gt;

&lt;p&gt;Si quieres algo muy concreto, esta es la parte que no me salto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pdb &lt;span class="nt"&gt;-A&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;--field-selector&lt;/span&gt; spec.nodeName&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;node&amp;gt;
kubectl drain &amp;lt;node&amp;gt; &lt;span class="nt"&gt;--ignore-daemonsets&lt;/span&gt; &lt;span class="nt"&gt;--delete-emptydir-data&lt;/span&gt;
kubectl uncordon &amp;lt;node&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El comando no tiene misterio. Lo importante es el criterio de salida. Para mí, el cambio no termina cuando el nodo queda drenado, sino cuando las alertas, los checks externos y el servicio cuentan la misma historia. Si uno de esos tres queda fuera de fase, mejor quedarse cinco minutos más y revisar. Suena lento, pero luego ahorra bastante desgaste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist corto para el siguiente mantenimiento
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;El runbook explica qué alertas pueden degradarse temporalmente.&lt;/li&gt;
&lt;li&gt;Hay una verificación externa al nodo antes y después del drenado.&lt;/li&gt;
&lt;li&gt;Los &lt;code&gt;PodDisruptionBudget&lt;/code&gt; fueron revisados ese mismo día.&lt;/li&gt;
&lt;li&gt;El canal de guardia y la severidad siguen alineados con el riesgo.&lt;/li&gt;
&lt;li&gt;Existe un criterio escrito para pausar o revertir.&lt;/li&gt;
&lt;li&gt;Alguien confirma que observabilidad y servicio volvieron a coincidir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Esto aplica solo a clusters grandes?
&lt;/h3&gt;

&lt;p&gt;No. En clusters pequeños duele igual, a veces más, porque un solo nodo concentra demasiadas piezas y cualquier silencio de alertas se nota enseguida.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hace falta automatizar todo?
&lt;/h3&gt;

&lt;p&gt;No del todo. Una preflight manual pero consistente ya mejora mucho el resultado. Luego, si ves patrones repetidos, automatizas lo que valga la pena. Ir de menos a más suele salir mejor.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>SRE: prueba rotacion de secretos por correo</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Sun, 30 Aug 2026 20:24:07 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/sre-prueba-rotacion-de-secretos-por-correo-19f2</link>
      <guid>https://dev.to/alexcarteruk/sre-prueba-rotacion-de-secretos-por-correo-19f2</guid>
      <description>&lt;p&gt;Rotar secretos suele verse como una tarea cerrada cuando el despliegue termina y las apps vuelven a responder 200. En produccion, yo no lo doy por resuelto hasta comprobar algo mas aburrido pero muy real: que los correos operativos siguen llegando con el contexto correcto. He visto incidentes donde la credencial nueva funcionaba, pero el worker de notificaciones quedaba apuntando a un host viejo o a una cola que ya no tenia permisos. El sistema parecia sano... hasta que hizo falta una alerta.&lt;/p&gt;

&lt;p&gt;Por eso trato la rotacion como un cambio de seguridad y tambien como una prueba de observabilidad. Si el correo de fallo o de aviso no sale bien, el equipo pierde minutos justo cuando deberia ir mas rapido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que suele romperse tras rotar secretos
&lt;/h2&gt;

&lt;p&gt;Los fallos comunes no son muy exoticos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;variables actualizadas en la app, pero no en el worker que envia correos&lt;/li&gt;
&lt;li&gt;permisos nuevos validos para lectura, pero no para publicar eventos&lt;/li&gt;
&lt;li&gt;plantillas que siguen usando enlaces de un entorno anterior&lt;/li&gt;
&lt;li&gt;reintentos silenciosos que mandan dos mensajes y confunden al on-call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lo delicado es que muchos de estos errores no aparecen en el dashboard principal. El deploy queda verde, el readiness probe responde y nadie mira el camino completo del aviso hasta que hay una incidencia de verdad. En ese momento ya vas tarde.&lt;/p&gt;

&lt;p&gt;Tambien conviene pensar en como se rastrea la prueba despues. En algunas notas internas la gente busca cosas como &lt;code&gt;fake e mail com&lt;/code&gt; porque recuerdan el intento, no la herramienta exacta. Parece menor, pero sirve para documentar mejor y encontrar evidencia mas rapido.&lt;/p&gt;

&lt;h2&gt;
  
  
  El contrato minimo del correo operativo
&lt;/h2&gt;

&lt;p&gt;Cuando reviso un correo despues de rotar secretos, espero ver cinco cosas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Que servicio o job genero el evento.&lt;/li&gt;
&lt;li&gt;Que entorno, region o namespace estuvo implicado.&lt;/li&gt;
&lt;li&gt;Que timestamp corresponde a la corrida.&lt;/li&gt;
&lt;li&gt;Cual fue el sintoma inicial, en una frase corta.&lt;/li&gt;
&lt;li&gt;Que enlace o siguiente paso debe abrir primero la persona de guardia.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si ese contrato no esta claro, el correo pasa de ayuda a estorbo. Me gusta mucho la idea de &lt;a href="https://dev.to/hannahdev56/saas-metricas-de-activacion-por-email-112j"&gt;medir eventos de email con menos ruido&lt;/a&gt;, porque separa la recepcion del mensaje de la interpretacion humana. Y para equipos que todavia no tienen una rutina estable, &lt;a href="https://dev.to/hannahdev56/como-revisar-emails-de-activacion-en-saas-1kjf"&gt;revisar correos de activacion con una rutina simple&lt;/a&gt; deja una leccion util: una inbox por corrida evita muchas conclusiones equivocadas.&lt;/p&gt;

&lt;p&gt;Si necesito una bandeja efimera para validar el flujo end-to-end, a veces uso &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;tempmailso&lt;/a&gt; para no mezclar mensajes viejos con la prueba nueva. El valor no esta solo en el servicio, sino en mantener la evidencia aislada por corrida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un flujo de prueba que uso antes de cerrar el cambio
&lt;/h2&gt;

&lt;p&gt;No hago una simulacion gigante. Prefiero una prueba corta, repetible y facil de leer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;RUN_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +%Y%m%dT%H%M%SZ&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;RECIPIENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"secret-rotate-&lt;/span&gt;&lt;span class="nv"&gt;$RUN_ID&lt;/span&gt;&lt;span class="s2"&gt;@example.test"&lt;/span&gt;

emit_security_notice &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--service&lt;/span&gt; &lt;span class="s2"&gt;"billing-api"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; &lt;span class="s2"&gt;"prod-apac-1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--event&lt;/span&gt; &lt;span class="s2"&gt;"secret-rotation"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--status&lt;/span&gt; &lt;span class="s2"&gt;"post-check"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--recipient&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECIPIENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

wait_for_message &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECIPIENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 120
assert_message_count &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECIPIENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 1
assert_subject_contains &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECIPIENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"secret-rotation"&lt;/span&gt;
assert_body_contains &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECIPIENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"prod-apac-1"&lt;/span&gt;
assert_link_host &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECIPIENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"runbooks.example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La meta no es demostrar que el mundo es perfecto. La meta es responder rapido a tres preguntas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;llego un solo mensaje o hubo duplicados&lt;/li&gt;
&lt;li&gt;el mensaje pertenece a esta corrida y no a una anterior&lt;/li&gt;
&lt;li&gt;el enlace principal lleva al lugar correcto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con eso ya puedes separar varias causas. Si no llega nada, miras permisos, cola o proveedor. Si llega dos veces, revisas reintentos o eventos duplicados. Si el asunto esta bien pero el link apunta a staging, el problema casi seguro vive en plantilla o configuracion. Parece simple, pero ese orden ahorra tiempo y evita la investigacion medio caotica que aparece a las 3 AM.&lt;/p&gt;

&lt;p&gt;Tambien me gusta guardar una pequeña evidencia del chequeo: &lt;code&gt;run_id&lt;/code&gt;, entorno, destinatario, latencia de entrega y host del enlace principal. No hace falta una novela. Hace falta algo que otra persona pueda leer despues sin adivinar demasiado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist corta para guardias reales
&lt;/h2&gt;

&lt;p&gt;Antes de cerrar la rotacion, paso por esta lista:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;el correo pertenece a la corrida actual&lt;/li&gt;
&lt;li&gt;hay exactamente un mensaje por evento esperado&lt;/li&gt;
&lt;li&gt;asunto y cuerpo nombran servicio y entorno&lt;/li&gt;
&lt;li&gt;el primer sintoma se entiende sin abrir cinco tabs&lt;/li&gt;
&lt;li&gt;el enlace principal apunta al runbook o panel correcto&lt;/li&gt;
&lt;li&gt;la marca de tiempo coincide con el formato del equipo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No es una checklist glamourosa, pero si evita sustos bastante caros. Muchas veces la mejora mas grande en SRE no viene de una herramienta nueva, sino de dejar una verificacion decente donde antes habia fe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hace falta correr esto en cada rotacion?
&lt;/h3&gt;

&lt;p&gt;Si la rotacion toca credenciales, colas, webhooks o cualquier pieza del camino de notificaciones, yo diria que si. Cuando solo cambias documentacion o naming interno, puede bastar una prueba programada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conviene validar el HTML completo del email?
&lt;/h3&gt;

&lt;p&gt;Normalmente no. Prefiero validar contenido operativo: asunto, contexto, enlace principal y unicidad del mensaje. El resto lo reviso aparte para no volver fragil la prueba.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cual es la señal mas util?
&lt;/h3&gt;

&lt;p&gt;Para mi, la mejor señal es que una persona medio dormida pueda leer el correo y saber que hacer primero. Si eso falla, el cambio todavia no esta realmente terminado.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>security</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes: prueba alertas tras cambios de red</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Sun, 30 Aug 2026 17:24:00 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-prueba-alertas-tras-cambios-de-red-flo</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-prueba-alertas-tras-cambios-de-red-flo</guid>
      <description>&lt;p&gt;Los cambios de red en Kubernetes suelen romper alertas en silencio. Esta comprobacion corta valida egress, DNS y entrega antes de dar un cambio por cerrado.&lt;/p&gt;

&lt;p&gt;He aprendido a desconfiar un poco de los cambios de red "pequenos" en Kubernetes. Una regla de egress, un ajuste en &lt;code&gt;NetworkPolicy&lt;/code&gt; o una salida por NAT puede parecer trivial durante la ventana de cambio, pero a veces el problema aparece veinte minutos despues, cuando Alertmanager intenta enviar un correo y nadie lo recibe. En ese punto ya no estas verificando red; estas perdiendo visibilidad operacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que un cambio de red rompe alertas sin avisar
&lt;/h2&gt;

&lt;p&gt;La mayoria de estos fallos no tumban el servicio principal. La app sigue respondiendo, los probes pasan y el despliegue parece estable. El daño real cae sobre las rutas secundarias: SMTP, webhooks, DNS saliente o resolucion hacia un relay corporativo. Ese patron pasa mucho mas de lo que la gente admite, y por eso una prueba de humo especifica merece su propio paso.&lt;/p&gt;

&lt;p&gt;Kubernetes explica que las &lt;code&gt;NetworkPolicy&lt;/code&gt; solo afectan al trafico que coincida con los pods seleccionados, lo cual hace facil dejar una dependencia fuera de la cabeza durante un cambio: &lt;a href="https://kubernetes.io/docs/concepts/services-networking/network-policies/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/concepts/services-networking/network-policies/&lt;/a&gt;. El resultado tipico es feo pero silencioso: los paneles siguen verdes y, sin embargo, el canal de alerta queda roto. Es un fallo muy incomodo, porqe la primera señal real puede ser una incidencia ya avanzada.&lt;/p&gt;

&lt;p&gt;Mi regla es simple: si el cambio toca salida a internet, DNS interno, firewall de nodo o politicas entre namespaces, cierro el cambio solo despues de probar el camino de las alertas.&lt;/p&gt;

&lt;h2&gt;
  
  
  La comprobacion corta que hago despues del cambio
&lt;/h2&gt;

&lt;p&gt;No hago una prueba teatral ni larga. Hago una secuencia corta, casi siempre en menos de diez minutos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmo que el pod de Alertmanager o del servicio emisor sigue resolviendo el host SMTP correcto.&lt;/li&gt;
&lt;li&gt;Verifico conectividad al puerto esperado desde el namespace afectado.&lt;/li&gt;
&lt;li&gt;Lanzo una alerta controlada o un evento de prueba con un identificador facil de buscar.&lt;/li&gt;
&lt;li&gt;Reviso logs del emisor y del relay para asegurar que hubo aceptacion, no solo intento.&lt;/li&gt;
&lt;li&gt;Confirmo recepcion en un inbox de prueba aislado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ese ultimo punto evita varias discusiones raras en equipos grandes. Si usas un destino compartido, alguien borra el mensaje, otro responde tarde, o una regla de filtrado te confunde. Un inbox de prueba aislado mantiene la validacion limpia. Incluso lo he usado para revisar plantillas de notificacion que terminaban en un email temporal para Facebook durante una integracion heredada medio extraña; no era elegante, pero sirvio para detectar que el asunto habia quedado truncado.&lt;/p&gt;

&lt;p&gt;Cuando necesito pensar el flujo como sistema y no solo como "manda correo o no", me ayuda recordar este enfoque de &lt;a href="https://dev.to/silviutech/llms-inbox-por-etapa-en-flujos-con-agentes-48o1"&gt;inbox por etapa en flujos con agentes&lt;/a&gt;. La idea de validar cada etapa por separado tambien aplica muy bien a operaciones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que revisar cuando Alertmanager parece sano pero no entrega
&lt;/h2&gt;

&lt;p&gt;Aqui es donde conviene ser aburridamente metódico.&lt;/p&gt;

&lt;p&gt;Primero, DNS. Muchos equipos prueban &lt;code&gt;curl&lt;/code&gt; a una API y dan el cambio por bueno, pero el relay SMTP va por otro nombre, otra ruta o incluso otro proxy. Si el pod no resuelve igual que antes, ya tienes media averia armada.&lt;/p&gt;

&lt;p&gt;Segundo, tiempos de espera. Segun la documentacion de Prometheus para configuracion de Alertmanager, un error de red o autenticacion en el receptor puede no ser evidente a primera vista si solo miras el estado general del proceso: &lt;a href="https://prometheus.io/docs/alerting/latest/configuration/" rel="noopener noreferrer"&gt;https://prometheus.io/docs/alerting/latest/configuration/&lt;/a&gt;. A veces el servicio esta "up", pero el receptor devuelve errores intermitentes, o reintenta mas de la cuenta y ensucia la lectura del incidente.&lt;/p&gt;

&lt;p&gt;Tercero, evidencias. Yo guardo tres cosas en el ticket del cambio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El comando o alerta de prueba que dispare.&lt;/li&gt;
&lt;li&gt;La hora exacta y el identificador de correlacion.&lt;/li&gt;
&lt;li&gt;Una captura de los logs donde se vea entrega o rechazo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suena basico, pero ahorra bastante tiempo cuando alguien pregunta si el cambio rompio algo horas despues. El mismo principio aparece en este post sobre &lt;a href="https://dev.to/hannahdev56/como-auditar-emails-de-upgrade-en-saas-8h0"&gt;auditar emails de upgrade&lt;/a&gt;: sin una evidencia pequeña y clara, la conversacion deriva rapido en opiniones.&lt;/p&gt;

&lt;p&gt;Tambien reviso si algun operador ha metido destinos de prueba improvisados como &lt;code&gt;tamp mail com&lt;/code&gt; en scripts viejos o variables de entorno. No deberia pasar, pero pasa. Y cuando aparece, la investigacion se vuelve mas lenta de lo que deveria.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un ejemplo pequeno para probar el flujo
&lt;/h2&gt;

&lt;p&gt;Este ejemplo no sustituye una prueba real, pero deja listo un chequeo rapido desde el cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; monitoring &lt;span class="nb"&gt;exec &lt;/span&gt;deploy/alertmanager &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  sh &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'getent hosts smtp.internal.example &amp;amp;&amp;amp; nc -vz smtp.internal.example 587'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si eso responde bien, suelo disparar una alerta de prueba o fuerzo un evento controlado desde el sistema que envia la notificacion. Lo importante es que el mensaje lleve un asunto o etiqueta que puedas rastrear sin dudas. En cambios delicados, prefiero anotar el &lt;code&gt;change_id&lt;/code&gt; dentro del texto y revisar recepcion completa, no solo handshake de red.&lt;/p&gt;

&lt;p&gt;AWS tambien insiste en que la observabilidad y la validacion posterior al cambio forman parte de una operacion sana, no de un lujo opcional, dentro de sus practicas recomendadas para EKS: &lt;a href="https://aws.github.io/aws-eks-best-practices/" rel="noopener noreferrer"&gt;https://aws.github.io/aws-eks-best-practices/&lt;/a&gt;. Estoy bastante de acuerdo. El error no suele estar en no saber Kubernetes; suele estar en asumir que un cambio de red ya quedo validado porque el deployment no se cayo.&lt;/p&gt;

&lt;p&gt;He visto equipos cerrar cambios con demasiada prisa porque "el dashboard sigue verde". Luego llega una alerta real y descubren que el canal de correo estaba roto desde hace media hora. Ese tipo de fallo no es dramatico en el momento, pero te roba confianza en el proceso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas rapidas antes de cerrar el cambio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Basta con probar conectividad al relay?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Eso confirma una parte. Todavia falta validar autenticacion, aceptacion del mensaje y recepcion final.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Hace falta hacerlo en cada cambio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Si el cambio puede tocar rutas de salida, DNS, firewall o politicas entre pods, yo diria que si. No siempre tarda mucho, y evita sustos tontos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Debo usar siempre el mismo inbox de prueba?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Solo si esta bien aislado y con contexto claro. Si varios jobs o equipos lo comparten, la señal se degrada bastante rapido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Que quiero ver para cerrar tranquilo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Resolucion correcta, conexion al destino, evento emitido, logs consistentes y recepcion confirmada. Si falta uno de esos pasos, para mi el cambio aun no esta del todo cerrado.&lt;/p&gt;

&lt;p&gt;Las alertas por correo no son la parte mas glamourosa de Kubernetes, pero cuando fallan te dejan operando medio a ciegas. Por eso prefiero tratar esa validacion como parte del cambio y no como un detalle de despues. Es un paso corto, un poco aburrido, y funciona.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
