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:
1 parent
208d307e5a
commit
200a56de05
1 file changed
+31
@@ -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() {
|
||||||
|
|||||||
Reference in new issue
Block a user