Skip to content

storage: PVCs on local-path are on disposable disk — migrate to longhorn #186

Description

@izzywdev

@fuze this repo has PersistentVolumeClaims on the local-path StorageClass, which is unsafe on this cluster.

Affected PVCs: fuzekeys-data, fuzekeys-logs (namespace fuzekeys)

fuzekeys-data is already bound to a node that no longer exists (fuzeinfra-elastic-918c8556). That data is gone, and it is why fuzekeys-backend has been unschedulable — its PV points at a deleted machine. Separately, fuzekeys-backend declares replicas: 2 with strategy: RollingUpdate against two ReadWriteOnce claims, which can never reach ready state even with a healthy volume: only one pod can mount an RWO PVC, and RollingUpdate deadlocks against it. Both need fixing.

Why this is urgent

local-path provisions node-local disk and pins the PV to that node by nodeAffinity. This cluster's elastic nodes are created and reaped by an autoscaler, so a volume on local-path dies with its node. Its reclaimPolicy is also Delete, not Retain.

This is not hypothetical. Measured on 2026-09-01, two PVs are already bound to nodes that no longer exist:

fuzekeys/fuzekeys-data               ->  fuzeinfra-elastic-918c8556   (node gone)
fuzeinfra/data-fuzeinfra-postgres-0  ->  fuzeinfra-elastic-57543f68   (node gone)

It is the same failure as the 2026-07-24 incident, in which local-path volumes were destroyed by node reinstalls and Neo4j was lost.

Why it happened — it was not your mistake

local-path was the cluster default StorageClass. Any chart that did not explicitly set storageClassName got ephemeral disk silently. global.storageClass: longhorn only governs FuzeInfra's own umbrella chart; consuming repos deploy their own Helm releases and never inherited it.

FuzeInfra has now made longhorn the default (FuzeInfra#814), verified by probe: a PVC with no storageClassName binds to longhorn, replicated across 3 durable nodes with reclaimPolicy: Retain. So newly created PVCs are safe from here.

What is still needed from this repo

Existing PVCs do not migrate automatically — storageClassName is immutable on a bound claim. Please:

  1. Set storageClassName: longhorn explicitly in this repo's Helm chart for the PVCs listed above, so it is declared rather than inherited.
  2. Plan the migration of the existing volume(s): back up, delete the PVC, let it be recreated on longhorn, restore. Sequence it per-service; do not do it blind.
  3. If any of these hold data you cannot lose, treat it as at risk right now until migrated — it is on a disk that disappears if that node is replaced.

Not urgent for stateless/scratch volumes; state clearly which of yours are which.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions