Since we announced Project Longhorn last year, there has been a great deal of interest in running Longhorn storage on a Kubernetes cluster. Today, I am very excited to announce the availability of Project Longhorn v0.2, which is a persistent storage implementation for any Kubernetes cluster. Once deployed on a Kubernetes cluster, Longhorn automatically clusters all available local storage from all the nodes in the cluster to form replicated and distributed block storage. You can perform snapshot and backup operations on Longhorn volumes, and they will be synchronously replicated onto multiple nodes. We have ported Longhorn Manager to work as a Kubernetes controller. All Longhorn states are stored as Custom Resource Definitions (CRDs). There’s no need for a separate etcd server for Longhorn. Longhorn Manager exposes APIs to perform Longhorn volume operations and snapshot/backup operations, which would be used by the Longhorn UI and Kubernetes Flexvolume driver during the operation. Run this one command to deploy the whole Longhorn storage system on your Kubernetes cluster.

kubectl create -f https://raw.githubusercontent.com/rancher/longhorn/v0.2/deploy/longhorn.yaml

(for GKE, see here) After deployment, you can use the UI by looking into Kubernetes services to find the proper IP: kubectl -n longhorn-system get svc

  NAME                TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
  longhorn-backend    ClusterIP      10.20.248.250   <none>           9500/TCP       58m
  longhorn-frontend   LoadBalancer   10.20.245.110   100.200.200.123   80:12345/TCP   58m

So now you can access the UI using 100.200.200.123, or <node_ip>:12345. Longhorn provides full integration with Kubernetes. You can create a pod with a volume backing by Longhorn like this.

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
  namespace: default
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: voll
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: voll
    flexVolume:
      driver: "rancher.io/longhorn"
      fsType: "ext4"
      options:
        size: "2Gi"
        numberOfReplicas: "3"
        staleReplicaTimeout: "20"
        fromBackup: ""

Longhorn also supports dynamic provisioner. For example, you can define a StorageClass in Kubernetes like this:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn
provisioner: rancher.io/longhorn
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "30"
  fromBackup: ""

Then create a PVC and use it with a Pod:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-volv-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
  namespace: default
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-volv-pvc

Want expert guidance on Longhorn? Sign up for a demo.

Schedule a Demo

Longhorn is a 100% open-source project. To this day, it’s still a work in progress. We appreciate your comments as we continue to work on it!

If you find any bugs or have advice, feel free to contact us through GitHub issues or join the forum to discuss the project.

Sheng Yang

Sheng Yang

Twitter: @yasker

Github: https://github.com/yasker

training

Get free training from an expert through our classes on Kubernetes and Rancher

Sign Up Now