在AWS上使用ReadWriteMany的Kubernetes PVC

Gol*_*den 8 kubernetes persistent-volumes aws-ebs

我想在AWS上设置PVC,在此我需要将其ReadWriteMany作为访问模式。不幸的是,EBS仅支持ReadWriteOnce

我该如何解决?

  • 我已经看到有一个AWS EFS的beta提供程序支持ReadWriteMany,但是如上所述,它仍然是beta,并且其安装看起来有些不稳定。
  • 我可以使用节点亲和力将所有依赖EBS卷的Pod强制为单个节点,并保持为ReadWriteOnce,但这会限制可伸缩性。

还有其他解决方法吗?基本上,我需要的是一种持久存储数据的方法,以便在彼此独立的pod之间共享数据。

hel*_*ert 11

在没有自动配置的情况下使用EFS

EFS设置程序可以是beta,但EFS本身不是。由于可以通过NFS挂载EFS卷,因此您可以简单地PersistentVolume手动使用NFS卷源创建一个-假设对您而言,自动配置并不是硬性要求:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-efs-volume
spec:
  capacity:
    storage: 100Gi # Doesn't really matter, as EFS does not enforce it anyway
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  mountOptions:
    - hard
    - nfsvers=4.1
    - rsize=1048576
    - wsize=1048576
    - timeo=600
    - retrans=2
  nfs:
    path: /
    server: fs-XXXXXXXX.efs.eu-central-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用来声明此卷的大小,PersistentVolumeClaim并照常在Pod(或多个Pod)中使用它。

替代解决方案

如果对您而言自动配置非常困难,那么您可以考虑以下替代解决方案:您可以在集群中部署多个分布式文件系统,这些系统ReadWriteMany在Kubernetes和/或AWS之上提供存储。例如,您可以看一下Rook(它基本上是Ceph的Kubernetes运算符)。它也正式处于预发布阶段,但是我已经对其进行了一些操作,并且运行得相当好。还有一个GlusterFS运算符,它似乎已经有一些稳定的发行版。


Yuc*_*uci 6

您可以使用Amazon EFS创建具有ReadWriteMany访问模式的PersistentVolume 。

Amazon EKS于 2019 年 9 月 19 日宣布支持 Amazon EFS CSI 驱动程序,这使得使用标准 Kubernetes 接口为在 AWS 上运行的 EKS 和自我管理的 Kubernetes 集群配置弹性文件存储变得简单。

在 Kubernetes 中运行的应用程序可以使用 EFS 文件系统在横向扩展组中的 Pod 之间共享数据,或者与在 Kubernetes 内部或外部运行的其他应用程序共享数据。

EFS 还可以帮助 Kubernetes 应用程序实现高可用性,因为写入 EFS 的所有数据都会写入多个 AWS 可用区。如果 Kubernetes Pod 终止并重新启动,CSI 驱动程序将重新连接 EFS 文件系统,即使 Pod 在不同的 AWS 可用区中重新启动也是如此。

您可以按照EKS-EFS-CSI 用户指南将 Amazon EFS CSI 驱动程序部署到 Amazon EKS 集群,基本上如下所示:

步骤 1:部署 Amazon EFS CSI 驱动程序

kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
Run Code Online (Sandbox Code Playgroud)

注意:此命令需要 1.14 或更高版本的 kubectl。

步骤 2:为您的 Amazon EKS 集群创建一个 Amazon EFS 文件系统

步骤 2.1:创建一个安全组,允许您的 Amazon EFS 挂载点的入站 NFS 流量。

步骤 2.2:向您的安全组添加规​​则以允许来自您的 VPC CIDR 范围的入站 NFS 流量。

步骤 2.3:创建使用您刚刚创建的安全组配置的 Amazon EFS 文件系统。

现在,您可以ReadWriteMany在具有以下示例清单文件的 EKS Kubernetes 项目中使用具有访问模式的EFS :

1. efs-storage-class.yaml:创建存储类

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
Run Code Online (Sandbox Code Playgroud)

kubectl apply -f efs-storage-class.yaml

2. efs-pv.yaml : 创建 PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: ftp-efs-pv
spec:
  storageClassName: efs-sc
  persistentVolumeReclaimPolicy: Retain
  capacity:
    storage: 10Gi # Doesn't really matter, as EFS does not enforce it anyway
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-642da695
Run Code Online (Sandbox Code Playgroud)

注意:您需要将 volumeHandle 值替换为您的 Amazon EFS 文件系统 ID。

3. efs-pvc.yaml : 创建 PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ftp-pv-claim
  labels:
    app: ftp-storage-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: efs-sc
Run Code Online (Sandbox Code Playgroud)

应该是这样。您需要参考上述官方用户指南以获得详细说明,您还可以在其中找到示例应用程序来验证您的设置。