In which, we've enabled and disabled the persistence of each component, based on the needs of the deployment. For example, most Redis doesn't need to be persisted and can be disabled.
Here's a common list of options for the persistence field:
subPath and mountPath have been purposely omitted from the above example. This is used internally to debug the Helm Chart.
We do not recommend editing subPath and mountPath.
Dynamic provisioning
To dynamically provision storage, we use a StorageClass. StorageClass is a Kubernetes resource defined by a storage provisioner, which is itself provided by the cloud provider, or by your Kubernetes administrator.
You can list the available provisioners with:
For the sake of the example, we will use local-path as our storage provisioner.
Your StorageClass should look like this:
To inspect the resource definition, you can run:
Behind the scenes of the Helm Chart, persistence is actually a PersistentVolumeClaimTemplate. This is used to generate a PersistentVolumeClaim for each replica of the StatefulSet.
To ask for a volume, simply set:
Upon deployment, the StatefulSet will create a PersistentVolumeClaim with the requested size, which will trigger the creation of a PersistentVolume.
If you think the Helm Chart is too limiting, you can always create your own PVC and set the existingClaim field.
We highly recommend dynamic provisioning for production, for ease of use. You can always fallback to static provisioning if you need to.
For the sake of the example, we will use hostPath with a node selector. If you are interested in other options, you might be interested in checking out Container Storage Interface (CSI) Drivers.
To statically provision a volume, you need to create a PersistentVolume:
We bind the PersistentVolume to the node since the data is local to the node.
If you wish for an alternative that supports data migration, you would use a block storage provided by the cloud provider, or from your own storage infrastructure.
Apply it:
Simply set:
You probably want to claim it with a PersistentVolumeClaim:
## Enable persistence using Persistent Volume Claims
## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
##
persistence:
## @param laputa.persistence.enabled Enable persistence using Persistent Volume Claims
##
enabled: true
## @param laputa.persistence.storageClass Storage class of backing PVC
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
storageClass: ''
## @param laputa.persistence.annotations Persistent Volume Claim annotations
##
annotations: {}
## @param laputa.persistence.accessModes Persistent Volume Access Modes
##
accessModes:
- ReadWriteOnce
## @param laputa.persistence.size Size of data volume
##
size: 8Gi
## @param laputa.persistence.existingClaim The name of an existing PVC to use for persistence
##
existingClaim: ''
## @param laputa.persistence.selector Selector to match an existing Persistent Volume for WordPress data PVC
## If set, the PVC can't have a PV dynamically provisioned for it
## E.g.
## selector:
## matchLabels:
## app: my-app
##
selector: {}
## @param laputa.persistence.dataSource Custom PVC data source
##
dataSource: {}
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-volume-0
labels:
app: my-app
spec:
capacity:
storage: 8Gi
hostPath:
path: /path/to/host/volume
type: DirectoryOrCreate
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain # Highly recommended in static provisioning
storageClassName: '' # Set an empty string to disable dynamic provisioning
volumeMode: Filesystem
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- controller-0 # The name of the node
shell
kubectl apply -f pv.yaml
yaml: values.override.yaml
persistence:
selector:
matchLabels:
app: my-app # Must match the labels of the PV
storageClass: '-'
yaml: pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
storageClassName: ''
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
volumeName: my-volume-0 # Must match the name of the PV
# Alternatively, you can also set a selector.