VolumeClaim in Kubernetes Google Cloud

5/31/2018

I am trying to create both a PersistentVolume and a PersistentVolumeClaim on Google Kubernetes Engine.

The way to link them is via labelSelector. I am creating the objects with this definition:

volume.yml

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-test
  namespace: mynamespace
  labels:
    pv-owner: owner
    pv-usage: pv-test
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 1Gi
  hostPath:
    path: /data/test/
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-test
  namespace: mynamespace
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      pv-usage: pv-test

and running:

kubectl apply -f volume.yml

Both objects are successfully created, however, VolumeClaim apparently keeps pending forever awaiting a Volume that matches its requirements.

Could you please help me?

Thanks!

-- user2798792
google-cloud-platform
google-kubernetes-engine
kubernetes

2 Answers

5/31/2018

Thanks for your help @konstantin-vustin

I found the solution. I had to specify storageClassName: manual attribute in the spec of both objects.

https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class

According to the doc

A PV with no storageClassName has no class and can only be bound to PVCs that request no particular class.

So IMO it should have worked before, so I am not sure if I clearly understood it.

This was the status before

kubectl get pv pv-test-vol && kubectl get pvc pv-test --namespace openwhisk
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv-test-vol   2Gi        RWO            Retain           Available             manual                   26s
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pv-test   Pending                                       standard       26s

The updated definitions

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-test
  namespace: mynamespace
  labels:
    pv-owner: owner
    pv-usage: pv-test
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 1Gi
  hostPath:
    path: /data/test/
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-test
  namespace: mynamespace
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      pv-usage: pv-test

This is the status after

kubectl get pv pv-test-vol && kubectl get pvc pv-test --namespace openwhisk
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM               STORAGECLASS   REASON    AGE
pv-test-vol   2Gi        RWO            Retain           Bound     openwhisk/pv-test   manual                   4s
NAME      STATUS    VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pv-test   Bound     pv-test-vol   2Gi        RWO            manual         4s
-- user2798792
Source: StackOverflow

5/31/2018

First of all, PersistentVolume resources don’t belong to any namespace. They’re cluster-level resources like nodes, but PersistentVolumeClaim objects can only be created in a specific namespace.

Seems like when you created the claim earlier, it was immediately bound to the PersistentVolume. Can you show output of the commands:

$ kubectl get pv
$ kubectl get pvc

Highly likely your persistentVolumeReclaimPolicy was set to Retain, so your PersistentVolume is in Released status now. Since there is no another PersistenVolume resource matches your claim's requirements your PersistentVolumeClaim is in Pending status.

-- Konstantin Vustin
Source: StackOverflow