<?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>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>
    <item>
      <title>SRE: runbooks cortos para incidentes de email</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Sun, 30 Aug 2026 08:23:38 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/sre-runbooks-cortos-para-incidentes-de-email-1pd7</link>
      <guid>https://dev.to/alexcarteruk/sre-runbooks-cortos-para-incidentes-de-email-1pd7</guid>
      <description>&lt;h1&gt;
  
  
  SRE: runbooks cortos para incidentes de email
&lt;/h1&gt;

&lt;p&gt;Cuando un flujo de email falla en produccion, el problema rara vez es "solo correo". Lo que se rompe de verdad es una cadena: evento, cola, proveedor SMTP, plantilla, tracking y a veces una dependencia externa que nadie miro en el standup. En varios equipos he visto el mismo patron: demasiada informacion suelta y muy poca secuencia operativa. Un runbook corto suele ganar frente a una wiki enorme que nadie abre durante el incidente.&lt;/p&gt;

&lt;p&gt;Si trabajas en SRE o Cloud, este tipo de runbook te ahorra minutos que luego parecen horas. Tambien deja evidencia util para la retro. Y si tu producto usa buzones de prueba o un correo desechable en entornos no productivos, conviene separar ese contexto desde el inicio para no mezclar sintomas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que un runbook corto cambia la respuesta
&lt;/h2&gt;

&lt;p&gt;En incidentes de entrega, el primer error comun es empezar por el dashboard favorito del turno. El segundo es saltar a logs sin definir la pregunta. Yo prefiero un runbook de una pagina con checks ordenados por probabilidad y costo de validacion.&lt;/p&gt;

&lt;p&gt;No hace falta que sea sofisticado. De hecho, cuanto mas elegante lo haces, menos usable queda a las 3 AM. Un runbook util responde tres cosas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Que ve el usuario.&lt;/li&gt;
&lt;li&gt;Que sistema pudo romperse.&lt;/li&gt;
&lt;li&gt;Que prueba reduce incertidumbre mas rapido.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ese tercer punto es el que suele faltar, y ahi se pierde muchisimo tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  La senal minima que siempre reviso primero
&lt;/h2&gt;

&lt;p&gt;Antes de abrir trazas detalladas, reviso una vista minima con cuatro datos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tasa de aceptacion del proveedor&lt;/li&gt;
&lt;li&gt;tiempo entre evento y enqueue&lt;/li&gt;
&lt;li&gt;tiempo entre enqueue y send attempt&lt;/li&gt;
&lt;li&gt;porcentaje de rebotes o rechazos por ventana corta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si no tienes esa vista, construyela. No necesitas una plataforma nueva; con logs estructurados y un panel simple ya puedes detectar si el cuello esta en tu app, en la cola o en el proveedor. Segun &lt;a href="https://sre.google/workbook/" rel="noopener noreferrer"&gt;Google SRE Workbook&lt;/a&gt;, los equipos responden mejor cuando las alertas llevan contexto accionable en vez de solo volumen bruto. No es una idea nueva, pero sigue siendo donde mas se nota la diferencia.&lt;/p&gt;

&lt;p&gt;Tambien intento responder una pregunta bien aburrida pero muy potente: "fallan todos los emails o solo un tipo?" Password reset, onboarding y magic links no tienen el mismo impacto ni el mismo camino interno. Suena obvio, pero en incidentes reales eso a veces se descubre tarde.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un runbook de 15 minutos para fallos de entrega
&lt;/h2&gt;

&lt;p&gt;Este es el esquema que mas me funciona cuando el equipo necesita bajar ruido rapido:&lt;/p&gt;

&lt;h3&gt;
  
  
  Minuto 0 a 3: confirmar alcance
&lt;/h3&gt;

&lt;p&gt;Busca tres ejemplos concretos con timestamp, tenant o user id y tipo de email. Evita frases vagas como "no sale nada". Si puedes, compara con un envio sano de la misma hora. Parece basico, pero evita una investigacion medio rota desde el arranque.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minuto 3 a 6: aislar la etapa rota
&lt;/h3&gt;

&lt;p&gt;Comprueba:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;el evento de negocio existe&lt;/li&gt;
&lt;li&gt;la cola recibio el mensaje&lt;/li&gt;
&lt;li&gt;hubo intento de envio&lt;/li&gt;
&lt;li&gt;el proveedor devolvio accepted, deferred o rejected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si el evento no existe, no estas ante un problema de email. Si la cola crece, mira consumidores. Si hay accepted pero no entrega final, entra soporte del proveedor o revisa reputacion/dominio. Es una ruta simple, pero evita discusiones largas y algo inutiles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minuto 6 a 10: revisar cambios cercanos
&lt;/h3&gt;

&lt;p&gt;Los cambios que mas rompen estos flujos no siempre son "grandes deploys". Muchas veces son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rotacion de secretos&lt;/li&gt;
&lt;li&gt;cambio de plantilla con variable faltante&lt;/li&gt;
&lt;li&gt;regla nueva de rate limit&lt;/li&gt;
&lt;li&gt;ajuste DNS o proveedor secundario&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por eso me gusta enlazar en el runbook referencias a trabajos previos como &lt;a href="https://dev.to/alexcarteruk/como-validar-correos-tras-un-rollback-en-terraform-3jdg"&gt;validar correos despues de cambios de infraestructura&lt;/a&gt;. No para leer un ensayo completo en plena guardia, sino para recordar patrones de falla que ya vimos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minuto 10 a 15: dejar recibos
&lt;/h3&gt;

&lt;p&gt;Si ya sabes el punto roto, deja evidencia antes de correr a arreglarlo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;query usada&lt;/li&gt;
&lt;li&gt;ids de ejemplo&lt;/li&gt;
&lt;li&gt;metrica que empezo a caer&lt;/li&gt;
&lt;li&gt;hipotesis descartadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese recibo vale oro para la retro y para el siguiente turno. Tambien evita el clasico "yo pense que ya estaba claro".&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde entra el correo desechable sin romper el enfoque
&lt;/h2&gt;

&lt;p&gt;En bastantes equipos, el incidente se mezcla con pruebas internas hechas con inboxes temporales. No es malo usar esos buzones; al contrario, pueden servir para verificar rapidez de entrega y contenido. El error aparece cuando el equipo no distingue pruebas controladas, QA y trafico real.&lt;/p&gt;

&lt;p&gt;Mi recomendacion es sencilla:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;etiqueta el origen del email de prueba&lt;/li&gt;
&lt;li&gt;separa metrica de staging y produccion&lt;/li&gt;
&lt;li&gt;guarda run ids para correlacion&lt;/li&gt;
&lt;li&gt;no uses un caso de tempail como prueba unica del incidente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si haces testing de signup o onboarding, una referencia como &lt;a href="https://dev.to/silviutech/react-signup-accesible-para-pruebas-reales-4ijd"&gt;pruebas reales de signup&lt;/a&gt; ayuda a alinear producto y operacion. Los equipos de frontend suelen detectar antes los sintomas de experiencia, mientras SRE mira el pipeline de entrega. Juntarlo temprano va mejor, incluso si al principio paresca que hablan idiomas distintos.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Conviene abrir incidencia con el proveedor de inmediato?
&lt;/h2&gt;

&lt;p&gt;Solo si ya confirmaste que tu evento, tu cola y tu intento de envio estan sanos. Abrir ticket demasiado pronto mete espera sin reducir incertidumbre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuantas metricas debe tener este runbook?
&lt;/h2&gt;

&lt;p&gt;Pocas. Las suficientes para aislar etapa y severidad. Si el panel tiene veinte graficas, en la practica nadie sabe por donde empezar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vale la pena probar con muestras manuales?
&lt;/h2&gt;

&lt;p&gt;Si, pero con disciplina. Una muestra manual sirve para confirmar comportamiento, no para reemplazar observabilidad. El runbook debe seguir siendo la fuente principal, aunque el equipo este cansado o con prisas.&lt;/p&gt;

&lt;p&gt;Al final, un buen runbook de email no presume complejidad. Hace algo mas valioso: vuelve repetible una investigacion que antes dependia demasiado de quien estaba de guardia ese dia.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
      <category>email</category>
    </item>
    <item>
      <title>Kubernetes: 401 fugaces en CronJobs</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Thu, 27 Aug 2026 23:24:20 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-401-fugaces-en-cronjobs-1m99</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-401-fugaces-en-cronjobs-1m99</guid>
      <description>&lt;p&gt;Hay fallos que se ven dramaticos en Slack y luego desaparecen antes de que abras el dashboard. Los &lt;code&gt;401&lt;/code&gt; intermitentes en un CronJob entran justo en esa categoria. El job corre bien casi toda la semana, pero a las 3:00 o 4:00 AM falla una vez, reintenta, y despues todo queda verde. En guardia esto confunde bastante, porque parece un problema de red cuando muchas veces es autenticacion, reloj o contexto de ejecucion.&lt;/p&gt;

&lt;p&gt;Cuando me toca revisar algo asi, intento no empezar por el proveedor externo. Primero reviso el contrato basico del job: identidad, token, tiempo y configuracion efectiva. Ese runbook pequeno evita dar vueltas medio tontas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que un 401 aparece solo de madrugada
&lt;/h2&gt;

&lt;p&gt;El patron mas comun no es "la API amanecio rota". Suelo ver una de estas causas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El pod toma un token distinto al esperado o uno ya casi vencido.&lt;/li&gt;
&lt;li&gt;El job arranca con variables viejas despues de una rotacion de secretos.&lt;/li&gt;
&lt;li&gt;Hay skew de reloj entre nodo, workload y servicio remoto.&lt;/li&gt;
&lt;li&gt;El endpoint remoto aplica ventanas de validacion mas estrictas en ciertos flujos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En Kubernetes, varios detalles de CronJob ya invitan a mirar tiempo y scheduling. La documentacion oficial recuerda que el controlador de CronJob revisa el schedule cada 10 segundos, asi que ventanas muy chicas pueden producir comportamientos sorprendentes en la ejecucion programada: &lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#job-creation" rel="noopener noreferrer"&gt;CronJob limitations&lt;/a&gt;. No explica un &lt;code&gt;401&lt;/code&gt; por si solo, claro, pero si te obliga a revisar el momento exacto en que el job nacio y con que contexto salio.&lt;/p&gt;

&lt;h2&gt;
  
  
  El runbook corto que uso primero
&lt;/h2&gt;

