feat(storage): enable Longhorn on all 3 control-plane nodes for true HA

Changes:
- k8s/infrastructure/longhorn/longhorn-taint-toleration.yaml: new Setting
  to tolerate node-role.kubernetes.io/control-plane:NoSchedule taint,
  allowing Longhorn DaemonSet to run on cp-2/cp-3 (not just cp-1)
- k8s/infrastructure/longhorn/longhorn-nodes.yaml: explicit Node CRDs for
  talos-cp-2 and talos-cp-3 (auto-discovery doesn't work when nodes have
  taints; these define /var/lib/longhorn as the storage path)
- k8s/infrastructure/longhorn/longhorn-wffc-storageclass.yaml: bump
  numberOfReplicas from 1→3 (true HA: each volume gets 3 copies across
  3 nodes; if one node fails, 2 others still have the data)
- k8s/infrastructure/longhorn/kustomization.yaml: add new resources

Root cause: Longhorn was only running on talos-cp-1 (.213) because cp-2/cp-3
have the control-plane taint and Longhorn DaemonSet had no matching toleration.
Every workload with a PVC was forced to schedule on cp-1 (via nodeSelector or
implicit co-location with the storage), defeating the entire purpose of a 3-node
HA cluster.

With this fix:
- Longhorn manager runs on all 3 nodes
- Storage is replicated 3x (erasure-coded across nodes)
- Pods can schedule on any node without PVC attachment failures
- True HA: lose 1 node, cluster still serves all volumes
This commit is contained in:
Story Crater Bot
2026-07-22 08:46:57 -07:00
parent dde4b602c4
commit be7881d6f0
4 changed files with 58 additions and 15 deletions
@@ -3,6 +3,10 @@ kind: Kustomization
namespace: longhorn-system
resources:
- longhorn-wffc-storageclass.yaml
# Longhorn deployed via Helm chart (values in parent layer). The WFFC
# StorageClass above is the new default; the chart's Immediate `longhorn` SC is
# demoted (default-class annotation removed on the live object at bootstrap).
- longhorn-servicemonitor.yaml
- longhorn-taint-toleration.yaml
- longhorn-nodes.yaml
# Longhorn deployed via bootstrap script (cluster-config/longhorn_bootstrap.sh).
# These manifests configure it post-bootstrap: WFFC StorageClass (default),
# Prometheus ServiceMonitor, taint toleration for control-plane nodes, and
# explicit Node CRDs for cp-2/cp-3 (auto-discovery doesn't work with taints).