Create Kubernetes Dashboard #39
Labels
No labels
blocked
bug
duplicate
effort
high
effort
low
effort
medium
effort
minimal
enhancement
help wanted
invalid
pr
feedback
pr
reviewing
question
status
backlog
status
document
status
done
status
implement
status
pending
status
planning
status
reviewing
waiting
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
tepichord/milner#39
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Naina:
Overview
Deploy Headlamp — the official Kubernetes SIG UI successor to the archived Dashboard — as a Terraform-managed Helm component in a dedicated namespace, exposed at
dashboard.faun-snapper.ts.netvia the existing Tailscale operator ProxyGroup. The deployment follows the establishedvault/pattern: new Terraform root,helm_release,kubernetes_ingress_v11.Open scope question: The issue requests "insight on resource usage." Headlamp's CPU/memory charts require metrics-server, which is not in the cluster today. Two options: (a) include metrics-server as a companion Terraform root, or (b) ship Headlamp's node/pod inventory views first and add metrics-server in a follow-up. Recommend (b) — keeping this issue focused.
Technical Approach
Create
kubernetes-dashboard/main.tf— new Terraform root mirroringvault/main.tfstructure: remote state from CP, provider config, namespace, Helm release, Ingress.Create
kubernetes-dashboard/values.yaml— Headlamp Helm chart config:Create
kubernetes-dashboard/cluster-role.tf— read-only ClusterRole + binding for the Headlamp pod SA (replacing the chart'scluster-admindefault2):Create
kubernetes-dashboard/namespace.tf— dedicated namespace withbaselinePSA (Headlamp runsrunAsNonRoot: true3, no privileged containers):Add Tailscale Ingress to
main.tf— reuse existingingress-proxiesProxyGroup (confirmed: one ProxyGroup handles multiple Ingress resources4):Reference ProxyGroup from
vault/main.tf— the existingkubernetes_manifest.vault_proxy_groupresource is already Terraform-owned5. The new root's Ingress only needsdepends_onon the Helm release; the ProxyGroup exists cluster-wide. No second ProxyGroup resource needed.Create
kubernetes-dashboard/remote-state.tf— standard remote state block (copy fromvault/):Create
kubernetes-dashboard/.gitignore— exclude state files:Update
ARCHITECTURE.md— add Dashboard to the service table and network topology diagram:Update
OPERATIONS.md— add §7 documenting Headlamp bring-up: approvedashboardservice in Tailscale admin console, create a ServiceAccount + token for login, note that Talos has no node-shell binary (expected, not a bug).Implementation Details
Files to create
kubernetes-dashboard/main.tf— namespace, Helm release, Ingress, remote state, providerskubernetes-dashboard/values.yaml— Headlamp chart values (image tag, resources, nodeSelector, RBAC override)kubernetes-dashboard/cluster-role.tf— read-only ClusterRole + bindingkubernetes-dashboard/.gitignore— state exclusionsFiles to modify
ARCHITECTURE.md— add Dashboard row to service table and network diagramOPERATIONS.md— add §7 (Dashboard bring-up/access)Dependencies
headlamp/headlamp0.45.0 fromhttps://kubernetes-sigs.github.io/headlamp/6ingress-proxiesProxyGroup (created invault/main.tf)Constraints
ghcr.io/headlamp-k8s/headlamp:v0.45.0is multi-arch (linux/arm64 verified)7runAsUser: 100), no hostPath —baselinePSA sufficient8node shellfeature does not work on Talos (no shell binary in node OS) — expected9Prefixpath type (Tailscale limitation — fine for this use case)10Out-of-scope notes
Acceptance Criteria
terraform -chdir=kubernetes-dashboard plansucceeds with no errorsdashboardnamespace onworker-largenode (verified viakubectl get pods -n dashboard -o wide)https://dashboard.faun-snapper.ts.netfrom a tailnet devicekubectl describe clusterrolebinding headlamp-viewterraform destroy -chdir=kubernetes-dashboardremoves all resources cleanlyTesting Plan
terraform fmt -check -recursive kubernetes-dashboard/— formatting lintshellcheck kubernetes-dashboard/*.sh(if any scripts added)yamllint kubernetes-dashboard/values.yaml— Helm values lintterraform validate -chdir=kubernetes-dashboard— syntax/provider validationkubectl -n dashboard get pods, confirm Running; curlhttps://dashboard.faun-snapper.ts.netreturns 200Related Issues/PRs
Research Findings
kubernetes/dashboardproject is archived and unmaintained (Jan 2026); the Kubernetes project formally recommends Headlamp as its successor under SIG UI.ghcr.io/headlamp-k8s/headlamp), single-container footprint (~60 MiB RSS), and in-cluster Helm deployment matching the repo's patterns.cluster-adminfor its pod SA (PR #4437 to change this was closed unmerged); the plan explicitly overrides this with a read-only ClusterRole.ingress-proxies) can serve multiple Ingress resources, so no second ProxyGroup is needed for the dashboard.tsidpOIDC provider is experimental and "rather tricky" to deploy in Kubernetes; recommend deferring SSO to a follow-up.