revert(k3s): drop the traefik hostNetwork bypass, keep the #910 parity fix #947
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
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/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure!947
Loading…
Reference in a new issue
No description provided.
Delete branch "revert/traefik-hostnetwork"
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?
Merge this promptly. Until it lands,
mainsays hostNetwork while the cluster says LoadBalancer, and the node's/var/lib/rancher/k3s/server/manifests/traefik-config.yamlstill holds the hostNetwork version. k3s re-applies that directory on restart, so a k3s or node restart would repeat the outage unattended.What happened
The hostNetwork/ClusterIP change from #941 took every public hostname down for ~25 minutes (roughly 04:14 to 04:40 UTC, 2026-08-26). Rolled back live by applying the previous HelmChartConfig; all six public surfaces and the
git-upload-packpath verified 200 afterwards, at or better than the pre-change baseline. Forgejo was untouched throughout, 0 restarts.Why it failed
The chart runs Traefik as UID 65532 with
allowPrivilegeEscalation: false. That setsNoNewPrivs, and NoNewPrivs makes the kernel ignore file capabilities, so theNET_BIND_SERVICEI added never became effective. Kubernetes has no ambient-capability support, so a pod spec alone cannot grant a workingCAP_NET_BIND_SERVICEto a non-root process.Neither
helm templatenor the server-side dry run could have caught this. Both validate the manifest. The failure is kernel behaviour visible only once the container starts. #941 presented the render as the verification, and that was wrong.The svclb ordering trap I predicted in #941 also fired:
FailedScheduling ... didn't have free portswhile svclb still held 80/443, then no path at all for external traffic once svclb was torn down and the replacement was still crash-looping.Why this is not
git revert e1db70ee1db70esquashed two changes. Reverting it wholesale would also undo the template parity fix and re-arm the #910 landmine, where an ordinaryansible-syncrewrites the config with the deadservice.loadBalancerIPkey and drops the public IP for every hostname.So this restores the template to the parity state and leaves it there. Net effect against the live cluster after merge and converge: no change, because parity is what is running.
Docs
The section in
docs/k3s-deploy-notes-manifests.mdis kept and rewritten to record what actually happened rather than what I predicted: the NoNewPrivs mechanism, the svclb port-ordering trap, the rollback that worked, and the note that a render is not proof of runtime behaviour. If someone retries this, the shape to try ishostPort: 80/443onto unprivileged container ports 8000/8443, or MetalLB, and to validate on a throwaway workload that actually binds the port first.After merge
The check diff should show the node's
traefik-config.yamlreturning to the parity content. That converge rewrites the file so a k3s restart is safe again. It should not restart Traefik in any user-visible way, since the resulting HelmChartConfig matches what is already live.