Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a83ed61b9 | ||
|
|
987ef04b0d | ||
|
|
f4ad14028e | ||
|
|
025f16a17b | ||
|
|
a90c0a75a2 |
@@ -9,7 +9,7 @@ spec:
|
||||
project: default
|
||||
|
||||
source:
|
||||
repoURL: http://gitea.cruzcloud.net/devops/apps-registry.git
|
||||
repoURL: https://gitea.cruzcloud.net/devops/apps-registry.git
|
||||
targetRevision: main
|
||||
path: workloads/ecommerce
|
||||
kustomize: {}
|
||||
|
||||
@@ -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).
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user