&lt;p&gt;Si estoy ayudando a otra persona de guardia, le pido estos cuatro datos antes de discutir teorias:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;kubectl describe job &amp;lt;job&amp;gt;&lt;/code&gt; y &lt;code&gt;kubectl describe pod &amp;lt;pod&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;logs del intento fallido y del siguiente intento exitoso&lt;/li&gt;
&lt;li&gt;manifiesto real del CronJob con &lt;code&gt;env&lt;/code&gt;, &lt;code&gt;serviceAccountName&lt;/code&gt; y volumenes proyectados&lt;/li&gt;
&lt;li&gt;hora UTC del &lt;code&gt;401&lt;/code&gt; y hora UTC del ultimo cambio de secreto o despliegue&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Con eso ya puedes armar un diff util. El error no siempre esta en el mensaje HTTP; a veces esta en el contexto que cambió cinco minutos antes y nadie lo relacionó. Tener un par de &lt;a href="https://dev.to/silviutech/llms-con-runbooks-de-email-que-si-escalan-5cje"&gt;runbooks pequenos que si escalan&lt;/a&gt; ayuda mucho porque fuerza a capturar evidencia y no intuiciones.&lt;/p&gt;

&lt;p&gt;Este checklist minimo tambien me gusta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmar si el &lt;code&gt;401&lt;/code&gt; ocurre antes o despues del primer retry.&lt;/li&gt;
&lt;li&gt;Ver si el pod usa &lt;code&gt;serviceAccountName&lt;/code&gt; correcto.&lt;/li&gt;
&lt;li&gt;Revisar expiracion de token, no solo presencia de token.&lt;/li&gt;
&lt;li&gt;Comparar headers o claims entre intento bueno y malo.&lt;/li&gt;
&lt;li&gt;Mirar si el secreto montado cambió pero el cliente conserva cache interna.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Parece obvio, pero en incidentes reales la mitad del tiempo se pierde porque alguien valida solo que "la variable existe". Y existir no alcanza; tiene que ser la credencial correcta, fresca y legible por el proceso. Es una diferencia chica, pero importantisima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde suele estar la causa real
&lt;/h2&gt;

&lt;p&gt;En clusters modernos, yo revisaria muy pronto los tokens proyectados de ServiceAccount. Kubernetes explica que estos tokens tienen expiracion y se rotan automaticamente, lo que mejora seguridad pero tambien deja expuestos a clientes que leen el token una vez y nunca lo refrescan: &lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#serviceaccount-token-volume-projection" rel="noopener noreferrer"&gt;ServiceAccount token projection&lt;/a&gt;. Si tu binario cachea el token al inicio y el job vive mas de lo previsto, ya tienes una pista bastante fuerte.&lt;/p&gt;

&lt;p&gt;La segunda causa repetida es una rotacion de secretos mal sincronizada. El secreto nuevo existe, el workload nuevo aun no corre, y el CronJob dispara justo en esa franja rara. El &lt;code&gt;401&lt;/code&gt; aparece una sola vez, luego el siguiente pod arranca con la version correcta y parece "magia". No lo es, solo fue timing feo.&lt;/p&gt;

&lt;p&gt;Tambien miraria endpoints que firman peticiones con timestamp. Cuando el nodo o la imagen base trae hora desalineada, el servicio remoto rechaza la firma aunque la llave sea buena. No es lo mas comun, pero cuando pasa se siente bastante injusto, la verda.&lt;/p&gt;

&lt;p&gt;Un detalle mas: si el job toca sistemas de prueba, vas a encontrar rastros raros en payloads y notas operativas, cosas como &lt;code&gt;temp mailid&lt;/code&gt; o &lt;code&gt;dummy e mail&lt;/code&gt; pegadas en fixtures o variables locales. No son la causa del &lt;code&gt;401&lt;/code&gt;, pero sirven como señal de que el flujo mezcla trafico de QA con operacion real y eso enturbia el analisis.&lt;/p&gt;

&lt;p&gt;En esa parte me ayuda pensar en &lt;a href="https://dev.to/silviutech/llms-contratos-de-herramientas-que-se-auditan-1jc"&gt;contratos operativos faciles de auditar&lt;/a&gt;: que credencial espero, donde se monta, cuanto dura, que claim valida el remoto y que evidencia dejo si falla. Cuando ese contrato no existe, el incidente se alarga por puro desorden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que dejar automatizado para la siguiente guardia
&lt;/h2&gt;

&lt;p&gt;Si ya encontraste la causa, no cierres el caso sin dejar una mejora chica. Mis favoritas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Loggear &lt;code&gt;issuer&lt;/code&gt;, &lt;code&gt;audience&lt;/code&gt; y expiracion del token sin imprimir secretos.&lt;/li&gt;
&lt;li&gt;Emitir una metrica por causa de &lt;code&gt;401&lt;/code&gt; clasificada en cliente, credencial o remoto.&lt;/li&gt;
&lt;li&gt;Guardar hash de version de secreto o config usada por cada job.&lt;/li&gt;
&lt;li&gt;Fallar rapido cuando falte &lt;code&gt;serviceAccountName&lt;/code&gt; esperado.&lt;/li&gt;
&lt;li&gt;Añadir una prueba que levante el job con credenciales rotadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No hace falta un sistema enorme. Con dos o tres señales bien elegidas, el siguiente incidente cae mucho mas rapido. Y eso para SRE vale oro, sobre todo en turnos donde el cerebro aun no desperto del todo.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Conviene reintentar automaticamente un 401?
&lt;/h3&gt;

&lt;p&gt;Solo si sabes distinguir entre credencial vencida y permiso realmente denegado. Reintentar a ciegas puede esconder el problema y llenar de ruido los logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Que comparo entre un intento bueno y uno malo?
&lt;/h3&gt;

&lt;p&gt;Hora de inicio, service account, claims del token, version del secreto y destino exacto. Si comparas solo el body del error, casi nunca alcanza.&lt;/p&gt;

&lt;h3&gt;
  
  
  Esto pasa solo en jobs largos?
&lt;/h3&gt;

&lt;p&gt;No. Tambien aparece en jobs cortos que arrancan durante una ventana de cambio de secretos, de rollout o de permisos. A veces dura segundos, pero rompe igual.&lt;/p&gt;

&lt;p&gt;Si un CronJob tuyo falla con &lt;code&gt;401&lt;/code&gt; solo de madrugada, yo no empezaria por culpar a la API externa. Empezaria por identidad, tiempo y evidencia del pod. Casi siempre ahi esta el hilo del que tirar, aunque al principio se vea pequeñito.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes: depura 401 intermitentes con contexto</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Wed, 26 Aug 2026 05:25:02 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-depura-401-intermitentes-con-contexto-1c4k</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-depura-401-intermitentes-con-contexto-1c4k</guid>
      <description>&lt;p&gt;Los &lt;code&gt;401&lt;/code&gt; intermitentes en Kubernetes son de esas alertas que desgastan mas de lo que parecen. Un pod responde bien durante media hora, luego falla dos minutos, despues vuelve a la vida, y la tentacion es reiniciar primero y pensar despues. El problema es que ese reinicio muchas veces borra la pista util.&lt;/p&gt;

&lt;p&gt;En guardias SRE me funciona tratar este fallo como un rompecabezas pequeno: credencial, reloj, cache, permisos y dependencia externa. Casi nunca es una sola cosa, y por eso conviene entrar con un orden simple. Si no, acabas mezclando sintomas de app con sintomas de plataforma y el incidente se vuelve pegajoso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que un 401 intermitente engancha tanto
&lt;/h2&gt;

&lt;p&gt;Lo dificil no es el &lt;code&gt;401&lt;/code&gt; en si. Lo dificil es que suele aparecer en una ruta concreta, con volumen irregular, y encima convive con metricas que se ven normales. CPU bien. Memoria bien. Latencia promedio aceptable. Pero un flujo de negocio ya esta roto.&lt;/p&gt;

&lt;p&gt;He visto tres causas repetirse bastante:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Un secreto se roto bien en Kubernetes, pero la aplicacion relee tarde o nunca.&lt;/li&gt;
&lt;li&gt;El token sigue vivo en unos workers y vencio en otros por diferencia de arranque.&lt;/li&gt;
&lt;li&gt;La API externa responde &lt;code&gt;401&lt;/code&gt; por una condicion secundaria, como reloj desfasado o audiencia incorrecta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En ese punto, reiniciar todo aveces mejora la foto unos minutos, pero no te dice cual causa era la real. Y si el problema vuelve en la siguiente ventana de trafico, el equipo queda igual de ciego.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que mirar antes de reiniciar
&lt;/h2&gt;

&lt;p&gt;Mi regla es revisar primero cuatro piezas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Si el secreto o token cambio de verdad y cuando cambio.&lt;/li&gt;
&lt;li&gt;Que workloads consumen esa credencial.&lt;/li&gt;
&lt;li&gt;Si el fallo ocurre en todos los pods o solo en una parte.&lt;/li&gt;
&lt;li&gt;Que dice la dependencia externa sobre rechazos recientes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Con eso ya puedes evitar media docena de hipotesis flojas. Un chequeo inicial puede ser tan simple como esto:&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 secret api-credential &lt;span class="nt"&gt;-n&lt;/span&gt; billing &lt;span class="nt"&gt;-o&lt;/span&gt; yaml | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; billing &lt;span class="nt"&gt;-o&lt;/span&gt; wide
kubectl logs deploy/billing-api &lt;span class="nt"&gt;-n&lt;/span&gt; billing &lt;span class="nt"&gt;--since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;15m | rg &lt;span class="s2"&gt;"401|403|expired|audience|token"&lt;/span&gt;
kubectl describe pod &lt;span class="nt"&gt;-n&lt;/span&gt; billing billing-api-7d9f6d7d7b-abcde
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tambien suelo mirar si hubo algun cambio de rollout, porque a veces el problema no es "token malo" sino mezcla de replicas nuevas y viejas. Esa diferencia de estado engancha mucho. En otros equipos lo comparo con &lt;a href="https://dev.to/silviutech/react-valida-email-sin-castigar-cada-tecla-2k2p"&gt;validar sin castigar cada tecla&lt;/a&gt;: si no separas la senal buena del ruido, terminas reaccionando a cada salto aunque el sistema no te este diciendo la verdad completa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un runbook corto para separar causas
&lt;/h2&gt;

