Saltar al contenido
NyverraNyverra
⌘K
InicioArtículosSitio institucional
🇪🇸
Nyverra

Canal editorial

Artículos sobre tecnología, operaciones y partners — infraestructura, monitorización y entornos críticos.

Redes sociales

Explorar

  • Inicio
  • Artículos
  • Categorías
  • Etiquetas
  • Autores
  • Sobre
  • Contacto
  • RSS
  • Sitio institucional

Nyverra

  • Nuestros servicios
  • Casos de éxito
  • Socios

Contacto

Correo[email protected]WhatsApp(62) 99309-1592Portal del clienteITSM · tickets y SLA

Rua RB 18, S/N — Casa 01, Sala 01 · Residencial Buriti · Senador Canedo – GO, Brasil · CEP 75260-459

Horario: lun–vie, 08–18 h

© 2026 Nyverra. Todos los derechos reservados.

CNPJ: 61.571.209/0001-08 · Registro estatal: 20.291.265-5 · D-U-N-S®: 57-323-5796

blog.nyverra.com.br

Términos de usoPrivacidadCookies
Volver arriba

Este es el primer postmortem del curso. No es un relato de héroes: es el registro de una prueba de carga que se salió de control y de lo que aprendí al arreglarlo.

\n

Resumen

\n

Durante un ensayo de capacidad en el clúster de homologación, subí el HPA del backend a 10 réplicas y disparé una rampa de 50 usuarios autenticados. La prueba no devolvió errores HTTP, pero la latencia p95 fue de 8,4 segundos. Minutos después, el primario de PostgreSQL perdió los probes de liveness y CloudNativePG inició un failover. El antiguo primario quedó atascado en el apagado y tuve que eliminarlo para que el clúster promoviera la réplica.

\n

No se perdió ningún dato. El servicio siguió respondiendo a través de los pods antiguos durante la mayor parte del incidente. Pero el susto fue grande — y las lecciones, valiosas.

\n

Línea de tiempo (resumida)

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
HoraEvento
T+0HPA ajustado a maxReplicas: 10; comienza la prueba de 50 VUs autenticados
T+1 minLos workers alcanzan 92% y 82% de memoria
T+2 minEl backend escala a 10 pods; p95 sube a 8,4 s
T+3 minLos probes de Postgres comienzan a fallar por timeout
T+5 minCNPG inicia failover; el primario antiguo entra en shutdown
T+8 minEl primario antiguo no termina el shutdown; el clúster queda Failing over
T+10 minElimino el pod del primario antiguo; CNPG promueve la réplica
T+12 minClúster healthy; HPA reducido a 6; la latencia se normaliza
\n

Causa raíz

\n

No fue “Kubernetes”. Fue una combinación de decisiones:

\n
    \n
  1. HPA sin presupuesto de memoria. El límite de 10 pods se definió pensando en CPU, pero cada pod de backend usaba ~1,2–1,3 GiB. En workers de 8 GiB, 10 pods competían con la base de datos, Elasticsearch, MinIO y RabbitMQ.
  2. \n
  3. Presión de memoria en los nodos. Con un 92% de uso, el kubelet y los probes empiezan a sufrir. Postgres no fue eliminado por OOM, pero los probes de liveness/readiness comenzaron a agotar el timeout.
  4. \n
  5. Probe agresivo en una base de datos bajo carga. El liveness de CNPG usa el instance manager; bajo contención de CPU/red, el timeout de 25 s fue suficiente para marcar al primario como enfermo.
  6. \n
  7. Failover sin plan de fencing. El primario antiguo no terminó el shutdown; el clúster quedó en Failing over hasta la eliminación manual del pod.
  8. \n
\n

Lo que funcionó

\n
    \n
  • CNPG promovió la réplica correctamente tan pronto como el primario antiguo salió.
  • \n
  • El backend siguió sirviendo con los pods antiguos; no hubo caída total.
  • \n
  • El PDB de Postgres impidió desalojos accidentales antes de tiempo (y después demostró por qué existe).
  • \n
  • El runbook de failover se escribió a partir del incidente y quedó en el repositorio.
  • \n
\n

Lo que no funcionó

\n
    \n
  • Ajustar el HPA solo por CPU, ignorando la memoria por pod.
  • \n
  • Ejecutar carga autenticada sin mirar kubectl top nodes cada minuto.
  • \n
  • Probar a través del NodePort directo: el rate limit vio la IP de NAT (10.244.1.0) y generó 429, enmascarando el resultado real. A través del ingress, la misma prueba tuvo 0% de error.
  • \n
  • Dejar el HPA al máximo durante el failover, presionando aún más los nodos.
  • \n
\n

Acciones tomadas

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
AcciónResultado
HPA reducido a maxReplicas: 6Estabilidad inmediata
Workers ampliados a 16 GiBMargen para 8–10 pods con datos
Prueba rehecha a través del ingress0% de error, p95 83,9 ms en 50 VUs
Runbook de failover CNPGProcedimiento documentado
Plan de capacidadHPA máximo según presupuesto de memoria, no solo CPU
\n

Lecciones

\n
    \n
  1. HPA es una decisión de capacidad, no un número mágico. Calcula memoria por pod × réplicas × nodos.
  2. \n
  3. PDB protege, pero no salva de la falta de recursos. Evita desalojos; no impide que el nodo se quede sin memoria.
  4. \n
  5. El probe de base de datos es sensible a la contención. Ajusta el timeout y failureThreshold con datos reales.
  6. \n
  7. El failover necesita fencing. Si el primario antiguo no muere, el clúster no promueve la réplica por sí solo.
  8. \n
  9. Prueba por el camino real. NodePort directo no representa el tráfico del ingress.
  10. \n
  11. Postmortem sin culpa. El objetivo es corregir el sistema, no a la persona que apretó el botón.
  12. \n
\n

Checklist para tu clúster

\n
    \n
  • [ ] Sé cuánta memoria usa cada réplica del backend.
  • \n
  • [ ] El HPA tiene maxReplicas compatible con la memoria de los workers.
  • \n
  • [ ] Postgres tiene PDB y anti-affinity.
  • \n
  • [ ] Sé qué hacer si el primario antiguo no termina el shutdown.
  • \n
  • [ ] Pruebo la carga a través del ingress, no a través del NodePort.
  • \n
  • [ ] Tengo runbook de failover y restore.
  • \n
\n

Próximo

\n

En el capítulo 05 vamos a montar el control plane en HA — y a entender por qué el etcd con quórum es la diferencia entre “alta disponibilidad” y “tres máquinas que se caen juntas”.

\n

Próximo: Curso Kubernetes 05 — HA: 3 masters, VIP y etcd

Compartir

Seguir leyendo

Lea también

  • Manual LSI / Broadcom MegaRAID — MegaCli y StorCLI
    Tutoriais

    Manual LSI / Broadcom MegaRAID — MegaCli y StorCLI

    Con esta guía, su equipo gana autonomía para diagnosticar rebuilds, resolver foreign configurations, gestionar BBU y CacheCade — con escenarios reales de producción documentados.

    31 de outubro de 202620 min de leitura
  • Nginx Cheatsheet

    Nginx Cheatsheet

    Guía de bolsillo con ejemplos listos para configurar Nginx en producción: desde instalación y virtual hosts hasta ajuste de rendimiento y resolución de problemas.

    31 de outubro de 202612 min de leitura
  • Curso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa
    Kubernetes

    Curso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa

    Qué prometer, cómo medir y qué hacer cuando el error se dispara: SLI, SLO, presupuesto de error, alertas que despiertan a alguien y postmortem sin caza de brujas.

    31 de outubro de 20265 min de leitura

Comentarios

Aún sin comentarios

Sea el primero en compartir su opinión sobre este artículo.

Deje un comentario

Newsletter

Reciba nuevos artículos

Suscríbase para recibir publicaciones del blog Nyverra en su correo. Enviaremos un enlace de confirmación.

​
  1. Inicio
  2. Kubernetes
  3. Postmortem: El failover de Postgres que me enseñó qué es PDB
Kubernetes
#Curso Kubernetes#Kubernetes#SRE

Postmortem: El failover de Postgres que me enseñó qué es PDB

Wedson LopesWedson Lopes
31 de outubro de 20265 min de leitura