Skip to content

Edge gateway HTTP-01 challenges stuck at ACME self-check (DNS/404/500/503) — NSO solver is live; control-plane vs member Challenge split #261

Description

@ecv

Important

2026-07-17 status — open; the control-plane↔member Challenge split is unresolved. No ACME cert has issued on datum-gateway-http fleet-wide since ~2026-07-09. The infra-side count improvement (datum-cloud/infra#3419) is a deletion artifact: ~87 edge Certificates were deleted ~2026-07-15 19:00Z on a stably-running NSO v0.24.2 (no restart, no roll) while Ready=True stayed flat — no v0.24.x release fixed this. Evidence: #261 (comment). Definition-of-done: the infra gateway-custom-hostname-cert e2e goes green on a scheduled prod run — not a lower Ready=False count.

(OP rewritten 2026-07-13 after live investigation disproved the original "stalled solver" diagnosis; the two minimized comments hold that outdated history.)

Summary

Edge gateway custom-hostname certificates are not issuing. But the GatewayDownstreamCertificateSolver is not the cause — it is running, holds leadership, and reconciles the Challenges it can see, creating the expected HTTP01 solver HTTPRoute/HTTPRouteFilter. The Challenges are stuck at cert-manager's ACME HTTP-01 self-check, which is failing for heterogeneous reasons (DNS resolution failures, HTTP 404/500/503). Separately, the control-plane Challenge set NSO watches has no object newer than 2026-06-18, while edge member clusters carry fresh Challenges — a topology split that needs explaining.

Verified topology (reproduced NSO's client)

  • The solver watches the Karmada control-plane apiserver (karmada-apiserver.karmada-system.svc.cluster.local:5443), reached via the pod's federated-kubeconfig + a projected SA token (network-services-operator-controller-manager, audience = that apiserver). Reproduced this exact client from the hub and queried it directly.
  • As of 2026-07-13, that apiserver served 16 gateway acme.cert-manager.io/v1 Challenges (issuerRef=ClusterIssuer/datum-gateway-http, type: HTTP-01), all created ≤ 2026-06-18 (two older, from March/May), all pending, and actively updated by cert-manager (managedFields: cert-manager-challenges@2026-07-13T05:23Z).
  • The solver's surviving http01-solver HTTPRoute/HTTPRouteFilter set on the edge maps 1:1 to these 16 control-plane Challenges.

What is actually happening (verified 2026-07-13)

The solver is live, not stalled. Leader pod network-services-operator-controller-manager-849f57c79d-xwp54 (fresh, restartCount 0) logs the full happy path with 0 errors, and re-reconciles on cert-manager's live status updates:

Reconciling ACME challenge solver
Processing challenge for Gateway-owned certificate
Successfully retrieved key and token from cert-manager Challenge
HTTPRouteFilter reconciled
HTTPRoute reconciled

The Challenges are stuck at the HTTP-01 self-check, for mixed reasons (live status on the 16):

Failure reason (from status.reason) Notes
dial tcp: lookup <domain> on 10.2.0.10:53: server misbehaving cluster-DNS resolution failing for the self-check (e.g. app.datum.design)
wrong status code '404', expected '200' e.g. javalords-ink…, swirls-k8s…
wrong status code '500' e.g. pcep-lol…, tunnel-dmsrd…
wrong status code '503' seen intermittently on the same objects
failed to perform self check generic self-check failure

So even objects for which the solver has created a route still fail the self-check (404/500/503), and some never get that far (DNS). This is a data-path / self-check problem, not a "solver isn't creating routes" problem.

The real open question — control-plane vs member Challenge split

  • The control-plane apiserver NSO watches has no Challenge newer than 2026-06-18. That, not a dead watch, is why no new solver routes appear after 06-18 — NSO faithfully serves what's there, and there's nothing newer.
  • Meanwhile the edge member us-central-1-alice (a registered Karmada member) has 96 Challenges created 2026-07-13 02:43, which do not appear in the control-plane view. The 06-18 control-plane object javalords-ink-https-hostname-0-1-2137251722-2111718441 is even NotFound on that member.
  • So there appear to be two Challenge populations (control-plane vs member) that don't reconcile. Where are new tenant gateway Challenges being created, and why don't they land in the apiserver NSO watches?

What to investigate next (owner)

  1. Why the HTTP-01 self-check fails per-domain: cluster-DNS server misbehaving for control-plane cert-manager, and edge Envoy returning 404/500/503 on /.well-known/acme-challenge/<token> even where a solver route exists.
  2. The control-plane ↔ member Challenge topology: is new tenant cert issuance supposed to create Challenges in the control-plane apiserver (where NSO + datum-gateway-http live), and if so why has nothing appeared since 06-18? Note the prod propagation policy is now mirrored in-repo (config/federation/clusterpropagationpolicy.yaml, Carry edge policy from the control plane out to the edges #227): it propagates the http01-solver HTTPRoute/HTTPRouteFilter and issuer Secrets to members but not Certificates/Orders/Challenges — under that intended topology, member-local Challenges shouldn't exist at all.
  3. Whether the 06-18 ceiling correlates with the v0.22.0 (EG 1.8 / Gateway API 1.5, Modernize the gateway stack: Envoy Gateway 1.8 & Gateway API 1.5 #189/Envoy Gateway extension server #192, released 2026-06-18T01:07Z) change to the federated/aggregated wiring — but note this is about what gets into the apiserver, not the solver's watch, which is demonstrably live.

Refs

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions