You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A fleet wildcard certificate exists and is valid, but no spoke actually uses it. Every spoke ingress still carries its own tls: block pointing at a per-namespace hive-tls-hc secret, and an explicit tls: block always wins over the controller's --default-ssl-certificate. So the wildcard is currently inert, and the fleet is still minting one certificate per host against a 50-per-week-per-registered-domain ACME cap.
This is the durable half of the mitigation applied during the 2026-09-03 rate-limit incident.
Current state (measured 2026-09-04)
The wildcard: hive-wildcard-tls in ns hive-hub on hive-oke, issuer letsencrypt-dns01 (DNS-01 via Cloudflare). SANs:
So ~195 ingress TLS references and ~60 Certificate objects exist to do what one wildcard already covers.
Why this matters
Per-host certs make the ACME cap structurally reachable: ~263 wildcard-covered hostnames across the two clusters against a 50/week limit. Every hostname change costs a certificate. A live example on hive-hosted-hosted-projectbluefin-knuckle-gjvq — the stored secret still carried the pre-migration SAN
while the Certificate requested the .hive.hivecommons.dev form of both, so cert-manager reported RequestChanged: Fields on existing CertificateRequest resource not up to date: [spec.dnsNames] and tried to re-issue. That churn is what exhausted the quota.
Confirmed during this investigation: deleting a spoke's hive-tls-hc secret causes cert-manager to mint a brand new per-host certificate rather than falling through to the wildcard — direct evidence the wildcard is not in the serving path.
Copy hive-wildcard-tls from hive-hub on hive-oke into the lke cluster (or issue a second wildcard there with the same DNS-01 issuer - note this costs one ACME issuance).
Add --default-ssl-certificate=<ns>/hive-wildcard-tls to the lke ingress-nginx-controller args.
These two alone change nothing observable, since explicit tls: blocks still win. They are just the prerequisite.
2. Provisioner/template change (the actual fix)
Stop emitting a tls: block on provisioned spoke ingresses (hive, hive-api, hive-contribute, hive-snapshot, hive-terminal) when the cluster domain is wildcard-covered.
Stop creating the per-hive hive-tls-hc Certificate on those clusters.
Keep per-host certs only for hosts outside the wildcard: currently dibs.kubestellar.io and hive.kubestellar.io on hive-oke. Note dibs is separately slated to move to dibs.hivecommons.dev (🌱 dibs should be canonically dibs.hivecommons.dev, with dibs.kubestellar.io as a redirect #5925), which is one level up and so is NOT covered by *.hive.hivecommons.dev - it needs its own SAN on the wildcard.
3. Cleanup after the template change lands
Remove the now-unused hive-tls-hc Certificates and secrets.
Verify each spoke still serves a valid cert by SNI before deleting anything.
Why this cannot be done by hand
The provisioner reconciles spoke ingresses back within minutes. During the incident, manual issuerRef edits on 15 Certificates were reverted the same way. A kubectl sweep across ~195 objects would not hold - this has to be a template/provisioner change.
Renewal consideration
Once spokes rely on the wildcard, its renewal becomes a single point of failure for every dashboard URL on the domain. Worth adding an alert on hive-wildcard-tls approaching expiry, and keeping the DNS-01 path monitored, since a failed wildcard renewal would take down all ~263 hostnames at once rather than one.
Related: the re-mint loop that consumed the quota is tracked separately; dibs canonical-host move is #5925.
Summary
A fleet wildcard certificate exists and is valid, but no spoke actually uses it. Every spoke ingress still carries its own
tls:block pointing at a per-namespacehive-tls-hcsecret, and an explicittls:block always wins over the controller's--default-ssl-certificate. So the wildcard is currently inert, and the fleet is still minting one certificate per host against a 50-per-week-per-registered-domain ACME cap.This is the durable half of the mitigation applied during the 2026-09-03 rate-limit incident.
Current state (measured 2026-09-04)
The wildcard:
hive-wildcard-tlsin nshive-hubon hive-oke, issuerletsencrypt-dns01(DNS-01 via Cloudflare). SANs:hive-tls-hcCertificateobjectshive.hivecommons.devdibs.kubestellar.io,hive.kubestellar.io--default-ssl-certificateon nginxhive-hub/hive-wildcard-tls)So ~195 ingress TLS references and ~60 Certificate objects exist to do what one wildcard already covers.
Why this matters
Per-host certs make the ACME cap structurally reachable: ~263 wildcard-covered hostnames across the two clusters against a 50/week limit. Every hostname change costs a certificate. A live example on
hive-hosted-hosted-projectbluefin-knuckle-gjvq— the stored secret still carried the pre-migration SANwhile the Certificate requested the
.hive.hivecommons.devform of both, so cert-manager reportedRequestChanged: Fields on existing CertificateRequest resource not up to date: [spec.dnsNames]and tried to re-issue. That churn is what exhausted the quota.Confirmed during this investigation: deleting a spoke's
hive-tls-hcsecret causes cert-manager to mint a brand new per-host certificate rather than falling through to the wildcard — direct evidence the wildcard is not in the serving path.Work required
1. lke648397 prerequisites (cluster-wide, additive, low risk)
hive-wildcard-tlsfromhive-hubon hive-oke into the lke cluster (or issue a second wildcard there with the same DNS-01 issuer - note this costs one ACME issuance).--default-ssl-certificate=<ns>/hive-wildcard-tlsto the lkeingress-nginx-controllerargs.tls:blocks still win. They are just the prerequisite.2. Provisioner/template change (the actual fix)
tls:block on provisioned spoke ingresses (hive,hive-api,hive-contribute,hive-snapshot,hive-terminal) when the cluster domain is wildcard-covered.hive-tls-hcCertificate on those clusters.dibs.kubestellar.ioandhive.kubestellar.ioon hive-oke. Notedibsis separately slated to move todibs.hivecommons.dev(🌱 dibs should be canonically dibs.hivecommons.dev, with dibs.kubestellar.io as a redirect #5925), which is one level up and so is NOT covered by*.hive.hivecommons.dev- it needs its own SAN on the wildcard.3. Cleanup after the template change lands
hive-tls-hcCertificates and secrets.Why this cannot be done by hand
The provisioner reconciles spoke ingresses back within minutes. During the incident, manual
issuerRefedits on 15 Certificates were reverted the same way. A kubectl sweep across ~195 objects would not hold - this has to be a template/provisioner change.Renewal consideration
Once spokes rely on the wildcard, its renewal becomes a single point of failure for every dashboard URL on the domain. Worth adding an alert on
hive-wildcard-tlsapproaching expiry, and keeping the DNS-01 path monitored, since a failed wildcard renewal would take down all ~263 hostnames at once rather than one.Related: the re-mint loop that consumed the quota is tracked separately;
dibscanonical-host move is #5925.