Single-Node Lab
The single-node-lab target boots a single k3d cluster with the full lab stack:
- Dex + OpenLDAP — OIDC SSO for all services
- Prometheus + Grafana + Alertmanager — cluster observability
- ArgoCD — GitOps with Dex SSO
- Headlamp — Kubernetes web UI with Dex SSO
All services are exposed via Traefik ingress on *.nip.io domains and authenticate through Dex.
Quickstart
Or with a local image registry:
What Gets Deployed
| Phase | Component | Make Target | Service URL |
|---|---|---|---|
| 1 | k3d cluster | make cluster | — |
| 2 | Dex + LDAP | make deploy-dex | http://dex.<IP>.nip.io/dex |
| 3 | Prometheus + Grafana + Alertmanager | make deploy-promstack + monitoring ingress | http://grafana.<IP>.nip.io / prometheus.<IP>.nip.io / alertmanager.<IP>.nip.io |
| 4 | ArgoCD | ocm/scripts/install-argocd-k3d.sh + ingress + SSO | http://argocd.<IP>.nip.io |
| 5 | Headlamp | make deploy-headlamp | http://headlamp.<IP>.nip.io |
Architecture
flowchart LR
subgraph k3d["Single k3d Cluster"]
Traefik["Traefik Ingress<br/>*.nip.io"]
Dex["Dex OIDC +<br/>OpenLDAP"]
Grafana["Grafana"]
Prom["Prometheus<br/>+ Alertmanager"]
ArgoCD["ArgoCD"]
Headlamp["Headlamp"]
end
Traefik -->|auth| Dex
Grafana -->|OIDC| Dex
ArgoCD -->|OIDC| Dex
Headlamp -->|OIDC| Dex SSO Credentials
| Username | Password | Provider | Groups | |
|---|---|---|---|---|
| admin | [email protected] | password | Static (Dex) | — |
| john | [email protected] | babayaga | LDAP | admins |
| tony | [email protected] | ironman | LDAP | developers |
All components (Grafana, ArgoCD, Headlamp) support Sign in with Dex. Grafana also has a local admin account: admin / prom-operator.
Teardown
This deletes the k3d cluster and all deployed resources.
Individual Targets
You can also run each step independently:
# 1. Cluster
make cluster # or: CLUSTER_NAME=mycluster make cluster
# 2. SSO
make deploy-dex
# 3. Observability
make deploy-promstack
make deploy-monitoring-ingress
# 4. ArgoCD
./ocm/scripts/install-argocd-k3d.sh
make deploy-argocd-ingress
make ocm-configure-argocd-sso
# 5. Headlamp
make deploy-headlamp
IP Detection
The nip.io IP is auto-detected by scripts/get-nipio-ip.sh — it checks Tailscale IPv4 first, then falls back to the Traefik LoadBalancer IP.
See IP Detection for details.
Warning
Paralus and Tekton are excluded — they have multi-cluster dependencies that don't apply to a single-node setup.
Tip
The local registry variant (single-node-lab-registry) is useful when you need to push custom container images for GitOps workflows.