如何使用 AWS EFS 和 ReadWriteMany 配置 Persistent Volume Claim?

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

我有以下持久卷和卷声明:

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

和:

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

nfs 服务器是 AWS EFS。我专门 ssh 到 k8s master 并检查我是否可以手动挂载 NFS 卷。但是当我使用 kubectl 创建卷和声明时,它会无限期地挂在那里待定:

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

如果我将模式更改为 ReadWriteOnce,它会按预期工作并且不会挂起。

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

有什么我遗漏的吗?如何使用 k8s 和 EFS 创建 RWX 声明?

您需要在集群中设置 EFS 供应器。默认 Kubernetes 发行版仍然不支持安装 EFS,因此您需要此扩展:https://github.com/kubernetes-incubator/external-storage/tree/master/aws/efs

您需要设置它的存储空间 class:

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

然后写入 PVC 的类型:

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

不要介意存储大小,虽然 EFS 不使用它,但 Kubernetes 需要您在那里设置一些东西才能工作。