&lt;p&gt;Este orden me ha servido bastante bien:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmar si el &lt;code&gt;401&lt;/code&gt; viene del servicio propio o de una API aguas abajo.&lt;/li&gt;
&lt;li&gt;Revisar timestamp de la ultima rotacion y hora de arranque de cada pod afectado.&lt;/li&gt;
&lt;li&gt;Comparar un pod sano con uno fallando: env vars, volumenes, service account, reloj y logs.&lt;/li&gt;
&lt;li&gt;Probar una llamada controlada con la misma credencial fuera del pod, si el entorno lo permite.&lt;/li&gt;
&lt;li&gt;Reiniciar solo una replica o canary cuando ya tengas una hipotesis fuerte.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El punto tres parece aburrido, pero suele ahorrar mucho. Si un pod viejo funciona y uno nuevo no, ya no estas delante de un incidente "global". Estas delante de una diferencia concreta de configuracion, montaje o init flow. Eso cambia la conversacion por completo.&lt;/p&gt;

&lt;p&gt;Cuando necesito dejar evidencia clara, anoto algo asi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pods afectados y pods sanos&lt;/li&gt;
&lt;li&gt;hora de arranque de cada uno&lt;/li&gt;
&lt;li&gt;version del secreto observada&lt;/li&gt;
&lt;li&gt;error exacto devuelto por la API&lt;/li&gt;
&lt;li&gt;resultado de una prueba manual corta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No hace falta un documento perfecto. Hace falta una ruta para que el siguiente operador no empiece desde cero, que pasa mas de lo que deberia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como valido el fix sin inventarme senales
&lt;/h2&gt;

&lt;p&gt;Una vez rota la credencial o corregido el consumer, intento validar con dos capas. Primero, la llamada principal que antes devolvia &lt;code&gt;401&lt;/code&gt;. Segundo, una senal secundaria que use la misma ruta funcional pero no dependa solo de "parece que ya no falla".&lt;/p&gt;

&lt;p&gt;Si tu flujo manda correos, crea jobs o dispara callbacks, una validacion secundaria ayuda. Pero hay que usarla con cuidado. Si la cola o el sistema auxiliar ya iba lento, puedes leer una conclusion falsa. Ese tipo de error se parece bastante a una &lt;a href="https://dev.to/silviutech/react-validacion-sin-saltos-ni-foco-roto-neg"&gt;validacion sin saltos ni foco roto&lt;/a&gt;: el objetivo no es producir mas eventos, sino confirmar el estado correcto con el menor ruido posible.&lt;/p&gt;

&lt;p&gt;En pruebas internas he visto equipos usar buzones de descarte y nombres de referencia como temp mail so o tempmailso para no mezclar cuentas reales. Esta bien como apoyo. Lo que no conviene es convertir esa prueba en la unica evidencia del fix. Y si aparece en notas viejas algo como tepm mail com o temp mailid, lo trato como pista sucia de QA, no como verdad operativa.&lt;/p&gt;

&lt;p&gt;Si quieres una comprobacion algo mas seria, compara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tasa de &lt;code&gt;401&lt;/code&gt; antes y despues del cambio&lt;/li&gt;
&lt;li&gt;porcentaje de pods sanos por replica set&lt;/li&gt;
&lt;li&gt;eventos de rotacion o rollout en la misma ventana&lt;/li&gt;
&lt;li&gt;una prueba manual repetible contra el endpoint afectado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando esas cuatro piezas se alinean, ya puedes cerrar la incidencia con bastante mas calma.&lt;/p&gt;

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

&lt;p&gt;Antes de irme, dejo este checklist pequeno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cual fue la credencial implicada&lt;/li&gt;
&lt;li&gt;si el fallo venia de Kubernetes o de una dependencia externa&lt;/li&gt;
&lt;li&gt;cuantos pods estaban realmente afectados&lt;/li&gt;
&lt;li&gt;si la app relee secretos en caliente o no&lt;/li&gt;
&lt;li&gt;que cambio resolvio el &lt;code&gt;401&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;que evidencia confirma que el fix aguanto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es una lista simple, pero evita que la siguiente guardia repita los mismos dos o tres intentos fallidos. Y honestamente, eso ya vale mucho.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q&amp;amp;A
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Debo reiniciar todo al primer 401?
&lt;/h2&gt;

&lt;p&gt;No. Si reinicias sin separar causas, puede parecer que arreglaste el problema cuando solo moviste el sintoma. Mejor compara pods, secreto y dependencia primero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como se si el error es de reloj o de permisos?
&lt;/h2&gt;

&lt;p&gt;Busca el mensaje exacto del proveedor y compara timestamps entre nodos, pods y sistema emisor. Un &lt;code&gt;401&lt;/code&gt; por reloj desfasado deja pistas distintas a un token vencido o una audiencia incorrecta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuanta evidencia necesito para cerrar?
&lt;/h2&gt;

&lt;p&gt;La suficiente para repetir la conclusion: logs, una prueba manual corta y una caida clara en errores despues del cambio. Si solo tienes intuicion, todavia falta un poco.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kubernetes: valida alertas tras rotar secretos</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Tue, 25 Aug 2026 17:24:57 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-valida-alertas-tras-rotar-secretos-1ko5</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-valida-alertas-tras-rotar-secretos-1ko5</guid>
      <description>&lt;p&gt;Rotar secretos de SMTP en Kubernetes suele parecer una tarea menor hasta que el primer correo de alerta no sale, sale duplicado o llega con enlaces viejos. El cambio tecnico ya ocurrio, pero la parte operativa sigue abierta. En varios equipos he visto ese hueco: se actualiza el &lt;code&gt;Secret&lt;/code&gt;, se reinicia lo justo, se mira que el pod quede sano... y nadie confirma que la alerta mas importante todavia explica bien lo que paso.&lt;/p&gt;

&lt;p&gt;Por eso me gusta tratar esta verificacion como un mini cierre de cambio. No hace falta montar una suite enorme. Hace falta una prueba corta, legible y repetible que confirme que el flujo de correo sigue vivo despues de la rotacion. Si usas una direccion de correo desechable para la corrida, mejor todavia, porque aislas evidencia y no llenas una inbox compartida con ruido. En notas internas alguna gente lo llama &lt;code&gt;tem email&lt;/code&gt;; no es bonito, pero ya sabes como escribimos cuando vamos con prisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que rotar el secreto no cierra el trabajo
&lt;/h2&gt;

&lt;p&gt;El riesgo no suele estar en Kubernetes por si solo. El riesgo aparece entre piezas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;el deployment tomo el secreto nuevo pero el worker de alertas no&lt;/li&gt;
&lt;li&gt;el certificado o relay externo acepta auth, pero rechaza el remitente&lt;/li&gt;
&lt;li&gt;la plantilla del mensaje sigue apuntando a un host viejo&lt;/li&gt;
&lt;li&gt;un reintento automatico manda dos avisos y confunde al on-call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese ultimo punto pasa mas de lo que parece. Segun el informe 2024 de &lt;a href="https://www.pagerduty.com/resources/incident-management-report/" rel="noopener noreferrer"&gt;The State of Production Incidents&lt;/a&gt; de PagerDuty, la claridad del contexto inicial sigue siendo uno de los factores que mas reduce escalado innecesario durante incidentes. No hace falta poner un numero en cada runbook para notar lo mismo en guardias reales: si el primer aviso llega raro, todo el mundo pierde minutos valiosos.&lt;/p&gt;

&lt;p&gt;Tambien conviene pensar en el cambio como una cadena de estados, no como un unico "correo enviado". Si ya trabajaste patrones para &lt;a href="https://dev.to/silviutech/fastapi-webhooks-de-email-sin-carreras-2ea"&gt;recibir eventos de email sin mezclar estados viejos&lt;/a&gt;, esta validacion encaja bien con esa mentalidad. Y si el sistema tiene polling o reintentos, revisar como &lt;a href="https://dev.to/silviutech/fastapi-reintentos-de-verificacion-sin-duplicados-230p"&gt;manejar reintentos de verificacion sin duplicados&lt;/a&gt; tambien ayuda bastante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que suelo validar justo despues del cambio
&lt;/h2&gt;

&lt;p&gt;Cuando termino la rotacion, reviso solo lo minimo que de verdad evita una guardia tonta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;La alerta sale usando las credenciales nuevas.&lt;/li&gt;
&lt;li&gt;El asunto identifica servicio, entorno y accion.&lt;/li&gt;
&lt;li&gt;El cuerpo trae un enlace util al sistema correcto.&lt;/li&gt;
&lt;li&gt;No aparecen duplicados por restart o por replay del worker.&lt;/li&gt;
&lt;li&gt;La marca horaria coincide con el cambio recien hecho.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si una de esas cinco cosas falla, no doy por cerrado el cambio. Es un criterio simple, pero muy util. Aveses la entrega funciona y aun asi el correo llega con un link a un dashboard viejo o con un nombre de cluster heredado. Eso no rompe el transporte, pero si rompe la operacion.&lt;/p&gt;

&lt;p&gt;En entornos con Alertmanager, un relevo SMTP o un worker propio, tambien miro donde se cachean credenciales. Hay procesos que releen secretos al vuelo y otros que necesitan reinicio controlado. Esa diferencia, tan pequena sobre el papel, es la que luego explica porque la prueba manual "parecia bien" y la alerta real de media hora despues no salio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un check pequeno que evita guardias confusas
&lt;/h2&gt;

&lt;p&gt;Mi preferencia es usar una sola corrida, una sola inbox aislada y una sola expectativa clara:&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;"alert-rotate-&lt;/span&gt;&lt;span class="nv"&gt;$RUN_ID&lt;/span&gt;&lt;span class="s2"&gt;@example.test"&lt;/span&gt;

kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; smtp-secret.yaml
kubectl rollout restart deploy/alert-dispatcher &lt;span class="nt"&gt;-n&lt;/span&gt; platform
kubectl rollout status deploy/alert-dispatcher &lt;span class="nt"&gt;-n&lt;/span&gt; platform

trigger_test_alert &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; platform &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--service&lt;/span&gt; checkout-api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--severity&lt;/span&gt; warning &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;"checkout-api"&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;"platform"&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;"grafana.example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No intenta probar todo. Solo responde la pregunta correcta: despues de cambiar el secreto, la alerta util sigue llegando y sigue apuntando al sitio correcto? Si la respuesta es no, quiero enterarme en ese momento, no cuando alguien esta medio dormido a las 03:10.&lt;/p&gt;

