This page documents the Kubernetes cluster running on the home server. Diagrams are generated from D2 source files in ~/git/k8s-infra/docs/.
Last updated: 2026-03-29
Physical and virtual infrastructure: internet connectivity, router, host server, KVM virtual machines, storage, and network topology.
Kubernetes components, namespaces, workloads, monitoring, and backup systems.
kubeProxyReplacement: true — Cilium handles all service routing via eBPF, kube-proxy removed (2026-03-28)kubeProxyReplacement: false alongside kube-proxy, which caused a dual data path race condition leading to intermittent API server unreachability from pods| Namespace | Service | Replicas | Domain(s) | Storage |
|---|---|---|---|---|
| davidata | nginx:alpine | 2 | davidata.se, davidata.com | - |
| grogg | grogg-web | 2 | grogg.org | - |
| blog | Grav CMS | 1 | servant.grogg.org, thedailythinkingmachine.grogg.org | 5Gi PVC |
| dokuwiki | DokuWiki | 1 | wiki.davidata.se | 5Gi PVC |
| vaultwarden | Vaultwarden | 1 | vault.davidata.se | 2Gi PVC |
| obsidian-search | Qdrant + FastAPI | 1+1 | obsidian.grogg.org (HTTP, internal) | 1Gi PVC (Qdrant) + NFS (vault) |
Alertmanager emails david@davidata.se via Gmail SMTP (km@grogg.org).
Design principle: Alert noise is handled via Alertmanager routing (receiver selection), not by modifying Prometheus rules. This keeps signal detection intact and survives Helm upgrades.
Silenced via routing to null receiver:
| Alert | Reason |
|---|---|
| Watchdog | Heartbeat alert, not actionable |
| InfoInhibitor | Informational, not actionable |
| etcdMembersDown, etcdInsufficientMembers | False positive — Prometheus can't scrape etcd metrics port (2381 refused) |
| TargetDown (kube-system) | Known scrape targets not exposed |
| KubeJobFailed (velero, kopia-maintain jobs) | Kopia repo maintenance jobs have hardcoded backoffLimit: 0; intermittent failures are non-critical since next cycle self-heals. Actual backup failures are covered by VeleroBackupFailed/VeleroBackupNotRun |
Active custom alerts:
backoffLimit: 0 is hardcoded in Velero source — cannot be changedkeepLatestMaintenanceJobs: 3 — Velero's own cleanup mechanism (not K8s TTL)Request path from user to backend service, showing DNS resolution, TLS termination, and routing.
D2 source files are version-controlled:
~/git/k8s-infra/docs/overview.d2~/git/k8s-infra/docs/k8s-architecture.d2~/git/k8s-infra/docs/traffic-flow.d2Regenerate with: d2 <file>.d2 <file>.svg && rsvg-convert -w 2000 <file>.svg -o <file>.png