Restore a PVC from an Existing Openstack Volume
Normally, creating a PVC (PersistentVolumeClaim) in one of our Kubernetes clusters triggers the creation of a new PV (PersistentVolume) in Kubernetes and a new Volume in Openstack respectively. But it is also possible to use an existing Openstack volume for that purpose as described in this section.
Prerequisites
As a prerequisite, you need an existing, unused volume in Openstack. This could be the case, for example, if you have deleted a cluster without deleting all attached PVCs before, or if you want to move a volume from one cluster to another.
To be able to use an existing Openstack volume in a Kubernetes cluster, you need to find out its ID. To do so, go to the Openstack/Optimist Dashboard:
Log in with your credentials. The credentials of the Kubernetes UI and Openstack dashboard are identical. Once you are logged in, navigate to Volumes
and search for the volume which you want to use. That volume should not be used by any machine and should have the status “Available”. (Note: A volume can only be used by one instance at a time, so if it is still in use, you have to detach it from the old instance first.)
After you found the volume you want to use, click on its name. This brings you to the volume details page where you can find the ID of the volume. Note down this ID.
Adding the PV with the Existing Volume
To manually create a PV that references an existing volume, you have to specify the volume ID in the spec.csi.volumeHandle
-key in the PersistentVolume
-manifest:
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-restore
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 3Gi
csi:
driver: cinder.csi.openstack.org
volumeHandle: 6515d33b-287d-43e1-a3c5-e347d2fc8135
persistentVolumeReclaimPolicy: Delete
storageClassName: cinder-csi
volumeMode: Filesystem
Apply this manifest and check if the PV got created successfully:
# kubectl apply -f restore-pv.yaml
persistentvolume/test-pv-restore created
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv-restore 3Gi RWO Delete Available cinder-csi 3s
This example created a PV named test-pv-restore
that referenced the existing Openstack volume.
Adding the PVC Referencing the Correct PV
Next, a PVC needs to be build which references the PV you just created. To do so, the PVC needs to have the spec.volumeName
-key set to the PV name:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
volumeName: test-pv-restore
Applying this manifest should result in a PVC in state “Bound”:
# kubectl apply -f restore-pvc.yaml
persistentvolumeclaim/test-pvc created
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-pvc Bound test-pv-restore 3Gi RWO cinder-csi 2s
This PVC named “test-pvc” is now ready to be used by a Pod.
Creating a Test-Pod to Inspect the Data
As you may want to inspect the PVC before using it, let’s create a test-pod to inspect the data on the volume:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: ubuntu
command:
- "sleep"
- "604800"
volumeMounts:
- mountPath: "/restore"
name: test-pvc
volumes:
- name: test-pvc
persistentVolumeClaim:
claimName: test-pvc
The important part in the above example is that the claimName
is set correctly to the PVC which we just created. After applying the manifest and creating the Pod, the volume from our example is mounted under /restore – which you can check by executing into the pod and opening a shell:
# kubectl apply -f pvc-example/test-pod.yaml
pod/test-pod created
# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
test-pod 0/1 ContainerCreating 0 5s
test-pod 0/1 ContainerCreating 0 17s
test-pod 1/1 Running 0 22s
^C
# kubectl exec -ti test-pod -- /bin/bash
root@test-pod:/# ls /restore/
lost+found my_data.txt
root@test-pod:/# exit
exit
That’s basically it – you have used an existing Openstack volume and added to a Pod in your Kubernetes cluster.