OpenShift PersistentVolume Operations
External
Internal
Overview
Persistent Volume Operations
List Existent Persistent Volumes
A persistent volume is not a project-specific object, so the following query will return all persistent volumes available to the OpenShift instance.
oc get pv
Details about a Specific Persistent Volume
oc describe pv <persistent-volume-name>
Delete an Unbound Persistent Volume
oc delete pv <persistent-volume-name>
Delete a Bound Persistent Volume
This is dangerous, do it only if you know what you're doing.
Delete the persistent volume claim first:
oc delete pvc <pvc-name>
The volume becomes "Released".
Then disassociate the persistent volume from the persistent volume claim reference, still attached to the volume.
This can be done interactively with oc edit - delete the "claimRef" structure, or with oc patch:
oc patch pv/<persistent-volume-name> --patch='{ "spec": { "claimRef": null}}'
Create a NFS Persistent Volume
Provision the Underlying Storage
Provisioning the underlying storage consists in exporting a NFS volume. On the support node:
1. Create a /etc/exports.d/persistent-volumes.exports file, if it does not exist already
2. Add entries similar to:
/nfs/pv1 192.168.122.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check) /nfs/pv2 192.168.122.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check) /nfs/pv3 192.168.122.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check) /nfs/pv4 192.168.122.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check)
adjusting for local IP and network mask.
3. Create the corresponding local directories.
mkdir pv1 pv2 pv3 pv4 chown nfsnobody:nfsnobody pv1 pv2 pv3 pv4 chmod a+rwx pv*
3. Export new filesystems:
exportfs -av
Create the Persistent Volume Definition File
Create a "pv.yaml" file with the following content:
apiVersion: v1 kind: PersistentVolume metadata: name: pv1 spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: path: /nfs/pv1 server: support.ocp36.local
Make sure the "support.ocp36.local" server is accessible from any node that will use the volume, and the /nfs/pv1 is exported and has sufficient permissions.
Repeat for all persistent volumes, updating "name", "storage" and "path" accordingly.
Create the Volume
oc create -f pv.yaml
Once created, it will shows as:
oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE ... metrics-volume 10Gi RWO Retain Available 25s ...
Note that the volume, even if available, it won't be used until a matching persistent volume claim is declared.
Use a Template
Alternatively, use this template: https://github.com/NovaOrdis/playground/blob/master/openshift/pv-template.yaml and run it as such:
oc process -f ./pv-template.yaml --param NAME=pv9 --param SIZE_GB=2 | oc create -f -
Recycle a "Released" Persistent Volume
See
below.
Persistent Volume Claim Operations
List Existent Persistent Volume Claims for the Current Project
A persistent volume claim is project-specific object, so the following query will return all persistent volume claims available in the current project:
oc get pvc
Create a Persistent Volume Claim
Create a definition of the persistent volume claim, a "pvc.yaml" file with the following content
apiVersion: "v1" kind: "PersistentVolumeClaim" metadata: name: "jenkins-data" spec: accessModes: - "ReadWriteOnce" resources: requests: storage: "2Gi"
Create the persistent volume claim:
oc create -f pvc.yaml
Once created, the persistent volume claim is immediately bound to an available persistent volume, if exists and it matches persistent volume claim's criteria.
Associate a Persistent Volume Claim with a Deployment Configuration
Edit the Deployment Configuration:
oc edit dc/<deployment-configuration-name>
... spec: ... template: ... spec: containers: - name: <container-name> ... volumeMounts: - mountPath: /some/path/inside/the/container name: volume-1 # this is the name of the container volume referred below ... volumes: - name: volume-1 persistentVolumeClaim: claimName: <persistent-volume-claim-name> ...
The same result can be obtained with:
oc set volumes
Unbind a Pod from the Volume
Delete the persistent volume claim:
oc delete pvc <persistent-volume-claim-name>
The associated persistent volume moves to a "Released" state after the persistent volume claim is deleted.
To return the volume to an "Available" state, edit its definition and release the persistent volume claim reference from the volume definition:
oc edit pv pv1 ... kind: PersistentVolume spec: ... claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: metrics-1 namespace: openshift-infra resourceVersion: "2180" uid: 196343eb-c6b8-11e7-9f09-525400360e56 ...
Transitioning the persistent volume from "Released" to "Available" state does not clear the storage content - this will have to be done manually.