When deploying an application that needs to retain data, you’ll need to create persistent storage. Persistent storage allows you to store application data external from the pod running your application. This storage practice allows you to maintain application data, even if the application’s pod fails.

Local Storage Provider

K3s comes with Rancher’s Local Path Provisioner and this enables the ability to create persistent volume claims out of the box using local storage on the respective node. Below we cover a simple example. For more information please reference the official documentation here.

Create a hostPath backed persistent volume claim and a pod to utilize it:

pvc.yaml

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: local-path-pvc
  5. namespace: default
  6. spec:
  7. accessModes:
  8. - ReadWriteOnce
  9. storageClassName: local-path
  10. resources:
  11. requests:
  12. storage: 2Gi

pod.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: volume-test
  5. namespace: default
  6. spec:
  7. containers:
  8. - name: volume-test
  9. image: nginx:stable-alpine
  10. imagePullPolicy: IfNotPresent
  11. volumeMounts:
  12. - name: volv
  13. mountPath: /data
  14. ports:
  15. - containerPort: 80
  16. volumes:
  17. - name: volv
  18. persistentVolumeClaim:
  19. claimName: local-path-pvc

Apply the yaml kubectl create -f pvc.yaml and kubectl create -f pod.yaml

Confirm the PV and PVC are created. kubectl get pv and kubectl get pvc The status should be Bound for each.

Longhorn

Note: At this time Longhorn only supports amd64.

K3s supports Longhorn. Below we cover a simple example. For more information please reference the official documentation here.

Apply the longhorn.yaml to install Longhorn.

  1. kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

Longhorn will be installed in the namespace longhorn-system.

Before we create a PVC, we will create a storage class for longhorn with this yaml.

  1. kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/master/examples/storageclass.yaml

Now, apply the following yaml to create the PVC and pod with kubectl create -f pvc.yaml and kubectl create -f pod.yaml

pvc.yaml

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: longhorn-volv-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. storageClassName: longhorn
  9. resources:
  10. requests:
  11. storage: 2Gi

pod.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: volume-test
  5. namespace: default
  6. spec:
  7. containers:
  8. - name: volume-test
  9. image: nginx:stable-alpine
  10. imagePullPolicy: IfNotPresent
  11. volumeMounts:
  12. - name: volv
  13. mountPath: /data
  14. ports:
  15. - containerPort: 80
  16. volumes:
  17. - name: volv
  18. persistentVolumeClaim:
  19. claimName: longhorn-volv-pvc

Confirm the PV and PVC are created. kubectl get pv and kubectl get pvc The status should be Bound for each.