OpenShift PersistentVolume Operations

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

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

Unbind a Pod from the Volume

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>
     ...

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.