&lt;p&gt;Otra cosa que me sirve mucho es guardar el &lt;code&gt;run_id&lt;/code&gt; junto al evento de prueba. Asi puedes separar una entrega tardia de una corrida anterior frente a un fallo real de la actual. Parece obvio, pero en mas de una revision he visto equipos perseguir un flake que era simplemente un mensaje viejo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Senales que conviene guardar en el runbook
&lt;/h2&gt;

&lt;p&gt;No hace falta llenar el runbook de campos, pero estas senales si las conservo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;namespace o cluster&lt;/li&gt;
&lt;li&gt;nombre del deployment reiniciado&lt;/li&gt;
&lt;li&gt;destinatario usado en la prueba&lt;/li&gt;
&lt;li&gt;host principal detectado en enlaces&lt;/li&gt;
&lt;li&gt;latencia hasta recepcion&lt;/li&gt;
&lt;li&gt;resultado final de la verificacion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con eso ya puedes explicar casi cualquier fallo comun. Si el correo no llega, miras auth y relay. Si llega duplicado, revisas replay o reintentos. Si llega bien pero enlaza mal, la causa suele estar en plantilla o config. Es una tabla de decision bastante humilde, pero funciona.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Hay que probar esto en cada rotacion?
&lt;/h3&gt;

&lt;p&gt;Si la rotacion afecta credenciales reales del flujo de alertas, para mi si. No siempre con la misma profundidad, pero al menos con un smoke check corto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sirve una inbox compartida?
&lt;/h3&gt;

&lt;p&gt;Puede servir, pero prefiero una aislada por corrida. Una direccion de correo desechable o temporal reduce ruido y hace mas facil saber que mensaje pertenece a este cambio y no a otro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debo validar HTML completo?
&lt;/h3&gt;

&lt;p&gt;Normalmente no. Prefiero asunto, destinatario, host de enlaces y una o dos cadenas clave del cuerpo. El objetivo es confianza operativa, no perfeccion visual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cual es el error mas comun?
&lt;/h3&gt;

&lt;p&gt;Cerrar el cambio cuando el pod ya levanto y asumir que el correo tambien quedo bien. Esa suposicion es la parte fragil, y suele costar mas de lo que paresce.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Kubernetes: alerta antes de que expire un token</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Tue, 25 Aug 2026 08:24:15 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-alerta-antes-de-que-expire-un-token-4ocb</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-alerta-antes-de-que-expire-un-token-4ocb</guid>
      <description>&lt;p&gt;Los tokens que caducan en Kubernetes rara vez avisan de forma comoda. Lo mas normal es ver primero un sintoma lateral: un job deja de hablar con una API, una integracion externa empieza a devolver &lt;code&gt;401&lt;/code&gt;, o un pod sano en metricas queda medio roto en negocio. En ese punto, el impulso natural es reiniciar algo. A veces ayuda, pero muchas veces solo mueve el problema unos minutos y te quita contexto.&lt;/p&gt;

&lt;p&gt;En guardias de SRE me ha servido tratar la expiracion como una senal operativa, no como un detalle de implementacion. Si un token va a vencer pronto, quiero saberlo antes de que caiga el primer flujo importante. Y si ya vencio, quiero ver rapido que workloads quedaron tocados, que margen tengo para rotar, y si el fallo esta en Kubernetes o en el sistema que emite la credencial.&lt;/p&gt;

&lt;h2&gt;
  
  
  El fallo aparece tarde y por eso engancha
&lt;/h2&gt;

&lt;p&gt;El patron mas pesado es el de degradacion lenta. El token sigue valido en algunos procesos por cache, pero otro componente ya empezo a fallar. Desde fuera se ve raro: latencia estable, CPU normal, y errores de autenticacion subiendo solo en un camino concreto. Ese estado intermedio roba muchisimo tiempo.&lt;/p&gt;

&lt;p&gt;Por eso la alerta no deberia decir solo "token expires soon". Me sirve mas cuando trae:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;namespace y secreto o service account implicado&lt;/li&gt;
&lt;li&gt;workloads que consumen esa credencial&lt;/li&gt;
&lt;li&gt;fecha real de expiracion y margen restante&lt;/li&gt;
&lt;li&gt;errores recientes de autenticacion asociados&lt;/li&gt;
&lt;li&gt;enlace rapido al runbook de rotacion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es la misma idea de &lt;a href="https://dev.to/alexcarteruk/kubernetes-rota-secretos-sin-reinicios-ciegos-1a7c"&gt;rotar secretos sin reinicios ciegos&lt;/a&gt;: una senal con contexto baja el ruido y evita decisiones torpes. Cuando esa pieza falta, el on-call tiene que reconstruir el mapa a mano, y ahi se va media incidencia facil.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que senales pongo antes de que el token venza
&lt;/h2&gt;

&lt;p&gt;No hace falta montar una plataforma gigante. Un primer paso bastante util es medir tres cosas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cuantos dias u horas le quedan a cada token critico.&lt;/li&gt;
&lt;li&gt;Que despliegues o CronJobs dependen de el.&lt;/li&gt;
&lt;li&gt;Si ya hay errores de autenticacion en logs o eventos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando el token vive en un secreto sincronizado desde otro sistema, tambien intento guardar la hora de emision original. Sin eso, el operador ve el secreto "nuevo" en Kubernetes y asume que todo esta bien, aunque la credencial copiada ya venia casi vencida. Me ha pasado mas de una vez, y se pierde rato en la direccion equivocada.&lt;/p&gt;

&lt;p&gt;Un chequeo sencillo puede verse asi:&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 secret payments-api-token &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.metadata.name'&lt;/span&gt;
kubectl get deploy &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="s1"&gt;'.items[] | {name: .metadata.name, sa: .spec.template.spec.serviceAccountName}'&lt;/span&gt;
kubectl logs deploy/payments-api &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;--since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20m | rg &lt;span class="s2"&gt;"401|403|token|expired|credential"&lt;/span&gt;
kubectl get events &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.lastTimestamp | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No es perfecto, pero ordena la primera media hora. Tambien ayuda a separar un problema de expiracion real de un problema de permisos, reloj desfasado o rollout a medias. Ese matiz parece pequeno, pero cambia mucho la respuesta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un runbook pequeno para no reiniciar a ciegas
&lt;/h2&gt;

&lt;p&gt;Cuando veo que una credencial esta cerca del borde, sigo este orden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmar expiracion real y sistema dueño del token.&lt;/li&gt;
&lt;li&gt;Identificar workloads impactados y priorizar los que tocan ingreso o pagos.&lt;/li&gt;
&lt;li&gt;Validar si la app relee el token en caliente o solo al arranque.&lt;/li&gt;
&lt;li&gt;Rotar en un servicio pequeno o canary antes del resto.&lt;/li&gt;
&lt;li&gt;Observar errores de autenticacion, latencia y colas durante 5 a 10 minutos.&lt;/li&gt;
&lt;li&gt;Completar rollout solo si la evidencia aguanta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La parte importante no es que el runbook sea elegante. Lo importante es que reduzca apuestas. Si saltas directo al restart global, aveces recuperas disponibilidad, si, pero tambien escondes cual workload estaba mal cableado y cual seguia usando un token cacheado.&lt;/p&gt;

&lt;p&gt;Otra cosa que procuro dejar escrita: quien es el owner del token. Suena obvio, pero en incidentes reales aparece mucho credencial "de plataforma" que en verdad depende de un equipo externo, o de una integracion vieja que nadie quiere tocar. Esa ambiguedad hace el incidente mas largo de lo que deberia ser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde encajan las pruebas de notificacion
&lt;/h2&gt;

&lt;p&gt;Algunas rotaciones activan emails, webhooks o mensajes a otro sistema. Eso no prueba por si solo que el token quedo bien, pero si da una capa extra de evidencia. Para entornos de QA o pruebas internas, a veces uso &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;tempmailso&lt;/a&gt; o un servicio de &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;free disposable email&lt;/a&gt; para revisar una notificacion sin mezclar buzones reales. Lo importante es tratarlo como validacion secundaria, no como la prueba principal.&lt;/p&gt;

&lt;p&gt;Si esa notificacion depende de un worker o de polling, me sirve muchisimo revisar tambien algo como este enfoque de &lt;a href="https://dev.to/silviutech/fastapi-polling-de-inbox-con-limites-sanos-3ga8-temp-slug-3929817?preview=467d18814025d80aabaaa416c1c97811653741a49975f92f37128cecc28ad7f30fdad489994315352f1fcc355c01b1965f42a7bf77a66c63c703426e"&gt;polling de inbox con limites sanos&lt;/a&gt;. La razon es simple: si el canal auxiliar ya venia lento, puedes culpar al token y perder tiempo. Un tempail perdido en una cola atrasada no te dice nada bueno sobre la salud del cluster.&lt;/p&gt;

&lt;p&gt;En otras palabras, primero estabiliza autenticacion. Luego confirma mensajeria. Hacer ambas hipotesis al mismo tiempo parece eficiente, pero casi nunca sale bien del todo.&lt;/p&gt;

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

&lt;p&gt;Antes de cerrar, dejo una nota corta con esto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;que token o secreto estaba por vencer&lt;/li&gt;
&lt;li&gt;quien era el owner real de la credencial&lt;/li&gt;
&lt;li&gt;que workloads consumian ese valor&lt;/li&gt;
&lt;li&gt;si hacia falta reinicio o recarga dinamica&lt;/li&gt;
&lt;li&gt;que error desaparecio despues de la rotacion&lt;/li&gt;
&lt;li&gt;que prueba secundaria use para validar el flujo&lt;/li&gt;
&lt;li&gt;que duda quedo abierta para horario laboral&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No tiene que quedar bonito. Tiene que quedar util. Una guardia futura agradece muchisimo esa nota medio fea pero concreta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q&amp;amp;A
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Conviene alertar por todos los tokens?
&lt;/h2&gt;

&lt;p&gt;No. Empieza por los que sostienen rutas criticas o integraciones externas. Si alertas por todo desde el dia uno, el equipo dejara de mirar la senal bastante rapido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reiniciar siempre resuelve?
&lt;/h2&gt;

&lt;p&gt;No necesariamente. Si el token nuevo no llego, o si el sistema emisor entrego una credencial mala, el reinicio solo mueve el error. Primero confirma la causa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuanto margen de expiracion deberia vigilar?
&lt;/h2&gt;

