Search code examples
linuxamazon-web-serviceskubernetesnfs

How to configure a Persistent Volume Claim using AWS EFS and ReadWriteMany?


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?


Solution

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