refactor: surface Flux & Crossplane only via Headlamp plugins#2156
Merged
Conversation
Consolidate the two standalone GitOps dashboards into Headlamp, which
already ships the relevant plugins, and remove the redundant standalone
web UIs.
Flux Web UI (fully removed — Headlamp's headlamp_flux plugin covers it):
- delete the flux-operator-web HelmRelease (web.serverOnly), its
flux.${domain} HTTPRoute + homepage tile, the flux-operator-web
HTTPScaledObject, the flux-web-admins ClusterRoleBinding, and the
docker web patch; the operator release keeps web.enabled: false
- drop the now-dead wiring: Dex flux-web static client, the OpenBao
flux-web client-secret PushSecret, the KEDA interceptor egress to
flux-system:9080 + its ReferenceGrant, and the flux-system entry in
the oauth2-proxy ReferenceGrant (flux-system now has no HTTPRoutes)
Crossview / Crossplane UI (kept, but no longer standalone):
- the crossview-headlamp plugin reaches Crossview via a Headlamp-managed
port-forward to crossview-service:3001 (the app exposes no Ingress and
a ClusterIP Service, so the plugin's resolver falls through to
port-forward) — so the public surface is redundant
- remove the crossview.${domain} HTTPRoute + homepage tile, the
auth-proxy router/service, and the crossview oauth2-proxy ReferenceGrant
entry; the Crossview HelmRelease/Service/namespace stay running
- swap the CiliumNetworkPolicy ingress from the (now-gone) oauth2-proxy
path to the port-forward path (host/remote-node -> :3001), which is
host-identity traffic and correctly exempt from SPIRE mutual-auth
The flux_web_client_secret key is left in the protected SOPS bootstrap
secrets as an unused substitution variable (harmless; .enc.yaml is not
edited).
Validated: ksail workload validate (local + prod), 342 files; and
kubectl kustomize of clusters/local + clusters/prod.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Contributor
Author
|
@copilot resolve the merge conflicts in this pull request |
Co-authored-by: devantler <26203420+devantler@users.noreply.github.com>
Contributor
Contributor
Author
|
Verified Copilot's merge resolution (
Re-validated the merged tree (the combination wasn't validated before): Note for whoever promotes this from draft: the embed-auth caveat in the PR description still stands — please confirm Headlamp → "Open Crossview" loads on prod, since the embed bypasses oauth2-proxy and 🤖 Addressed by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Consolidates the two standalone GitOps dashboards into Headlamp (which already ships the relevant plugins) and removes the redundant standalone web UIs.
Flux Web UI — fully removed
Headlamp's
headlamp_fluxplugin (already installed, v0.6.0) covers Flux, so the standalone Flux Status web UI is redundant.flux-operator-webHelmRelease (web.serverOnly), itsflux.${domain}HTTPRoute + homepage tile, theflux-operator-webHTTPScaledObject, theflux-web-adminsClusterRoleBinding, and the docker provider web patch. The operator release keepsweb.enabled: false.flux-webstatic client, the OpenBaoflux-webclient-secretPushSecret, the KEDA interceptor egress toflux-system:9080+ itsReferenceGrantentry, and the (already-unused)flux-systementry in the oauth2-proxyReferenceGrant(flux-system now has no HTTPRoutes).Crossplane UI (Crossview) — kept, but no longer standalone
Per the chosen approach, the
crossview-headlampplugin stays and the Crossview backend keeps running, but its standalone public surface is removed so it is reachable only embedded inside Headlamp.crossview-service:3001: Crossview exposes noIngress(chart defaultingress.enabled: false) and aClusterIPService, so the plugin's URL resolver falls through tostartPortForward(source). The public route was never part of that path.crossview.${domain}HTTPRoute + homepage tile, the auth-proxy router/service, and the crossview oauth2-proxyReferenceGrantentry. The CrossviewHelmRelease/ Service / namespace stay.CiliumNetworkPolicyingress from the (now-gone) oauth2-proxy path to the port-forward path (host/remote-node→:3001). That hop is host-identity traffic (kubelet-dialed) and is correctly exempt from the SPIRErequire-mutual-authrequirement —hosthas no SVID, soauthentication.modeis intentionally not set.The Crossview embed path now bypasses oauth2-proxy. The Crossview HelmRelease was left byte-for-byte unchanged, so
config.server.cors.originstill points at the now-unroutedhttps://crossview.${domain}. Please confirm in prod that Headlamp → Crossview sidebar → "Open Crossview" still loads/authenticates. If Crossview demands the upstream SSO auth header (or tries to redirect to the dead public origin), the follow-up is to set it to header/anonymous auth for the embed. Theheadlamp_fluxview needs no such check.Notes
flux_web_client_secretis left in the protected SOPS bootstrap secrets as an unused substitution variable (harmless;*.enc.yamlis not edited).Validation
ksail workload validate(local) andksail --config ksail.prod.yaml workload validate— 342 files validated, all green.kubectl kustomize k8s/clusters/local/andk8s/clusters/prod/build clean.🤖 Generated with Claude Code