&lt;p&gt;Depende del sistema, pero me funciona separar dos umbrales: uno preventivo para horario laboral y otro mas agresivo para guardia. Ese detalle evita correr por nada, pero tambien evita llegar tarde.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Kubernetes: senales utiles para CronJobs fragiles</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Tue, 25 Aug 2026 02:24:44 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-senales-utiles-para-cronjobs-fragiles-59n</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-senales-utiles-para-cronjobs-fragiles-59n</guid>
      <description>&lt;p&gt;Los CronJobs en Kubernetes suelen parecer simples hasta que fallan de forma intermitente. El contenedor termina, vuelve a correr mas tarde, y el equipo solo ve una alerta floja de "job failed". En guardias SRE eso desgasta bastante porqe cada intento deja pistas distintas: a veces falta CPU, a veces una dependencia externa tarda demasiado, y a veces el problema es un dato raro que solo aparece una vez al dia.&lt;/p&gt;

&lt;p&gt;Con el tiempo me sirvio una regla muy concreta: para jobs fragiles no necesitas mas dashboards, necesitas mejores senales iniciales. Si en los primeros cinco minutos puedes responder que cambio hubo, que dependencia se movio y si el fallo fue por saturacion o por datos, ya vas muy por delante. Si no, el triage se vuelve un paseo medio ciego.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que los CronJobs fallan sin avisar bien
&lt;/h2&gt;

&lt;p&gt;Un servicio web roto suele dejar errores visibles enseguida. Un job programado no. Puede fallar a las 02:00, reintentarse a las 02:15 y recien notarse cuando una cola amanecio vacia o cuando un reporte no llego. Ese desfase hace que mucha evidencia se pierda o quede desordenada.&lt;/p&gt;

&lt;p&gt;Segun el estado de observabilidad 2024 de Splunk, los equipos con mejor contexto operativo reducen el tiempo de investigacion y el trabajo reactivo manual (&lt;a href="https://www.splunk.com/en_us/form/state-of-observability.html" rel="noopener noreferrer"&gt;Splunk Observability Report&lt;/a&gt;). No hace falta tomar ese dato como una formula exacta, pero si como recordatorio de algo muy real: una alerta sin contexto obliga al equipo a reconstruir la historia desde cero.&lt;/p&gt;

&lt;p&gt;Tambien he visto que el ruido crece cuando el job comparte componentes con flujos asincronos o notificaciones. En esos casos ayuda mucho &lt;a href="https://dev.to/silviutech/fastapi-jobs-de-email-que-no-pierden-contexto-3mkb"&gt;mantener el contexto cuando un job dispara correos&lt;/a&gt;, porque asi no mezclas un timeout del batch con un fallo secundario del canal de salida. Parece obvio, aunqe en una madrugada cansada no siempre lo es.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las tres senales que reviso primero
&lt;/h2&gt;

&lt;p&gt;Cuando me toca un CronJob inestable, casi siempre empiezo por estas tres preguntas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El job fallo por recursos, por dependencia o por datos.&lt;/li&gt;
&lt;li&gt;Que cambio reciente coincide con la ventana del fallo.&lt;/li&gt;
&lt;li&gt;La siguiente corrida hereda el mismo riesgo o no.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eso traduce el incidente a algo accionable. Si el pod quedo &lt;code&gt;OOMKilled&lt;/code&gt;, miro requests, limits y el perfil de memoria. Si termino por timeout, comparo duracion historica y latencia aguas abajo. Si el job salio con error de negocio, intento capturar el input exacto antes de tocar la imagen o el horario.&lt;/p&gt;

&lt;p&gt;Un bloque minimo que me gusta tener a mano es este:&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 cronjob reports-sync &lt;span class="nt"&gt;-n&lt;/span&gt; ops &lt;span class="nt"&gt;-o&lt;/span&gt; yaml
kubectl get &lt;span class="nb"&gt;jobs&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; ops &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.metadata.creationTimestamp | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5
kubectl describe job reports-sync-28934122 &lt;span class="nt"&gt;-n&lt;/span&gt; ops
kubectl logs job/reports-sync-28934122 &lt;span class="nt"&gt;-n&lt;/span&gt; ops &lt;span class="nt"&gt;--previous&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No resuelve todo, claro, pero te saca del modo "adivinar". Varias veces el problema no estaba en Kubernetes sino en una API lenta o en un secreto rotado de forma incompleta. Si empiezas por señales pequeñas pero firmes, evitas perseguir sintomas demasido vistosos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un checklist corto para aislar el problema
&lt;/h2&gt;

&lt;p&gt;Para no abrir veinte pestañas de golpe, suelo seguir este orden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmar si fallo una sola corrida o varias seguidas.&lt;/li&gt;
&lt;li&gt;Mirar &lt;code&gt;lastScheduleTime&lt;/code&gt;, concurrencia y politica de reintentos.&lt;/li&gt;
&lt;li&gt;Comparar duracion p95 de corridas sanas frente a la corrida rota.&lt;/li&gt;
&lt;li&gt;Revisar un cambio cercano: imagen, ConfigMap, secreto o dependencia.&lt;/li&gt;
&lt;li&gt;Definir una mitigacion reversible antes de relanzar manualmente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La parte importante esta en el paso cinco. Hay equipos que rerunean el job demasiado pronto y despues ya no saben si el fix fue real o si solo paso el dato raro. Yo prefiero dejar escrito algo simple: "si la latencia externa sigue alta, no relanzar; si la cola ya dreno y el fix esta aislado, correr una vez". No suena elegante, pero ordena muy bien la conversacion.&lt;/p&gt;

&lt;p&gt;En entornos donde el job termina enviando avisos internos o reportes al cliente, tambien me sirve &lt;a href="https://dev.to/hannahdev56/saas-soporte-listo-tras-emails-de-trial-465i"&gt;dejar el soporte listo cuando entran avisos de trial&lt;/a&gt;. La leccion no es de marketing, es operativa: si la salida del job tiene destinatarios claros, ownership y ventanas de validacion, luego es mucho mas facil detectar si el fallo fue tecnico o solo de distribucion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde entra el correo de usar y tirar en pruebas operativas
&lt;/h2&gt;

&lt;p&gt;No recomiendo meter cuentas temporales en cualquier flujo serio, pero en smoke tests no productivos a veces ayudan. Cuando un CronJob genera resumentes, enlaces de descarga o notificaciones de onboarding interno, un correo de usar y tirar puede servir para comprobar entrega y formato sin mezclar buzones reales del equipo.&lt;/p&gt;

&lt;p&gt;La clave es tratarlo como herramienta de prueba, no como parte del diseno principal. Si un test depende de una direccion temporal, debe quedar etiquetado y fuera de cualquier metrica de negocio. Tambien conviene anotar cadenas raras que aparecen en soporte o en seeds de QA, como tempail o fake e mail com, para que nadie las confunda con trafico sano. Este detalle parece pequeño, pero varias veces me ahorro una investigacion boba.&lt;/p&gt;

&lt;p&gt;Si ademas dejas el scenario ID, el timestamp y el destino temporal junto al log del job, la siguiente persona entiende la corrida sin pelearse con tres sistemas distintos. Ese tipo de prolijidad paga sola, aunque al principio de un poco de pereza.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Conviene alertar por cada fallo de CronJob?
&lt;/h3&gt;

&lt;p&gt;No siempre. Si el job corre cada minuto, alertar por cada error puede tapar lo importante. Me funciona mejor alertar por fallos consecutivos, por duracion anormal o por ausencia de resultado esperado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Que metrica suele faltar?
&lt;/h3&gt;

&lt;p&gt;La de exito util. Mucha gente mira si el pod termino en &lt;code&gt;Completed&lt;/code&gt;, pero no si genero el artefacto correcto, movio los registros esperados o entrego el mensaje correcto. Esa diferencia cambia todo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Esto es solo para Kubernetes grande?
&lt;/h3&gt;

&lt;p&gt;Para nada. Vale igual en clusters pequenos. De hecho, en equipos chicos se nota mas, porque una señal mala te come media manana sin pedir permiso.&lt;/p&gt;

&lt;p&gt;Si tus jobs programados siguen rompiendose de forma borrosa, yo empezaria por mejorar la alerta inicial y el checklist de evidencia. No hace magia, pero baja bastante el tiempo muerto y deja al equipo pensando mejor, no corriendo mas.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Terraform: alertas de drift con contexto</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Fri, 21 Aug 2026 23:24:38 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/terraform-alertas-de-drift-con-contexto-514k</link>
      <guid>https://dev.to/alexcarteruk/terraform-alertas-de-drift-con-contexto-514k</guid>
      <description>&lt;p&gt;Las alertas de drift en Terraform suelen fallar de una forma muy discreta. El detector corre, encuentra diferencia entre el estado y la realidad, manda un correo, y en teoria ya esta. En la practica, muchas veces el mensaje llega sin decir que recurso cambio, que workspace esta afectado o si el desvio aparecio tras un deploy legitimo. He visto equipos perder una hora por eso, facil.&lt;/p&gt;

&lt;p&gt;Cuando la alerta no trae contexto, la guardia termina abriendo consola, historial de cambios y logs al mismo tiempo. Eso desgasta bastante, y lo peor es que el problema no esta en Terraform sino en como contamos el incidente. Mi regla suele ser simple: si el correo no ayuda a decidir el siguiente paso en menos de un minuto, el alerta esta medio rota aunque haya salido bien.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que tantas alertas de drift se vuelven ruido
&lt;/h2&gt;

&lt;p&gt;Lo comun es implementar el check de drift como una tarea programada y dejar la notificacion para el final. Funciona al principio, pero luego aparecen pequeños defectos que se acumulan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;asuntos genericos como "drift detected"&lt;/li&gt;
&lt;li&gt;cambios reales sin nombre de workspace o cuenta cloud&lt;/li&gt;
&lt;li&gt;enlaces a dashboards que ya no apuntan al entorno correcto&lt;/li&gt;
&lt;li&gt;correos duplicados por reintentos mal cerrados&lt;/li&gt;
&lt;li&gt;mensajes que dicen que hubo drift pero no separan cambio esperado de cambio peligroso&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese ultimo punto importa mucho. Un drift despues de una accion manual de emergencia no se interpreta igual que un drift en una politica IAM tocada fuera de pipeline. Si el mensaje no marca esa diferencia, el on-call hace trabajo de detective a las 3 AM, y nadie quiere eso la verdad.&lt;/p&gt;

&lt;p&gt;Tambien conviene pensar en la parte humana. En notas internas he visto a gente buscar cosas con palabras raras como &lt;code&gt;temp mailid&lt;/code&gt; o &lt;code&gt;tempail&lt;/code&gt; porque recuerdan a medias la herramienta o el flujo usado para validar emails. No es elegante, pero asi trabaja la gente cuando va rapido.&lt;/p&gt;

&lt;h2&gt;
  
  
  El contexto minimo que una alerta debe traer
&lt;/h2&gt;

&lt;p&gt;Para mi, una alerta de drift util deberia responder estas cinco preguntas sin obligarte a abrir otras tres pantallas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Que workspace, stack o modulo disparo el hallazgo.&lt;/li&gt;
&lt;li&gt;Que recurso concreto cambio o al menos que tipo de recurso esta afectado.&lt;/li&gt;
&lt;li&gt;En que cuenta, region y entorno aparecio.&lt;/li&gt;
&lt;li&gt;Si el drift viene de una lectura periodica, de una aprobacion manual o de una ejecucion fallida reciente.&lt;/li&gt;
&lt;li&gt;Cual es el primer enlace util: plan, PR, runbook o dashboard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ese formato parece muy basico, pero cambia bastante la calidad operativa. En un articulo anterior sobre &lt;a href="https://dev.to/alexcarteruk/kubernetes-secretos-rotados-sin-alertas-rotas-2i7i"&gt;rotar secretos sin romper alertas&lt;/a&gt; comentaba algo parecido: la alerta debe reducir ambiguedad, no solo demostrar que existe un sistema de avisos.&lt;/p&gt;

&lt;p&gt;Si tu equipo ya valida correos en otros flujos, como aprobaciones o upgrades, te puede servir esta guia sobre &lt;a href="https://dev.to/hannahdev56/como-probar-upgrades-por-email-sin-ruido-en-tu-saas-53pl"&gt;probar upgrades por email sin ruido&lt;/a&gt;. Aunque venga de un contexto SaaS, la idea de aislar una corrida y revisar un mensaje con criterios claros encaja muy bien en DevOps tambien.&lt;/p&gt;

&lt;h2&gt;
  
  
  Una prueba corta antes de confiar en ella
&lt;/h2&gt;

&lt;p&gt;No hace falta montar una suite enorme para estas alertas. Yo prefiero una prueba corta, repetible y con evidencia minima:&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;WORKSPACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"network-prod"&lt;/span&gt;
&lt;span class="nv"&gt;INBOX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tf-drift-&lt;/span&gt;&lt;span class="nv"&gt;$RUN_ID&lt;/span&gt;&lt;span class="s2"&gt;@example.test"&lt;/span&gt;

trigger_drift_check &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workspace&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="s2"&gt;"ap-southeast-1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--expect-resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_security_group_rule"&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;$INBOX&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;$INBOX&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;$INBOX&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;$INBOX&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
assert_body_contains &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INBOX&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"aws_security_group_rule"&lt;/span&gt;
assert_body_contains &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INBOX&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RUN_ID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo importante no es el inbox en si, sino que la corrida quede aislada. Si el equipo usa un generador de correo falso o una bandeja descartable, bien. Si usa otra cosa interna, tambien vale. Lo que no conviene es reutilizar la misma bandeja entre corridas y luego discutir si el correo visto era de hoy o del miercoles pasado.&lt;/p&gt;

&lt;p&gt;En esta parte suelo guardar un paquete de evidencia pequeño:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;workspace y region&lt;/li&gt;
&lt;li&gt;recurso esperado&lt;/li&gt;
&lt;li&gt;destinatario usado&lt;/li&gt;
&lt;li&gt;host del enlace principal&lt;/li&gt;
&lt;li&gt;tiempo hasta recepcion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eso alcanza para separar problemas bastante distinto entre si. Si el mensaje llega una vez pero sin region, la plantilla esta floja. Si llega dos veces con el mismo &lt;code&gt;run_id&lt;/code&gt;, probablemente hay reintentos sin cierre. Si trae recurso y region pero enlaza al plan equivocado, el bug esta en el mapeo entre pipeline y notificacion. Parece obvio escrito asi, pero en incidentes reales ayuda un monton tenerlo ordenado.&lt;/p&gt;

&lt;h2&gt;
  
  
  La checklist que deja menos dudas
&lt;/h2&gt;

&lt;p&gt;Antes de dejar activa una alerta de drift, reviso esto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;el asunto nombra workspace o stack&lt;/li&gt;
&lt;li&gt;el cuerpo menciona recurso, region y entorno&lt;/li&gt;
&lt;li&gt;el mensaje distingue drift esperado de drift sospechoso, aunque sea con una nota corta&lt;/li&gt;
&lt;li&gt;el enlace principal abre el panel o runbook correcto&lt;/li&gt;
&lt;li&gt;no hay duplicados para la misma corrida&lt;/li&gt;
&lt;li&gt;el correo incluye una accion siguiente razonable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si quieres agregar una mejora mas, añade un resumen corto del impacto. Algo como "regla de ingreso abierta a 0.0.0.0/0" orienta mucho mejor que "policy changed". No hace milagros, pero ahorra varias preguntas en Slack y un par de vueltas innecesarias.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Conviene correr esta prueba en cada PR?
&lt;/h3&gt;

&lt;p&gt;Solo si el cambio toca plantillas, routing de alertas, politicas IAM relacionadas o la logica que arma el contexto. Para cambios normales de modulos, una corrida programada suele ser suficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hace falta mostrar el diff completo en el correo?
&lt;/h3&gt;

&lt;p&gt;Normalmente no. Prefiero una version corta con el tipo de recurso, el atributo sensible y un enlace al detalle. Un correo larguisimo se vuelve dificil de leer y casi nadie lo procesa bien bajo presion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cual es el error mas comun?
&lt;/h3&gt;

&lt;p&gt;Mandar una alerta correcta pero inutil. Es decir: sale a tiempo, tiene buen asunto, pero no dice que hacer despues. Ese hueco parece menor, pero es donde mas se pierde tiempo cuando hay guardia de verdad.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
      <category>cloud</category>
      <category>security</category>
    </item>
    <item>
      <title>Kubernetes: rota secretos sin reinicios ciegos</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Thu, 20 Aug 2026 23:24:36 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/kubernetes-rota-secretos-sin-reinicios-ciegos-1a7c</link>
      <guid>https://dev.to/alexcarteruk/kubernetes-rota-secretos-sin-reinicios-ciegos-1a7c</guid>
      <description>&lt;p&gt;La rotacion de secretos en Kubernetes casi nunca falla de forma elegante. Lo normal es algo mas incomodo: un token vence, un pod sigue vivo con credenciales viejas, o una app reinicia bien en staging pero raro en prod. Cuando eso pasa, muchos equipos saltan directo a reiniciar todo. Ese reflejo aveces resuelve el sintoma, pero tambien borra pistas y mete ruido justo cuando mas necesitas claridad.&lt;/p&gt;

&lt;p&gt;En guardias de SRE me ha servido tratar la rotacion como un cambio operacional con evidencia minima, no como un boton magico. Si un secreto cambia, quiero saber que workloads lo consumen, que parte lee el valor solo al arranque, y que alertas apareceran si hago rollout ahora mismo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuando la rotacion de secretos falla no siempre explota al momento
&lt;/h2&gt;

&lt;p&gt;El patron mas enganoso es este: el secreto ya fue actualizado, pero solo una parte del sistema empezo a usarlo. Algunos pods leen desde variable de entorno, otros desde volumen montado, y otro servicio guarda conexiones abiertas durante varios minutos. Desde fuera parece que todo esta "medio bien". Ese estado medio roto es el que mas tiempo roba.&lt;/p&gt;

&lt;p&gt;Por eso prefiero una alerta que diga algo util, no solo "secret changed". Necesito al menos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nombre del secreto y namespace&lt;/li&gt;
&lt;li&gt;despliegues o CronJobs que dependen de el&lt;/li&gt;
&lt;li&gt;si el consumo ocurre en arranque, refresh interno o ambos&lt;/li&gt;
&lt;li&gt;si hubo errores de autenticacion despues del cambio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es la misma idea de preparar &lt;a href="https://dev.to/alexcarteruk/terraform-correos-de-drift-que-si-orientan-211j"&gt;senales con contexto antes de tocar produccion&lt;/a&gt;. Una senal desnuda obliga al on-call a reconstruir la escena entera, y ahi se va un monton de tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que revisar antes de reiniciar pods
&lt;/h2&gt;

&lt;p&gt;Antes de tirar un &lt;code&gt;kubectl rollout restart&lt;/code&gt;, hago tres preguntas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El secreto cambio de verdad o solo cambió metadata que no consume la app.&lt;/li&gt;
&lt;li&gt;La aplicacion relee credenciales en caliente o necesita proceso nuevo.&lt;/li&gt;
&lt;li&gt;El fallo esta en el secreto, o en el sistema que envia la nueva credencial.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ese tercer punto importa mucho. Varias veces el error no era Kubernetes sino una cola atrasada de notificaciones, un job que escribia tarde, o un proveedor externo que entregaba el valor con demora. Si no ves esa parte, reinicias pods sanos y el incidente se vuelve mas feo.&lt;/p&gt;

&lt;p&gt;Un chequeo pequeno que suele bastar:&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 secret api-credentials &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;-o&lt;/span&gt; yaml
kubectl get deploy &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="s1"&gt;'.items[] | {name: .metadata.name, secrets: [.spec.template.spec.containers[].envFrom[]?.secretRef.name]}'&lt;/span&gt;
kubectl rollout status deploy/payments-api &lt;span class="nt"&gt;-n&lt;/span&gt; payments
kubectl logs deploy/payments-api &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;--since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;15m | rg &lt;span class="s2"&gt;"auth|token|secret|credential"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No es un runbook brillante, pero si ordena la primera media hora. Tambien deja visible si el problema es parcial. Y un incidente parcial mal leido, bueno, se convierte facil en incidente total.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un runbook pequeno para rotar secretos sin panico
&lt;/h2&gt;

