fix(k3s): ajustar MTU de flannel.1 a 1400 para eliminar blackhole PMTUD cross-node

Confirmado empiricamente: el limite real esta entre payload interno 1420
(OK) y 1450 (100% perdida sin ICMP, blackhole real). k3s no expone
--flannel-mtu en esta version, asi que se aplica en vivo sobre la interfaz
de cada nodo (no persiste en config, se reaplica en cada start/create).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_011FqYP3Wf1W63Qmh7qgXAAT
This commit is contained in:
devopsandClaude Sonnet 5 committed 2026-08-16 23:00:37 -05:00
1 parent 208d307e5a
commit 200a56de05
1 file changed
+31
+31
View File
@@ -432,6 +432,7 @@ create_cluster() {
log "Creando clúster ${CLUSTER_NAME} con IPAM estático" log "Creando clúster ${CLUSTER_NAME} con IPAM estático"
docker pull "$K3S_IMAGE" docker pull "$K3S_IMAGE"
k3d cluster create --config "$CONFIG_FILE" k3d cluster create --config "$CONFIG_FILE"
fix_flannel_mtu
} }
start_cluster() { start_cluster() {
@@ -440,6 +441,36 @@ start_cluster() {
"$CLUSTER_NAME" \ "$CLUSTER_NAME" \
--wait \ --wait \
--timeout "${AUTOSTART_K3D_START_TIMEOUT}s" --timeout "${AUTOSTART_K3D_START_TIMEOUT}s"
fix_flannel_mtu
}
# Workaround para el blackhole de red cross-node por MTU/PMTUD (ver
# docs/known-issues.md en apps-registry). k3s embebe flannel sin exponer un
# flag --flannel-mtu (confirmado con `k3s server --help`, no existe en esta
# version), asi que el unico punto de ajuste es la interfaz flannel.1 en
# vivo dentro de cada contenedor de nodo -- no persiste en ningun archivo de
# config, hay que reaplicarlo cada vez que el cluster arranca (creacion
# nueva o start de uno existente). Confirmado empiricamente 2026-08-16: el
# blackhole real esta entre payload interno 1420 (OK) y 1450 (100% perdida,
# sin ICMP), asi que 1400 queda con margen seguro.
fix_flannel_mtu() {
local node mtu_target=1400 tries iface_ready
log "Ajustando MTU de flannel.1 a ${mtu_target} en los nodos de ${CLUSTER_NAME} (fix blackhole MTU/PMTUD)"
for node in $(docker ps --filter "label=k3d.cluster=${CLUSTER_NAME}" --format '{{.Names}}'); do
iface_ready=false
for tries in 1 2 3 4 5 6 7 8 9 10; do
if docker exec "$node" ip link show flannel.1 >/dev/null 2>&1; then
iface_ready=true
break
fi
sleep 2
done
if [[ "$iface_ready" != true ]]; then
log "ADVERTENCIA: ${node} no tiene interfaz flannel.1 tras esperar, se omite (¿nodo sin CNI listo?)"
continue
fi
docker exec "$node" ip link set flannel.1 mtu "$mtu_target"
done
} }
cluster_api_ready() { cluster_api_ready() {