Status
This is the path our own production runs on, and the only one exercised end-to-end: Linode LKE.lke is the single profile carrying PROFILE_TESTED=yes. What has been run, and what has not, is tabulated in what’s proven, and where; the 2026-08-25 adoption of Vexa’s own production is written up in Upgrade. --provider generic differs from lke only in that flag and the notes beside it: no conformant cluster other than LKE has run this end-to-end, so on anything else expect deltas and let the preflight find them. Per-provider deltas: GKE · EKS · AKS · OpenShift.
No ingress controller and no cert-manager
Nothing in the delivery machinery needs them — the subscription pulls, so it needs no inbound path at all. They matter only for the endpoints you expose. The pattern that works in that cluster class is a per-service reverse proxy with built-in ACME — a small Caddy Deployment in the namespace with its own LoadBalancer Service and certificate storage: one workload per exposed endpoint, a load balancer each, blast-radius isolation. Two things to get right:-
Pin the ACME issuer, to production. Caddy’s default fallback chain ends at Let’s Encrypt staging, so a DNS record that had not propagated is enough to get a staging certificate issued silently. Set
acme_catohttps://acme-v02.api.letsencrypt.org/directorywith no fallback. Create the DNS record before the proxy pod first starts — ACME fires on boot. Recovery is to delete the stored certificates and restart the rollout. -
Confirm the issuer from outside, not from the logs. A staging certificate is invisible from inside the cluster: the pod is
Running, TLS handshakes complete — and every client seesx509: certificate signed by unknown authority.