13

I have the following persistent volume and volume claim:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: kloud
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 172.21.51.42
    path: /
    readOnly: false

and:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: kloud
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi

The nfs server is AWS EFS. I specifically ssh to k8s master and checked that I can manually mount the NFS volume. But when I create the volume and the claim with kubectl it indefinitely hangs there pending:

$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   STORAGECLASS   AGE
kloud     Pending                                      gp2            8s

If I change the mode to ReadWriteOnce, it works as expected and won't hang.

$ kubectl get pvc
NAME      STATUS    VOLUME                                     CAPACITY   ACCESSMODES   STORAGECLASS   AGE
kloud     Bound     pvc-c9a01bff-94d0-11e7-8ed4-0aec4a0f734a   100Gi      RWO           gp2       

Is there something I missing? How can I create a RWX claim with k8s and EFS?

vascop
  • 4,972
  • 4
  • 37
  • 50
oz123
  • 27,559
  • 27
  • 125
  • 187

1 Answers1

14

You will need to setup the EFS-provisioner in your cluster. Mounting EFS is still not supported by the default Kubernetes distribution and as such you need this extension: https://github.com/kubernetes-incubator/external-storage/tree/master/aws/efs

You'll need to set up it's storage class:

    kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: aws-efs
provisioner: example.com/aws-efs

And then write PVC's of the type:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: efs
  annotations:
    volume.beta.kubernetes.io/storage-class: "aws-efs"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

Don't mind the storage size, although it's not used by EFS, Kubernetes requires you to set something there for it to work.

vascop
  • 4,972
  • 4
  • 37
  • 50
  • should I replace `example.com` with my master hostname? e.s. `k8s-master.mydomain.cloud`? what is this for? – oz123 Oct 14 '17 at 11:30
  • It can be whatever you want, it's just so you have something for resources to reference when they want to use this storageclass. – vascop Oct 14 '17 at 12:17
  • Hi vascop, Thanks for the answer. I am using the link: https://github.com/kubernetes-incubator/external-storage/tree/master/aws/efs to create PVC, but I am getting timeout error, Any idea why I am getting this error? Complete error message timeout expired waiting for volumes to attach or mount for pod "default"/"efs-provisioner-55dcf9f58d-r547q". MountVolume.SetUp failed for volume "pv-volume" : mount failed: exit status 32 – Pruthviraj Jul 27 '18 at 16:26