Skip to content

feat(grounds-geyser)!: drop the hostPort - #167

Merged
hbrombeer merged 1 commit into
mainfrom
feat/geyser-no-hostport
Aug 13, 2026
Merged

feat(grounds-geyser)!: drop the hostPort#167
hbrombeer merged 1 commit into
mainfrom
feat/geyser-no-hostport

Conversation

@hbrombeer

Copy link
Copy Markdown
Member

A Bedrock client still has to reach UDP 19132 on a node address — that has not changed, and 19132 sits outside the NodePort range so an ordinary Service cannot serve it. What changed is who provides it.

Binding the port here costs the whole namespace its PodSecurity level: baseline forbids hostPort, so one pod claiming it means enforcing privileged for everything alongside. That is a large price for one port, and it is what groundsgg/grounds-pulumi#434 had to pay.

The region's Pulumi stack owns a Service with externalIPs set to the node addresses instead (groundsgg/grounds-pulumi#438). Cilium runs with kube-proxy replacement and programs those, so UDP 19132 on any node address reaches these pods with no pod claiming a port on the host — and the namespace goes back to baseline.

Verified before writing this

A probe Service with externalIPs on 19133, selecting the same pods, answered a RakNet ping identically to the live hostPort on 19132:

19132 (hostPort, live):     PONG: Grounds Stage System | de-fra1
19133 (externalIPs probe):  PONG: Grounds Stage System | de-fra1

Breaking

bedrock.hostPort is gone and the chart no longer exposes the port by itself — a deployment needs the Service its region provides. Both bind 19132, so the two cannot overlap: expect a short Bedrock outage between this rolling out and the Pulumi side applying.

helm lint clean, kubeconform -strict 2/2 valid, and zero hostPort in the rendered output.

A Bedrock client still has to reach UDP 19132 on a node address — that has not
changed, and 19132 sits outside the NodePort range so an ordinary Service
cannot serve it. What changed is who provides it.

Binding the port here costs the whole namespace its PodSecurity level:
baseline forbids hostPort, so one pod claiming it means enforcing `privileged`
for everything alongside. That is a large price for one port.

The region's Pulumi stack owns a Service with `externalIPs` set to the node
addresses instead. Cilium runs with kube-proxy replacement and programs those,
so UDP 19132 on any node address reaches these pods with no pod claiming a
port on the host, and the namespace goes back to baseline.

Verified before writing this, not assumed: a probe Service with externalIPs on
19133 answered a RakNet ping identically to the live hostPort on 19132.

BREAKING CHANGE: bedrock.hostPort is gone, and the chart no longer exposes the
port by itself — a deployment needs the Service its region provides.
@hbrombeer
hbrombeer merged commit 29e5985 into main Aug 13, 2026
4 checks passed
@hbrombeer
hbrombeer deleted the feat/geyser-no-hostport branch August 13, 2026 20:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant