Using Longhorn persistent volumes

Installation note:

Longhorn requires a minimum of 3 nodes to function, if you attempt to install Longhorn on cluster smaller than this, it will not function properly. If you have installed Longhorn on a cluster that is too small, you will encounter errors from Longhorn, but you can simply scale the cluster up to a 3 node minimum and the issue will resolve itself automatically.

External access

By default external access to the Longhorn dashboard isn't available. This is easily changed by applying the following YAML to your cluster with kubectl apply -f longhorn-service.yaml (or whatever you call the file containing the contents below) which will launch a Civo Load Balancer (at an additional charge):

kind: Service
apiVersion: v1
metadata:
  labels:
    app: longhorn-ui
  name: longhorn-frontend
  namespace: longhorn-system
spec:
  selector:
    app: longhorn-ui
  ports:
  - port: 8000
    targetPort: 8000
  type: LoadBalancer

This will open up http://YOURCLUSTERID.k8s.civo.com:8000/dashboard to the whole world. You should lock this down in the firewall automatically created in Civo for your Kubernetes cluster. Locking down the firewall will only affect access from OUTSIDE of your Kubernetes cluster, access from your applications within Kubernetes will not be affected.

Usage instructions

Longhorn will be set as the default storage class. As such, and PersistentVolumeClaim (pvc) will automatically have storage provisioned with Longhorn's defaults. An example of such a request would be:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-simple
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

If you want to have more control over the longhorm volume properties (replica count, etc), create the PersistentVolume first. An example such as pv.yaml could be used:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    name: mysql-data
    type: longhorn
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  storageClassName: longhorn
  accessModes:
    - ReadWriteOnce
  csi:
    driver: io.rancher.longhorn
    fsType: ext4
    volumeAttributes:
      numberOfReplicates: '2'
      staleReplicaTimeout: '20'
    volumeHandle: mysql-data

And create a claim to that volume (like an abstract request so that something can use the volume) in something like pv-claim.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    type: longhorn
    app: example
spec:
  storageClassName: longhorn
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi