Examples
For reference, this page provides examples of Kubernetes resources that use Longhorn storage.
- Block volume
- CSI persistent volume
- Deployment
- Pod with PersistentVolumeClaim
- Restore to file
- Simple Pod
- Simple PersistentVolumeClaim
- StatefulSet
- StorageClass
Block Volume
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: longhorn-block-volspec:accessModes:- ReadWriteOncevolumeMode: BlockstorageClassName: longhornresources:requests:storage: 2Gi---apiVersion: v1kind: Podmetadata:name: block-volume-testnamespace: defaultspec:containers:- name: block-volume-testimage: nginx:stable-alpineimagePullPolicy: IfNotPresentvolumeDevices:- devicePath: /dev/longhorn/testblkname: block-volports:- containerPort: 80volumes:- name: block-volpersistentVolumeClaim:claimName: longhorn-block-vol
CSI Persistent Volume
apiVersion: v1kind: PersistentVolumemetadata:name: longhorn-vol-pvspec:capacity:storage: 2GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: DeletestorageClassName: longhorncsi:driver: driver.longhorn.iofsType: ext4volumeAttributes:numberOfReplicas: '3'staleReplicaTimeout: '2880'volumeHandle: existing-longhorn-volume---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: longhorn-vol-pvcspec:accessModes:- ReadWriteOnceresources:requests:storage: 2GivolumeName: longhorn-vol-pvstorageClassName: longhorn---apiVersion: v1kind: Podmetadata:name: volume-pv-testnamespace: defaultspec:restartPolicy: Alwayscontainers:- name: volume-pv-testimage: nginx:stable-alpineimagePullPolicy: IfNotPresentlivenessProbe:exec:command:- ls- /data/lost+foundinitialDelaySeconds: 5periodSeconds: 5volumeMounts:- name: volmountPath: /dataports:- containerPort: 80volumes:- name: volpersistentVolumeClaim:claimName: longhorn-vol-pvc
Deployment
apiVersion: v1kind: Servicemetadata:name: mysqllabels:app: mysqlspec:ports:- port: 3306selector:app: mysqlclusterIP: None---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: mysql-pvcspec:accessModes:- ReadWriteOncestorageClassName: longhornresources:requests:storage: 2Gi---apiVersion: apps/v1kind: Deploymentmetadata:name: mysqllabels:app: mysqlspec:selector:matchLabels:app: mysql # has to match .spec.template.metadata.labelsstrategy:type: Recreatetemplate:metadata:labels:app: mysqlspec:restartPolicy: Alwayscontainers:- image: mysql:5.6name: mysqllivenessProbe:exec:command:- ls- /var/lib/mysql/lost+foundinitialDelaySeconds: 5periodSeconds: 5env:- name: MYSQL_ROOT_PASSWORDvalue: changemeports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-volumemountPath: /var/lib/mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: "rancher"volumes:- name: mysql-volumepersistentVolumeClaim:claimName: mysql-pvc
Pod with PersistentVolumeClaim
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: longhorn-volv-pvcspec:accessModes:- ReadWriteOncestorageClassName: longhornresources:requests:storage: 2Gi---apiVersion: v1kind: Podmetadata:name: volume-testnamespace: defaultspec:restartPolicy: Alwayscontainers:- name: volume-testimage: nginx:stable-alpineimagePullPolicy: IfNotPresentlivenessProbe:exec:command:- ls- /data/lost+foundinitialDelaySeconds: 5periodSeconds: 5volumeMounts:- name: volvmountPath: /dataports:- containerPort: 80volumes:- name: volvpersistentVolumeClaim:claimName: longhorn-volv-pvc
Restore to File
For more information about restoring to file, refer to this section.
apiVersion: v1kind: Podmetadata:name: restore-to-filenamespace: longhorn-systemspec:nodeName: <NODE_NAME>containers:- name: restore-to-filecommand:# set restore-to-file arguments here- /bin/sh- -c- longhorn backup restore-to-file'<BACKUP_URL>'--output-file '/tmp/restore/<OUTPUT_FILE>'--output-format <OUTPUT_FORMAT># the version of longhorn engine should be v0.4.1 or higherimage: longhorn/longhorn-engine:v0.4.1imagePullPolicy: IfNotPresentsecurityContext:privileged: truevolumeMounts:- name: disk-directorymountPath: /tmp/restore # the argument <output-file> should be in this directoryenv:# set Backup Target Credential Secret here.- name: AWS_ACCESS_KEY_IDvalueFrom:secretKeyRef:name: <S3_SECRET_NAME>key: AWS_ACCESS_KEY_ID- name: AWS_SECRET_ACCESS_KEYvalueFrom:secretKeyRef:name: <S3_SECRET_NAME>key: AWS_SECRET_ACCESS_KEY- name: AWS_ENDPOINTSvalueFrom:secretKeyRef:name: <S3_SECRET_NAME>key: AWS_ENDPOINTSvolumes:# the output file can be found on this host path- name: disk-directoryhostPath:path: /tmp/restorerestartPolicy: Never
Simple Pod
apiVersion: v1kind: Podmetadata:name: longhorn-simple-podnamespace: defaultspec:restartPolicy: Alwayscontainers:- name: volume-testimage: nginx:stable-alpineimagePullPolicy: IfNotPresentlivenessProbe:exec:command:- ls- /data/lost+foundinitialDelaySeconds: 5periodSeconds: 5volumeMounts:- name: volvmountPath: /dataports:- containerPort: 80volumes:- name: volvpersistentVolumeClaim:claimName: longhorn-simple-pvc
Simple PersistentVolumeClaim
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: longhorn-simple-pvcspec:accessModes:- ReadWriteOncestorageClassName: longhornresources:requests:storage: 1Gi
StatefulSet
apiVersion: v1kind: Servicemetadata:name: nginxlabels:app: nginxspec:ports:- port: 80name: webselector:app: nginxtype: NodePort---apiVersion: apps/v1kind: StatefulSetmetadata:name: webspec:selector:matchLabels:app: nginx # has to match .spec.template.metadata.labelsserviceName: "nginx"replicas: 2 # by default is 1template:metadata:labels:app: nginx # has to match .spec.selector.matchLabelsspec:restartPolicy: AlwaysterminationGracePeriodSeconds: 10containers:- name: nginximage: k8s.gcr.io/nginx-slim:0.8livenessProbe:exec:command:- ls- /usr/share/nginx/html/lost+foundinitialDelaySeconds: 5periodSeconds: 5ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "longhorn"resources:requests:storage: 1Gi
StorageClass
kind: StorageClassapiVersion: storage.k8s.io/v1metadata:name: longhornprovisioner: driver.longhorn.ioallowVolumeExpansion: truereclaimPolicy: DeletevolumeBindingMode: Immediateparameters:numberOfReplicas: "3"staleReplicaTimeout: "2880" # 48 hours in minutesfromBackup: ""fsType: "ext4"# backingImage: "bi-test"# backingImageDataSourceType: "download"# backingImageDataSourceParameters: '{"url": "https://backing-image-example.s3-region.amazonaws.com/test-backing-image"}'# backingImageChecksum: "SHA512 checksum of the backing image"# diskSelector: "ssd,fast"# nodeSelector: "storage,fast"# recurringJobSelector: '[# {# "name":"snap",# "isGroup":true,# },# {# "name":"backup",# "isGroup":false,# }# ]'
Note that Longhorn supports automatic remount only for the workload pod that is managed by a controller (e.g. deployment, statefulset, daemonset, etc…). See here for details.