Use an Alternative Storage Provider#
This project deploys Longhorn as the default CSI (Container Storage Interface) provider. If you prefer a different storage solution — such as local-path, NFS, Rook-Ceph, or OpenEBS — follow this guide.
What Longhorn provides#
Longhorn gives you:
Replicated block storage distributed across worker nodes
A web UI for volume management
Volume snapshots and backups
Automatic replica rebuilding when nodes go down
If you do not need these features, or your environment has a different storage solution, you can replace Longhorn entirely.
Step 1: Remove Longhorn from ArgoCD#
Delete the Longhorn ArgoCD Application template and its additions:
rm kubernetes-services/templates/longhorn.yaml
rm -rf kubernetes-services/additions/longhorn/
Step 2: Remove Longhorn-specific kernel settings#
The kernel-settings.yaml DaemonSet includes iSCSI-related configuration that is
specifically for Longhorn. Review kubernetes-services/templates/kernel-settings.yaml
and either:
Delete it entirely if you do not need the sysctl tuning:
rm kubernetes-services/templates/kernel-settings.yamlEdit it to keep only the network buffer settings (
rmem_max/wmem_max) and remove the multipathd blacklist for Longhorn iSCSI devices.
Step 3: Remove open-iscsi dependency (optional)#
Longhorn requires open-iscsi on each node. If your replacement does not need it,
you can remove it from the update_packages role. Edit
roles/update_packages/tasks/main.yml and remove open-iscsi from the package list.
Step 4: Update storage references in other services#
Some services request persistent volumes using Longhorn’s storageClassName. Search
for longhorn references in other templates:
Grafana / Prometheus#
In kubernetes-services/templates/grafana.yaml, update the storage configuration:
# Change from:
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: longhorn
resources:
requests:
storage: 40Gi
# To your provider:
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: your-storage-class # or remove to use the cluster default
resources:
requests:
storage: 40Gi
Update both the Prometheus and Grafana volume claims in this file.
Tip
If your replacement storage provider registers itself as the default StorageClass,
you can simply remove the storageClassName field entirely and Kubernetes will use
the default.
Step 5: Add your replacement storage provider#
Create a new ArgoCD Application template for your CSI driver. For example, to use
the built-in K3s local-path provisioner (already included in K3s by default):
# No template needed — local-path-provisioner is built into K3s
# Just remove Longhorn and update storageClassName references to "local-path"
For NFS:
# kubernetes-services/templates/nfs-csi.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nfs-csi
namespace: argo-cd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: kubernetes
destination:
server: https://kubernetes.default.svc
namespace: nfs-csi
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
sources:
- repoURL: https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
targetRevision: "4.9.0"
chart: csi-driver-nfs
helm:
valuesObject:
storageClass:
create: true
name: nfs-csi
reclaimPolicy: Retain
server: 192.168.1.100 # Your NFS server IP
share: /export/k8s # Your NFS export path
Step 6: Commit and push#
git add -A
git commit -m "Replace Longhorn with <your-provider>"
git push
ArgoCD will remove Longhorn and deploy your replacement storage provider.
Common alternative providers#
Provider |
Best for |
Notes |
|---|---|---|
|
Single-node, dev clusters |
Built into K3s, no replication |
NFS CSI |
Shared storage, NAS |
Requires external NFS server |
Rook-Ceph |
Production, multi-node |
Complex setup, high resource usage |
OpenEBS |
Flexible, lightweight |
Multiple engine options |
Democratic CSI |
iSCSI/NFS to TrueNAS |
Good for home labs with NAS |