fix(storage): add longhorn-wffc SC + pin portainer/forgejo-runner to az-a — fixes PVC attach

This commit is contained in:
Story Crater Bot
2026-08-18 15:08:02 -07:00
parent cda75eeb7b
commit 384548b424
5 changed files with 51 additions and 5 deletions
@@ -33,7 +33,7 @@ tls:
# RWO block volume. 10Gi is generous for config data but cheap on Longhorn.
persistence:
enabled: true
storageClass: "longhorn"
storageClass: "longhorn-wffc"
size: 10Gi
resources:
@@ -51,3 +51,8 @@ tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
# Pin to az-a (talos-cp-1) — sole Longhorn storage node. Its RWO PVC can only
# attach there; without this the pod may land on cp-2/cp-3 and fail to mount.
nodeSelector:
topology.kubernetes.io/zone: az-a
@@ -1,5 +1,8 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: longhorn-system
resources: []
# Longhorn deployed via Helm chart (values in parent layer)
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).
@@ -0,0 +1,29 @@
# longhorn-wffc — Longhorn StorageClass with WaitForFirstConsumer binding.
#
# The chart's default `longhorn` SC uses Immediate binding: the PV binds before
# the pod is scheduled, so on this single-storage-node topology (only talos-cp-1
# runs Longhorn) the scheduler often places the pod on cp-2/cp-3 where the volume
# can't attach ("CSINode does not contain driver driver.longhorn.io").
#
# WaitForFirstConsumer defers binding until the pod is scheduled, so the volume
# is provisioned on the node the pod lands on — and with a single Longhorn node
# that co-locates pod + volume on cp-1 automatically. This is the new default;
# the chart's `longhorn` SC is demoted (see longhorn-values default-class=false).
#
# volumeBindingMode is immutable, so this is a distinct SC (not an edit of the
# chart's). Existing volumes stay on `longhorn`; new PVCs use this.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-wffc
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
parameters:
numberOfReplicas: "1"
staleReplicaTimeout: "30"
fromBackup: ""
dataLocality: "best-effort"
@@ -19,6 +19,10 @@ spec:
spec:
tolerations:
{{- toYaml .Values.tolerations | nindent 8 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
initContainers:
- name: register
@@ -30,13 +30,18 @@ dind:
persistence:
reg:
storageClass: longhorn
storageClass: longhorn-wffc
size: 1Gi # .runner registration file + config — survives pod restarts
dind:
storageClass: longhorn
storageClass: longhorn-wffc
size: 30Gi # docker layer cache — keeps rebuilds fast across restarts
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
# Pin to az-a (talos-cp-1) — sole Longhorn node; RWO PVCs (reg/dind cache) only
# attach there.
nodeSelector:
topology.kubernetes.io/zone: az-a