AWS 上具有 ReadWriteMany 的 Kubernetes PVC

Kubernetes PVC with ReadWriteMany on AWS

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

我该如何解决这个问题?

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

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

EFS 配置程序可能是测试版,但 EFS 本身不是。由于 EFS 卷可以通过 NFS 安装,您可以简单地手动创建一个带有 NFS 卷源的 PersistentVolume -- 假设自动配置对您而言不是硬性要求:

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

然后您可以使用 PersistentVolumeClaim 声明此卷并像往常一样在 Pod(或多个 Pods)中使用它。

替代解决方案

如果自动配置对您来说是一个硬性要求,您可能会考虑其他解决方案:您可以在集群上部署多个分布式文件系统,它们在 Kubernetes ReadWriteMany 之上提供存储 and/or AWS。例如,您可以查看 Rook(它基本上是 Ceph 的 Kubernetes 操作符)。它也正式处于预发布阶段,但我已经使用过它并且运行得相当好。 还有 GlusterFS operator,它似乎已经有一些稳定的版本。

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

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

Applications running in Kubernetes can use EFS file systems to share data between pods in a scale-out group, or with other applications running within or outside of Kubernetes.

EFS can also help Kubernetes applications be highly available because all data written to EFS is written to multiple AWS Availability zones. If a Kubernetes pod is terminated and relaunched, the CSI driver will reconnect the EFS file system, even if the pod is relaunched in a different AWS Availability Zone.

您可以在 EKS-EFS-CSI user guide 之后将 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"

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

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

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

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

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

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

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

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com

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

注意:您需要将 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

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

正如您提到的带有 affinitynode selector 的 EBS 卷将停止可扩展性,但是只有 ReadWriteOnce 可以使用 EBS。

分享我的经验,如果您在文件系统上执行许多操作并频繁推送和获取文件,EFS 可能会很慢,这会降低应用程序性能。 EFS 的运行速度很慢。

但是,您可以在后面使用 GlusterFs 配置 EBS 卷。 GlusterFS 也支持 ReadWriteMany 并且它比 EFS 更快,因为它是块存储 (SSD)。