Search code examples
kubernetespersistencerenamegoogle-kubernetes-engine

How to rename persistence volume claim?


Is is possible to rename a PVC? I can't seem to find an evidence it is possible.


I'm trying mitigate an "No space left of device" issue I just stumbled upon. Essentially my plan requires me to resize the volume, on which my service persists its data.

Unfortunately I'm still on Kubernetes 1.8.6 on GKE. It does not have the PersistentVolumeClaimResize admission plugin enabled:

Therefor I have to try and save the data manually. I made the following plan:

  1. create a new, bigger volume PVC,
  2. create a temp container with attached "victim" pvc and a new bigger pvc,
  3. copy the data,
  4. drop "victim" PVC,
  5. rename new bigger pvc to take place of "victim".

The PVC in question is attached to StatefulSet, so the old and new names must match (as StatefulSet expects follows the volume naming convention).

But I don't understand how to rename persistent volume claims.


Solution

  • The answer of your question is NO. There is no way to change any meta name in Kubernetes.

    But, there is a way to fulfill your requirement.

    You want to claim your new bigger PersistentVolume by old PersistentVolumeClaim.

    Lets say, old PVC named victim and new PVC named bigger. You want to claim PV created for bigger by victim PVC. Because your application is already using victim PVC.

    Follow these steps to do the hack.

    Step 1: Delete your old PVC victim.

    Step 2: Make PV of bigger Available.

    $ kubectl get pvc bigger
    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    bigger    Bound     pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            standard       30s
    

    Edit PV pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6 to set persistentVolumeReclaimPolicy to Retain. So that deleting PVC will not delete PV.

    Now, delete PVC bigger.

    $ kubectl delete pvc bigger
    
    $ kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON    AGE
    pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            Retain           Released   default/bigger   standard                 3m
    

    See the status, PV is Released.

    Now, make this PV available to be claimed by another PVC, our victim.

    Edit PV again to remove claimRef

    $ kubectl edit pv pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6
    
    $ kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
    pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            Retain           Available             standard                 6m
    

    Now the status of PV is Available.

    Step 3: Claim bigger PV by victim PVC

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: victim
    spec:
      accessModes:
        - ReadWriteOnce
      volumeName: pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6
      resources:
        requests:
          storage: 10Gi
    

    Use volumeName pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6

    kubectl get pvc,pv
    NAME         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc/victim   Bound     pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            standard       9s
    
    NAME                                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM            STORAGECLASS   REASON    AGE
    pv/pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            Retain           Bound     default/victim   standard                 9m
    

    Finally: Set persistentVolumeReclaimPolicy to Delete

    This is how, your PVC victim has had bigger PV.