&lt;p&gt;Cuando el servicio no soporta recarga dinamica, uso un flujo simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmar version nueva del secreto y timestamp real de actualizacion.&lt;/li&gt;
&lt;li&gt;Identificar workloads impactados y ordenarlos por criticidad.&lt;/li&gt;
&lt;li&gt;Reiniciar primero un replica set pequeno o una canary si existe.&lt;/li&gt;
&lt;li&gt;Medir autenticacion, latencia y errores de negocio durante 5 a 10 minutos.&lt;/li&gt;
&lt;li&gt;Completar rollout solo si la evidencia sigue limpia.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si un componente manda emails o links de verificacion al cambiar credenciales, me gusta separar esa prueba de la ruta principal. Para entornos de QA, una &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;direccion desechable&lt;/a&gt; puede ayudar a validar la notificacion sin mezclar bandejas reales. Lo importante es que ese paso sea evidencia secundaria, no la prueba central de que el secreto quedo bien propagado.&lt;/p&gt;

&lt;p&gt;Tambien conviene hacer visible cualquier backlog de entrega. El articulo sobre &lt;a href="https://dev.to/silviutech/fastapi-cola-visible-para-correos-async-419m"&gt;hacer visible una cola de notificaciones lentas&lt;/a&gt; toca esa idea desde backend, pero en operaciones aplica igual: si la senal externa llega tarde, el operador necesita verlo rapido.&lt;/p&gt;

&lt;p&gt;En varios equipos aun aparece un tem email en alguna prueba rapida o un reinicio manual "por si acaso". Yo no diria que sea prohibido, pero si deja deuda. Si la guardia siguiente no entiende por que reiniciaste, el aprendizaje se pierde y el mismo bug vuelve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde ayudan las pruebas de notificaciones
&lt;/h2&gt;

&lt;p&gt;No toda rotacion necesita email, Slack o webhook, pero cuando existen, hay que tratarlos como canales de soporte. Sirven para confirmar que el flujo alrededor del secreto esta sano, aunque no reemplazan logs, metricas ni eventos del cluster.&lt;/p&gt;

&lt;p&gt;Algo que si he aprendido a la mala: no mezclar el runbook de credenciales con el runbook de mensajeria. Si cambia una password de base de datos y ademas falla el aviso, primero estabiliza la app. Luego revisas la notificacion. Hacer ambas cosas al mismo tiempo suena eficiente, pero normalmente te deja con dos hipotesis malas en vez de una hipotesis buena.&lt;/p&gt;

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

&lt;p&gt;Antes de cerrar el incidente, dejo una nota corta con esto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;que secreto cambio y a que hora&lt;/li&gt;
&lt;li&gt;que workloads consumian el valor&lt;/li&gt;
&lt;li&gt;si hacia falta reinicio o no&lt;/li&gt;
&lt;li&gt;que error exacto desaparecio tras la rotacion&lt;/li&gt;
&lt;li&gt;que prueba secundaria se uso para validar el flujo&lt;/li&gt;
&lt;li&gt;que duda quedo abierta para horario laboral&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No tiene que quedar bonito. Tiene que quedar util. Ese tipo de nota pequeña evita decisiones ciegas despues, y eso ya paga bastante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q&amp;amp;A
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Debo reiniciar todos los pods apenas rote un secreto?
&lt;/h2&gt;

&lt;p&gt;No siempre. Primero confirma como consume el secreto cada app. Reiniciar sin esa comprobacion es rapido, pero no necesariamente correcto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que parte suele faltar en las alertas?
&lt;/h2&gt;

&lt;p&gt;La relacion entre el secreto cambiado y los workloads afectados. Muchas alertas detectan el evento, pero no muestran quien sufrira el impacto real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conviene automatizar todo el rollout?
&lt;/h2&gt;

&lt;p&gt;Solo cuando ya entiendes el patron de fallo. Automatizar un proceso confuso hace que el error viaje mas rapido, y eso no ayuda mucho la verdad.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Terraform: drift de IAM con contexto util</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Wed, 19 Aug 2026 08:24:27 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/terraform-drift-de-iam-con-contexto-util-4aj7</link>
      <guid>https://dev.to/alexcarteruk/terraform-drift-de-iam-con-contexto-util-4aj7</guid>
      <description>&lt;p&gt;El drift de IAM rara vez empieza como un gran incidente. Normalmente aparece como una duda pequena: un permiso que ya no coincide, un rol que alguien toco desde consola, o una politica que sigue viva aunque el modulo diga otra cosa. Cuando esa diferencia se descubre tarde, el equipo pierde tiempo discutiendo si el cambio fue legitimo, urgente o simplemente un parche que nadie documento.&lt;/p&gt;

&lt;p&gt;En equipos de plataforma esto pasa mas de lo que gusta admitir. Terraform dice una cosa, AWS muestra otra, y la alerta llega sin pista de blast radius, sin actor probable y sin una referencia clara al ultimo plan aprobado. Ahi es donde conviene tratar el drift como una senal operativa, no solo como una diferencia tecnica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que el drift de IAM casi siempre llega sin contexto
&lt;/h2&gt;

&lt;p&gt;La mayoria de alertas de drift fallan por el mismo motivo: detectan diferencia, pero no explican impacto.&lt;/p&gt;

&lt;p&gt;He visto mensajes que solo dicen "drift detected in prod" y ya. Eso obliga al on-call a reconstruir todo a mano:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;que recurso cambio&lt;/li&gt;
&lt;li&gt;si el cambio amplio permisos o los recorto&lt;/li&gt;
&lt;li&gt;si fue una edicion manual o una automatizacion rara&lt;/li&gt;
&lt;li&gt;si el siguiente &lt;code&gt;terraform apply&lt;/code&gt; corregira el estado o rompera algo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esa falta de contexto se parece mucho a otros problemas de observabilidad. En &lt;a href="https://dev.to/alexcarteruk/kubernetes-alertas-de-rollback-con-contexto-real-2em2"&gt;contratos minimos para alertas de produccion&lt;/a&gt;, la idea clave era la misma: una alerta util no solo avisa, tambien orienta la primera decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las tres preguntas que una alerta debe responder
&lt;/h2&gt;

&lt;p&gt;Cuando preparo revisiones de drift para IAM, intento que la alerta responda estas tres preguntas en el primer minuto:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Que permiso o relacion de confianza cambio exactamente.&lt;/li&gt;
&lt;li&gt;Quien o que sistema hizo el cambio mas probable.&lt;/li&gt;
&lt;li&gt;Que riesgo trae esperar hasta la siguiente ventana de apply.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si no puedes responder esas tres, la alerta todavia esta verde. No importa si el detector sea elegante.&lt;/p&gt;

&lt;p&gt;Un ejemplo simple de contexto que si ayuda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;role&lt;/code&gt;: &lt;code&gt;payments-api-prod&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;drift&lt;/code&gt;: politica inline agregada fuera de Terraform&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scope&lt;/code&gt;: acceso adicional a &lt;code&gt;s3:GetObject&lt;/code&gt; sobre un bucket sensible&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;last_apply&lt;/code&gt;: hace 2 dias&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;owner&lt;/code&gt;: modulo &lt;code&gt;iam/payments-service&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;recommended_action&lt;/code&gt;: revisar CloudTrail y congelar apply automatico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con eso, la conversacion cambia bastante. Ya no es "hay drift", sino "hay drift en un rol sensible y si aplicamos ahora vamos a borrar o sobreescribir algo que todavia no entendimos". Parece un matiz chico, pero cambia mucho la calidad de la respuesta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un flujo pequeno para revisar drift sin frenar al equipo
&lt;/h2&gt;

&lt;p&gt;Este flujo me ha funcionado bien cuando quiero rapidez sin improvisar demasiado:&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; &lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;drift.tfplan
terraform show &lt;span class="nt"&gt;-json&lt;/span&gt; drift.tfplan &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; drift.json
jq &lt;span class="s1"&gt;'.resource_changes[] | select(.change.actions == ["update"]) | {address, before: .change.before, after: .change.after}'&lt;/span&gt; drift.json
aws cloudtrail lookup-events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lookup-attributes&lt;/span&gt; &lt;span class="nv"&gt;AttributeKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ResourceName,AttributeValue&lt;span class="o"&gt;=&lt;/span&gt;payments-api-prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo importante no es correr mas comandos. Lo importante es mirar primero el tipo de diferencia. No todo drift en IAM merece el mismo tono:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cambios en &lt;code&gt;assume_role_policy&lt;/code&gt; suelen pedir mas cuidado&lt;/li&gt;
&lt;li&gt;permisos ampliados sobre datos o secretos suben prioridad rapido&lt;/li&gt;
&lt;li&gt;tags o descripciones raramente justifican una escalada urgente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A veces tambien conviene pausar un pipeline si esta por aplicar automaticamente. He visto equipos corregir demasiado pronto y perder evidencia sobre quien hizo el cambio original. Luego toca adivinar, y adivinar en seguridad cloud sale caro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde entran los correos de aprobacion
&lt;/h2&gt;

&lt;p&gt;Muchos flujos de cambio sensible dependen de un correo de aprobacion o de una notificacion paralela. Esa parte no deberia liderar la investigacion, pero si puede sostenerla. Para probar ese paso sin mezclar bandejas reales, un servicio de &lt;a href="https://tempmailso.com" rel="noopener noreferrer"&gt;correo temporal desechable&lt;/a&gt; puede servir en entornos de QA o automatizacion. El truco es no confundir esa prueba con la fuente de verdad del drift.&lt;/p&gt;

&lt;p&gt;Tambien ayuda separar bien el ruido de entrega. Si una aprobacion no llega, primero reviso el evento del cambio y luego el canal de correo. Esa disciplina se parece a &lt;a href="https://dev.to/silviutech/fastapi-depura-reintentos-de-correo-sin-ruido-285l"&gt;aislar ruido cuando una senal depende del email&lt;/a&gt;: cada capa necesita su propia evidencia, o todo termina mezclado.&lt;/p&gt;

&lt;p&gt;En varios equipos aun veo parches con un dummy e mail o un tem email para destrabar pruebas rapidas. Sirve cinco minutos, pero despues nadie sabe si fallo la aprobacion, la regla SMTP o el propio pipeline. Es mejor dejar ese atajo para pruebas bien delimitadas, no para cambios sensibles en prod.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist antes de aplicar o revertir
&lt;/h2&gt;

