Kubernetes
shikanime-labs/manifests
holds all cluster state as Kustomize trees, applied by Flux.
Clusters
nishir— the main cluster (RKE2 on the Nix fleet). Overlaytailnet; components: kubevirt, longhorn, tailscale, tls, victoriametrics — plus autoscaler, cert-manager, cluster-api, descheduler, envoy-gateway, envoy-ai-gateway, external-dns, flux-operator, gatekeeper, grafana-operator, local-path-provisioner, node-feature-discovery, trust-manager, victoria-logs.telsha— the Darwin-side cluster tree (overlaytailnet, component tailscale).
Controllers/operators are installed out-of-band from bootstraps/
(HelmChart resources), Flux reconciles everything else. KubeVirt is the
one exception to the HelmRelease pattern: version-pinned operator manifest
KubeVirtCR underinfrastructure/kubevirt/, because KubeVirt ships no official Helm chart.
Repo layout
apps/<app>/base/— resources common everywhereapps/<app>/components/— optional Kustomize components (tls/,ftp/,v4l/)apps/<app>/overlays/<cluster>/— cluster patchesapps/<app>/overlays/<cluster>-tailnet/— tailnet flavorclusters/<cluster>/base/— namespaces, shared PVCs, policiesclusters/<cluster>/components/— cluster-wide componentsclusters/<cluster>/overlays/<overlay>/— the build entrypoints
Kustomize composition schema
App plug-in pattern
Most apps follow the same shape:
- Workload —
Deployment/StatefulSetinapps/<app>/base/ - Network — per-app Envoy Gateway (
GatewayClass+EnvoyProxy+Gateway) in the tailnet overlay;HTTPRoutein base whoseparentRefsthe overlay patches - Storage — PVC in the overlay bound to a Longhorn
PV - Secrets —
*.enc.*files fed throughsecretGenerator; decrypted outputs derive by stripping.enc.
Platform add-ons
| Add-on | Where |
|---|---|
| TLS / trust | clusters/<c>/components/tls/ (cert-manager, trust-manager Bundle) |
| Tailnet ingress | clusters/<c>/components/tailscale/ (Tailscale Operator) |
| Storage | clusters/<c>/components/longhorn/ (Longhorn settings, storage class, recurring jobs) |
| Observability | clusters/<c>/components/victoriametrics/ (VictoriaMetrics + Grafana) + victoria-logs |
| Vertical autoscale | per-app vpa.yaml (VPA controller) |
| Virtualization | infrastructure/kubevirt/ (operator + CR) |
| Policy | components/gatekeeper (OPA) |
| Autoscaling | components/autoscaler, components/descheduler |
| DNS | components/external-dns |
| GitOps | components/flux-operator |
| Inference gateway | components/envoy-ai-gateway |
| Provisioning | components/cluster-api |
Reconciliation loop
Notes
- VMs need
/dev/kvmon the node (Intel VT-x / AMD-V); scheduling keys off thenodes.kubevirt.io/resource/kvmlabel published via node-feature-discovery. - Longhorn PVCs cannot shrink while bound — size them minimally and grow; resizing requires delete pod+pvc+pv for volume-claim template flips.
- Config overlays each own their Flux
Kustomization; skaffold render excludes cert material.