S3 has two names¶
| Name | For | Serves |
|---|---|---|
https://s3.gewis.nl |
every S3 client: cluster workloads, the KV endpoint, anything outside |
the S3 API only |
http://s3.net.gewis.nl:8333 |
terraform/40_seaweedfs-buckets and admins |
S3 and IAM, straight to s3-01 |
Both reach the same SeaweedFS gateway on s3-01.
Clients use path-style and region us-east-1. The .net name is LAN-internal:
only the cluster resolver answers it, so it works from the LAN,
pods and NetBird peers using NetBird DNS.
s3.gewis.nl refuses IAM¶
Port 8333 also serves the IAM and STS APIs, which are always POST /; the S3 API
never uses that method on the root. The route in flux/40_services/s3/ matches
Host(`s3.gewis.nl`) && !(Method(`POST`) && Path(`/`)), so Traefik returns
404 for every IAM and STS call and forwards everything else, including the S3
POSTs (/bucket?delete, /bucket/key?uploads, /bucket/key?uploadId=…). Users,
keys and policies are managed only over s3.net.gewis.nl.
Traefik reaches s3-01 over the LAN¶
The backend is the selectorless Service s3-01 with a hand-written
EndpointSlice for 10.82.50.100:8333, the same pattern as the LAN hosts of the
external proxy. Loki, Mimir, Tempo and the database backups
all write through this route. The cost is one more place that hardcodes s3-01's
DHCP-reserved address, see s3-01 gotchas.
Inside, s3.gewis.nl points straight at Traefik¶
The cluster resolver answers s3.gewis.nl with 10.82.50.10, Traefik's own
address, so pods and LAN clients skip the round trip through router02's public
address. Everyone else follows the public CNAME onto router02.
Clients¶
Path-style is mandatory: <bucket>.s3.gewis.nl is outside the wildcard
certificate. Signatures stay valid through Traefik, which passes the Host
header unchanged and sets X-Forwarded-Proto: https, from which SeaweedFS
rebuilds the signed host without the default port.