HelmChartConfig — do not deploy our ownThe cluster needs an ingress controller: it terminates TLS for every public host, routes to services by
Ingress, and hosts the KEDA HTTP interceptor’s routes. k3s installs and manages one by default
(Traefik, as a packaged Helm chart in kube-system, reconciled by k3s itself with
failurePolicy: reinstall).
The question is whether to accept that or take ownership of the controller, which is the usual recommendation for a production cluster: you want to pin the version and not have your ingress change under you when the node’s Kubernetes distribution is upgraded.
Two facts about this cluster push against the usual recommendation. There is exactly one node, so a botched ingress rollout is a total outage with no second path in; and the whole platform is expressed as ArgoCD Applications, so a second controller would be one more thing to keep in sync with a distribution that is already managing one.
Keep the k3s-bundled Traefik, and configure it through a single HelmChartConfig.
k8s/platform/traefik/traefik-config.yaml — a HelmChartConfig that supplies the
extra entrypoints (metrics; formerly the Postgres TCP passthrough) and enables Prometheus metrics.HelmChartConfig for a given chart name, ever. Two would collide, so every
Traefik setting must live in that one file — which is why the file says so at the top.TLSStore default makes the Origin CA wildcard the default
certificate, and Ingresses declare no tls: block (ADR 0004).ServiceLB (k3s’s kube-proxy-based load balancer) binds host ports 80 and 443 for the
kube-system/traefik Service, which is how traffic reaches the controller. The auto-allocated
NodePorts alongside them are a side effect, not a second path, and they are closed by the firewall
rather than by removing the Service (the Service needs them).Ingress plus the KEDA
interceptor wiring.LoadBalancer/NodePort Service per app. That exposes a port per app
and moves routing, TLS and hostname handling into each workload.HelmChartConfig for the same chart silently
collides instead of merging.HelmChartConfig is, so
ArgoCD’s selfHeal covers the settings but not the controller; a manual change to the controller
itself is reverted by k3s’s failurePolicy: reinstall instead.TLSStore, IngressRouteTCP) come from the bundled chart, so a future move to a
self-managed Traefik has to install them too.k8s/platform/traefik/traefik-config.yaml (the single HelmChartConfig),
k8s/platform/traefik/tlsstore.yaml, inventory/ports.yaml (the ServiceLB NodePorts and why they
close by firewall), docs/upgrade-policy.md, and docs/networking.md.