Compare commits

..
Author SHA1 Message Date
devops f25b10a2f9 Merge pull request 'fix(medusa): forzar podAffinity con commerce-postgres para evitar blackhole MTU cross-node' (#3) from fix/medusa-postgres-node-affinity into main 2026-08-09 07:36:33 +00:00
devops 7a83ed61b9 fix(medusa): forzar podAffinity con commerce-postgres para evitar blackhole MTU cross-node
Diagnostico: pg_isready y el cliente pg de Medusa fallan de forma
consistente (100%, 186/186 intentos) cuando el pod queda agendado en un
nodo distinto al de commerce-postgres-0. TCP handshake (nc/ping) funciona
cruzando nodos, pero el primer paquete de datos real de la sesion nunca
llega - blackhole de PMTU Discovery entre los nodos del cluster k3d
(flannel VXLAN / MTU del bridge Docker subyacente).

Se agrega podAffinity requiredDuringSchedulingIgnoredDuringExecution
(no nodeSelector fijo, mantiene portabilidad) para que medusa-deploy
siempre comparta nodo con commerce-postgres-0 y evite cruzar el
blackhole. Es un workaround, no el fix de raiz: documentado en
docs/known-issues.md junto con el TODO de ajustar el MTU del cluster
a 1400.
2026-08-09 02:34:15 -05:00
devops 987ef04b0d Merge pull request 'fix(medusa): agregar initContainer wait-for-postgres para evitar CrashLoopBackOff por fallo transitorio de red en arranque' (#2) from fix/medusa-wait-for-postgres into main 2026-08-09 06:42:39 +00:00
devops f4ad14028e fix(medusa): agregar initContainer wait-for-postgres para evitar CrashLoopBackOff por fallo transitorio de red en arranque 2026-08-09 01:29:43 -05:00
devops 025f16a17b Merge pull request 'fix(gitops): unificar repoURL a https en ecommerce-app' (#1) from fix/repo-url-consistency into main 2026-08-09 05:52:14 +00:00
2 changed files with 74 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# Known issues
## Blackhole de red cross-node en el cluster k3d (MTU/PMTUD, flannel VXLAN)
**Estado:** workaround aplicado, fix definitivo pendiente.
**Síntoma:** cualquier pod que necesite hablar con `commerce-postgres-0`
(StatefulSet, sin réplicas, fijo a un nodo) falla de forma consistente y
reproducible al 100% cuando queda agendado en un nodo **distinto** al de
Postgres. El handshake TCP (SYN/ACK, `nc`, `ping`) funciona perfecto entre
nodos, pero el primer paquete de datos real de la sesión (protocolo Postgres,
`pg_isready` incluido) nunca llega — se cuelga hasta hacer timeout.
**Diagnóstico:**
- Confirmado aislando el nodo con `nodeName` en pods de prueba: 100% de
fallos (186/186 intentos) agendando cross-node (`agent-0` → Postgres en
`server-0`); 100% de éxito agendando en el mismo nodo.
- MTU dentro de los pods (interfaz `flannel.1`/VXLAN) es 1450 en ambos nodos
— consistente, no es un mismatch obvio a nivel flannel.
- `ping` sin `-M do` (permite fragmentación) no muestra pérdida de paquetes
hasta payloads de 2000 bytes entre los contenedores Docker de los nodos.
- Encaja con un blackhole de PMTU Discovery: el bridge Docker externo que
conecta los contenedores de los nodos k3d probablemente tiene un MTU real
menor a 1500, y los paquetes TCP con el bit DF puesto (como los de la
sesión de Postgres) se pierden en vez de fragmentarse o generar el ICMP
"fragmentation needed" que permitiría el ajuste automático.
**Workaround temporal (aplicado en `workloads/ecommerce/commerce/medusa.yaml`):**
`podAffinity` con `requiredDuringSchedulingIgnoredDuringExecution` sobre
`medusa-deploy`, forzando que sus pods se agenden siempre en el mismo nodo
que `commerce-postgres-0` (`matchLabels: app: commerce-postgres`,
`topologyKey: kubernetes.io/hostname`). Esto evita el tráfico cross-node
entre Medusa y Postgres, pero no resuelve el problema de fondo — cualquier
otro workload que necesite cruzar nodos para hablar con Postgres (u otro
servicio) puede pisar el mismo blackhole.
**TODO — fix definitivo pendiente:**
Ajustar el MTU del cluster k3d a un valor seguro (`1400`) de forma
consistente en la red Docker del cluster y en flannel, para eliminar el
blackhole de raíz y poder quitar el `podAffinity` (o dejarlo como
optimización, no como requisito de disponibilidad).
+30
View File
@@ -20,7 +20,37 @@ spec:
imagePullSecrets:
- name: gitea-registry-secret
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: commerce-postgres
topologyKey: kubernetes.io/hostname
initContainers:
- name: wait-for-postgres
image: postgres:17-alpine
imagePullPolicy: IfNotPresent
command:
- sh
- -c
- |
until pg_isready -d "$DATABASE_URL" -t 5; do
echo "postgres no disponible aun, reintentando..."
sleep 2
done
envFrom:
- secretRef:
name: commerce-secrets
resources:
requests:
cpu: 25m
memory: 32Mi
limits:
cpu: 100m
memory: 64Mi
- name: migrations
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.85
imagePullPolicy: IfNotPresent