fix(forgejo): match every DinD bridge MTU to its node's pod network #789
No reviewers
Labels
No labels
burndown-2026-06
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure!789
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/dind-mtu"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #783. The root cause behind the pre-commit and dependency-fetch failures, measured on both nodes.
The defect
Every job container launched through a runner
s DinD daemon got a bridge at MTU 1500, while the pod network underneath is smaller. Any reply larger than the pod MTU was dropped. A TLS ClientHello fits, the servers certificate response does not, which is exactly the "connects then stalls" symptomdocs/forgejo-runner-egress-proxy.mdwas written about.No runner manifest passed
--mtu, so every daemon took Docker`s 1500 default regardless of the network it landed on.Evidence, per node
kai-server - Tailscale-derived, 270 bytes of overshoot:
ser8 - plain flannel VXLAN, 50 bytes of overshoot:
Change
s four DinD daemons take--mtu=1230`: general, build, deploy, publisher.s four kustomizations take--mtu=1450`.tap-writerhas no DinD and is untouched.Why the value is per node, not one constant
kai-server sits behind Tailscale and ser8 does not, so their pod networks differ by 220 bytes. Applying kai-server`s 1230 to ser8 would have worked while quietly costing throughput on every job there, and reading either number off the other node is not evidence. Both were measured directly.
The first revision of this PR deliberately left ser8 alone because
ssh ser8was refused. That was the wrong username, not a policy boundary - ser8s account iscoilysiren`. Measured and fixed.What this should make redundant
If this holds, the egress proxy stops being load-bearing for ordinary dependency fetches, and the per-repo proxy wrappers in
#782andcoilyco-bridge/deploy#366become optional rather than necessary. Both are cheap and harmless to keep, and they cover the window before these runners roll.Verification after rollout
docker -H tcp://<runner-pod-ip>:2375 network inspect bridgereports the node`s value on each runner, and a large HTTPS fetch from a DinD-launched container completes without the proxy.This is a pod-template change on both nodes, so it rolls every runner and kills any in-flight job. Worth a quiet moment.
🤖 Generated with Claude Code
Every job container launched through a runner's DinD daemon got a bridge at MTU 1500 while the pod network underneath runs at 1230, so any reply larger than 1230 bytes was dropped. A TLS ClientHello fits and the server's certificate response does not, which is the "connects then stalls" failure the egress proxy was built to route around. Measured on kai-server: enp1s0 mtu 1500 physical NIC cni0 mtu 1230 pod network veth* mtu 1230 every pod interface docker0 mtu 1500 host docker bridge docker -H tcp://10.42.0.29:2375 network inspect bridge "com.docker.network.driver.mtu": "1500" No runner manifest passed --mtu, so each daemon took Docker's default regardless of the network it landed on. The four kai-server runners now pass --mtu=1230. The ser8 runners are left alone: that node denies SSH under the current tailnet policy, so its pod-network MTU is unmeasured, and a value derived from kai-server is not evidence about ser8. Closes #783 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Kai Siren <coilysiren@gmail.com> Co-authored-by: Claude <noreply@anthropic.com>ser8 has the same defect with a different number. Its pod network is plain flannel VXLAN at 1450, where kai-server sits at 1230 behind Tailscale, and both DinD daemons built bridges at Docker's 1500 default. Measured on ser8: enp1s0 mtu 1500 flannel.1 mtu 1450 cni0 mtu 1450 docker0 mtu 1500 docker -H tcp://10.42.0.167:2375 network inspect bridge com.docker.network.driver.mtu = 1500 The four ser8 kustomizations now pass --mtu=1450. The gap there is 50 bytes rather than kai-server's 270, so the same class of failure with a narrower trigger. This is why the value is per node rather than one constant: applying kai-server's 1230 here would have worked while quietly costing throughput on every job, and reading either number off the other node is not evidence. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Kai Siren <coilysiren@gmail.com> Co-authored-by: Claude <noreply@anthropic.com>fix(forgejo): match the DinD bridge MTU to the pod networkto fix(forgejo): match every DinD bridge MTU to its node's pod network