In this section, you’ll learn how to uninstall Longhorn.

To prevent Longhorn from being accidentally uninstalled (which leads to data lost), we introduce a new setting, . If this flag is false, the Longhorn uninstallation job will fail. Set this flag to true to allow Longhorn uninstallation. You can set this flag using setting page in Longhorn UI or

To prevent damage to the Kubernetes cluster, we recommend deleting all Kubernetes workloads using Longhorn volumes (PersistentVolume, PersistentVolumeClaim, StorageClass, Deployment, StatefulSet, DaemonSet, etc).

From Rancher UI, navigate to Catalog Apps tab and delete Longhorn app.

Run this command:

  1. Create the uninstallation job to clean up CRDs from the system and wait for success:

    1. kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/v1.4.1/uninstall/uninstall.yaml
    2. kubectl get job/longhorn-uninstall -n longhorn-system -w

    Example output:

    1. serviceaccount/longhorn-uninstall-service-account created
    2. clusterrole.rbac.authorization.k8s.io/longhorn-uninstall-role created
    3. clusterrolebinding.rbac.authorization.k8s.io/longhorn-uninstall-bind created
    4. job.batch/longhorn-uninstall created
    5. $ kubectl get job/longhorn-uninstall -n longhorn-system -w
    6. NAME COMPLETIONS DURATION AGE
    7. longhorn-uninstall 0/1 3s 3s
    8. longhorn-uninstall 1/1 20s 20s

Uninstalling using Rancher UI or Helm failed, I am not sure why

You might want to check the logs of the longhorn-uninstall-xxx pod inside longhorn-system namespace to see why it failed. One reason can be that is false. You can set it to true by using setting page in Longhorn UI or kubectl -n longhorn-system patch -p '{"value": "true"}' --type=merge lhs deleting-confirmation-flag then retry the Helm/Rancher uninstallation.

If the uninstallation was an accident (you don’t actually want to uninstall Longhorn), you can cancel the uninstallation as the following.

  1. If you use Rancher UI to deploy Longhorn

    1. Open a kubectl shell on Rancher UI
    2. Find the latest revision of Longhorn release

      1. > helm list -n longhorn-system -a
      2. NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
      3. longhorn longhorn-system 2 2022-10-14 01:22:36.929130451 +0000 UTC uninstalling longhorn-100.2.3+up1.3.2-rc1 v1.3.2-rc1
    3. Rollback to the latest revision

      1. > helm rollback longhorn 2 -n longhorn-system
      2. checking 22 resources for changes
      3. Rollback was a success! Happy Helming!
  2. If you use Helm deploy Longhorn

    1. Open a kubectl terminal
    2. Rollback to the latest revision

      1. helm rollback longhorn 1 -n longhorn-system
      2. Rollback was a success! Happy Helming!

I deleted the Longhorn App from Rancher UI instead of following the uninstallation procedure

Redeploy the (same version) Longhorn App. Follow the uninstallation procedure above.

Problems with CRDs

If your CRD instances or the CRDs themselves can’t be deleted for whatever reason, run the commands below to clean up. Caution: this will wipe all Longhorn state!

  1. # Delete CRD finalizers, instances and definitions
  2. for crd in $(kubectl get crd -o jsonpath={.items[*].metadata.name} | tr ' ' '\n' | grep longhorn.rancher.io); do
  3. kubectl -n ${NAMESPACE} get $crd -o yaml | sed "s/\- longhorn.rancher.io//g" | kubectl apply -f -
  4. kubectl -n ${NAMESPACE} delete $crd --all
  5. kubectl delete crd/$crd

Volume can be attached/detached from UI, but Kubernetes Pod/StatefulSet etc cannot use it

Check if volume plugin directory has been set correctly. This is automatically detected unless user explicitly set it. Note: The FlexVolume plugin is deprecated as of Longhorn v0.8.0 and should no longer be used.

By default, Kubernetes uses /usr/libexec/kubernetes/kubelet-plugins/volume/exec/, as stated in the .

Some vendors choose to change the directory for various reasons. For example, GKE uses /home/kubernetes/flexvolume instead.

User can find the correct directory by running ps aux|grep kubelet on the host and check the --volume-plugin-dir parameter. If there is none, the default will be used.