Container Storage
Volumes
The containers have a temporary file system, if you restart the container the file system will be deleted.
- Ephemeral Volumes: exist for the lifespan of a pod. Useful for sharing data between multiple containers running in a pod
- Persistent Volumes: preserve data beyond the lifespan of a pod.
Define a volume using spec.volumes[] and then reference it in a container
with spec.containers[].volume.volumeMounts
Volume Types
There are a lot, some are only offered by certain cloud providers.
Some of the common ones:
emptyDir: Empty dir in a pod with read/write access. Ephemeral.hostPath: Point to a file in the host.configMap: Mount config datanfs: provide a network file system. Persistent.
Ephemeral Volume
We need to define the volume first in spec.volumes and then reference it
inside spec.containers.volumeMounts
Here is an example:
apiVersion: v1
kind: Pod
metadata: Pod
name: my-container
spec:
volumes:
- name: logs-volume
emptyDir: {}
containers:
- image: nginx
name: my-container
volumeMounts:
- mounthPath: /var/logs
name: logs-volume
Persistent Volume
We need to create two more objects to create this type of volume.
PersistentVolume(PV): piece of storage in the cluster provisioned by an adminPersistentVolumeClaim (PVC): consumes PV, similar to how a pod consumes node resources (cpu, memory) here thepvcconsumes storage from apv
There are different ways on how we can provision this type of storage.
- static provisioning: we create the
PersistentVolumeobject by ourselves. - dynamic provisioning: automatically creates the
PersistentVolumeobject - storage class: obj/s that already exist in the k8s cluster. (setup by admin)
Defining a PersistentVolume
We need to set capacity, access mode, and host path
apiVersion: v1
kind: PersistentVolume
metadata:
name: db-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/db
Access Modes:
ReadWriteOnce: rw by single nodeReadOnlyMany: r by many nodesReadWriteMany: rw by many nodesReadWriteOncePod: rw mounted by a single pod
Reclaim Policy:
Retain: default. When PVC (persisted volume claim) is deleted the pv is released and can be reclaimed.Delete: Deletion removes PV and associated storage.
How to use it.
So once we have our pv, we need to create a pvc to claim storage from that
pv.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: "" # empty means we will use a statically-created pv
When we create it we need to check that the state is Bound.
In the pod, we create the volume as regular and assign it to the container.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
volumes:
- name: app-storage
persistentVolumeClaim:
claimName: db-pvc # reference the volume by pvc name
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/mnt/data"
name: app-storage