&lt;p&gt;Antes de decidir &lt;code&gt;apply&lt;/code&gt;, revertir o congelar, reviso esta lista:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;el recurso afectado esta etiquetado como critico o sensible&lt;/li&gt;
&lt;li&gt;el cambio amplia permisos, relaciones de confianza o acceso transversal&lt;/li&gt;
&lt;li&gt;existe evidencia de CloudTrail para el actor o proceso que lo hizo&lt;/li&gt;
&lt;li&gt;el ultimo plan aprobado sigue siendo valido con el contexto actual&lt;/li&gt;
&lt;li&gt;el equipo sabe si el drift fue intencional, temporal o accidental&lt;/li&gt;
&lt;li&gt;hay una nota corta para el siguiente turno, aunque sea fea pero clara&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese ultimo punto parece menor, pero evita muchos errores tontos. En guardias largas, una nota medio imperfecta ayuda mas que una memoria heroica. Si el contexto queda escrito, el siguiente ingeniero entra mejor parado y no repite el mismo analisis de cero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q&amp;amp;A
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Conviene corregir todo drift de IAM de inmediato?
&lt;/h2&gt;

&lt;p&gt;No siempre. Si el drift toca permisos sensibles, la prioridad puede ser congelar cambios y entender el origen antes de aplicar. Corregir rapido pero a ciegas aveces empeora la situacion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que dato falta mas seguido?
&lt;/h2&gt;

&lt;p&gt;El impacto esperado del siguiente &lt;code&gt;terraform apply&lt;/code&gt;. Saber que hay drift ayuda, pero saber si el apply borrara, ampliara o restaurara permisos ayuda mucho mas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Esto reemplaza una revision de seguridad?
&lt;/h2&gt;

&lt;p&gt;No. Esto ordena la primera respuesta. La revision de seguridad sigue siendo necesaria cuando el drift afecta acceso real a datos, secretos o identidades compartidas.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>security</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>SRE: runbooks utiles para caidas parciales</title>
      <dc:creator>Alex Carter</dc:creator>
      <pubDate>Tue, 18 Aug 2026 14:24:25 +0000</pubDate>
      <link>https://dev.to/alexcarteruk/sre-runbooks-utiles-para-caidas-parciales-37km</link>
      <guid>https://dev.to/alexcarteruk/sre-runbooks-utiles-para-caidas-parciales-37km</guid>
      <description>&lt;p&gt;Las caidas parciales son de las incidencias que mas tiempo roban en guardia. No tumban todo, asi que nadie entra en modo panico total, pero si rompen suficiente como para llenar Slack, dashboards y tickets a la vez. En equipos SRE esto pasa un monton: una region responde lento, un worker consume mensajes con atraso, o una dependencia externa empieza a fallar solo en ciertos caminos.&lt;/p&gt;

&lt;p&gt;Con los años me sirvio una idea simple: el runbook para una degradacion parcial no debe listar veinte comandos. Debe ayudar a decidir rapido si el problema es capacidad, dependencia, despliegue, red o datos. Cuando el documento falla en eso, la guardia se vuelve lenta y cada persona investiga un universo distinto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que una caida parcial confunde mas que una total
&lt;/h2&gt;

&lt;p&gt;Cuando todo cae, el objetivo es obvio. Cuando cae solo una parte, los sintomas se pelean entre si:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El uptime general sigue "verde".&lt;/li&gt;
&lt;li&gt;Solo un porcentaje de usuarios ve errores.&lt;/li&gt;
&lt;li&gt;Los logs muestran ruido, pero no una firma unica.&lt;/li&gt;
&lt;li&gt;La gente empieza a asumir causas demasiado pronto.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Segun el libro &lt;em&gt;Site Reliability Engineering&lt;/em&gt; de Google, la claridad operacional y la reduccion del toil son parte central del trabajo SRE, no un lujo documental (&lt;a href="https://sre.google/sre-book/table-of-contents/" rel="noopener noreferrer"&gt;Google SRE Book&lt;/a&gt;). En incidentes parciales eso se nota enseguida: si tu primer documento no reduce incertidumbre, ya vas tarde.&lt;/p&gt;

&lt;p&gt;Tambien he visto que los equipos mezclan evidencia de producto, pruebas y experimentos internos. Ese desorden se parece mucho a &lt;a href="https://dev.to/silviutech/llms-aprobar-correos-sin-mezclar-corridas-4ei"&gt;evitar mezclar corridas cuando el flujo se complica&lt;/a&gt;: si no separas contexto desde el inicio, cada dato parece sospechoso y el triage se pone mas lento.&lt;/p&gt;

&lt;h2&gt;
  
  
  El runbook que me ha funcionado en guardias reales
&lt;/h2&gt;

&lt;p&gt;Mi version favorita cabe en una pantalla y sigue cinco preguntas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Que superficie esta degradada exactamente.&lt;/li&gt;
&lt;li&gt;Desde cuando ocurre y que cambio coincide.&lt;/li&gt;
&lt;li&gt;Si el impacto depende de region, tenant o tipo de trafico.&lt;/li&gt;
&lt;li&gt;Que metrica decide si vamos mejorando.&lt;/li&gt;
&lt;li&gt;Cual es la accion segura de menor costo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ese orden importa. Mucha gente abre primero los logs de aplicacion, pero en varias guardias lo mas util fue empezar por diffs de despliegue, errores por zona y una metrica de saturacion. No suena heroico, pero evita perder media hora persiguiendo sintomas secundarios.&lt;/p&gt;

&lt;p&gt;Un runbook base podria verse asi:&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="c"&gt;# 1. Confirmar alcance&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;-o&lt;/span&gt; wide
kubectl top pods &lt;span class="nt"&gt;-n&lt;/span&gt; payments

&lt;span class="c"&gt;# 2. Revisar eventos recientes&lt;/span&gt;
kubectl get events &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.lastTimestamp | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20

&lt;span class="c"&gt;# 3. Comparar despliegue actual vs anterior&lt;/span&gt;
kubectl rollout &lt;span class="nb"&gt;history &lt;/span&gt;deploy/payments-api &lt;span class="nt"&gt;-n&lt;/span&gt; payments

&lt;span class="c"&gt;# 4. Ver errores por region o tenant en observabilidad&lt;/span&gt;
&lt;span class="c"&gt;# aqui entra tu consulta en Grafana, Datadog o CloudWatch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No es magico, claro. Lo util es que obliga a mirar estado, cambio y alcance antes de tocar cosas. Esa pausa de dos minutos evita decisiones medio apresuradas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que evidencia reunir antes de tocar nada
&lt;/h2&gt;

&lt;p&gt;Si el runbook no define evidencia minima, cada persona captura algo distinto. Yo intento pedir siempre estas piezas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Una metrica principal de impacto.&lt;/li&gt;
&lt;li&gt;El ultimo cambio conocido en la ventana del incidente.&lt;/li&gt;
&lt;li&gt;Una lista corta de componentes sanos y degradados.&lt;/li&gt;
&lt;li&gt;Un ejemplo concreto de request fallida con timestamp.&lt;/li&gt;
&lt;li&gt;Un criterio de rollback o mitigacion.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Parece basico, pero no siempre esta escrito. Y cuando no esta, el canal del incidente se llena de "creo que" o "parece que". Eso desgasta bastante. Tambien ayuda mucho &lt;a href="https://dev.to/silviutech/react-signup-accesible-para-pruebas-reales-4ijd"&gt;hacer pruebas reales sin perder claridad operativa&lt;/a&gt;: si distingues trafico de prueba, seeds raros y notas como temp mailid desde el principio, quitas ruido que luego parece señal util aunque no lo sea.&lt;/p&gt;

&lt;p&gt;En AWS, por ejemplo, un cambio de seguridad en una cola o un timeout mas agresivo entre servicios puede dejar solo una franja de requests en mal estado. Ahí conviene mirar dependencia por dependencia y no asumir que "cloud esta fallando". Dicho asi suena obvio, pero en una guardia cansada no siempre lo es.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como escribir alertas que ayudan de verdad
&lt;/h2&gt;

&lt;p&gt;Una alerta buena no intenta contar toda la historia. Solo debe entregar contexto suficiente para que la primera persona no empiece desde cero.&lt;/p&gt;

&lt;p&gt;Yo suelo revisar estas cuatro partes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sintoma observable: &lt;code&gt;5xx en checkout suben al 8%&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Alcance: &lt;code&gt;principalmente tenant enterprise en eu-west&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cambio cercano: &lt;code&gt;deploy 2026.08.18-3 hace 11 min&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Siguiente paso: &lt;code&gt;comparar latencia de Redis y rollout actual&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eso le gana por mucho a una alerta generica de "high error rate". El informe de PagerDuty sobre incident response ha repetido varios años que la velocidad inicial depende bastante del contexto util, no solo de detectar mas rapido (&lt;a href="https://www.pagerduty.com/resources/learn/incident-response-report/" rel="noopener noreferrer"&gt;PagerDuty Incident Response Report&lt;/a&gt;). No hace falta memorizar el PDF completo; basta entender que una alerta muda obliga al humano a reconstruir el escenario desde cero.&lt;/p&gt;

&lt;p&gt;Tambien me gusta dejar un mini checklist al final del runbook:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirmar si el impacto sigue creciendo.&lt;/li&gt;
&lt;li&gt;Verificar cambio mas cercano al inicio del fallo.&lt;/li&gt;
&lt;li&gt;Aislar componente comun entre requests rotas.&lt;/li&gt;
&lt;li&gt;Elegir mitigacion reversible primero.&lt;/li&gt;
&lt;li&gt;Registrar que señal confirma mejora.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Es una tonteria pequeña, pero funciona. En guardia nocturna el cerebro agradece esos pasos medio obvios.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Un runbook parcial debe ser muy detallado?
&lt;/h3&gt;

&lt;p&gt;No necesariamente. Debe ser especifico en decisiones, no largo por deporte. Si ocupa tres pantallas y aun asi no deja claro que mirar primero, esta flojito.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conviene ligar el runbook a una sola herramienta?
&lt;/h3&gt;

&lt;p&gt;Mejor no. Puedes poner ejemplos en Grafana o CloudWatch, pero el valor real esta en la secuencia mental: alcance, cambio, evidencia, mitigacion. Esa parte deberia sobrevivir aunque cambie la herramienta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Esto sirve solo para Kubernetes?
&lt;/h3&gt;

&lt;p&gt;No. Kubernetes aparece mucho en SRE, pero la idea funciona igual para colas, bases de datos, workers o integraciones externas. Lo importante es evitar que cada guardia reescriba el metodo sobre la marcha.&lt;/p&gt;

&lt;p&gt;Si hoy tus incidentes parciales duran demasiado, yo empezaria por rehacer dos runbooks clave con esta estructura. No arregla la plataforma por si sola, obvio, pero baja friccion, mejora el diagnostico y le da al equipo una base comun para responder mejor.&lt;/p&gt;

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