Kubernetes PVC 与 AWS 上的 ReadWriteMany

Posted

技术标签:

【中文标题】Kubernetes PVC 与 AWS 上的 ReadWriteMany【英文标题】:Kubernetes PVC with ReadWriteMany on AWS 【发布时间】:2018-12-15 05:03:38 【问题描述】:

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

我该如何解决这个问题?

我看到有一个支持 ReadWriteMany 的 AWS EFS 测试版提供程序,但如上所述,这仍然是测试版,它的安装看起来有些不稳定。 我可以使用节点关联性将所有依赖 EBS 卷的 pod 强制到单个节点,并保留在 ReadWriteOnce 上,但这会限制可扩展性。

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

【问题讨论】:

【参考方案1】:

使用没有自动配置的 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(或多个 Pod)中使用它。

替代解决方案

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

【讨论】:

当我将 PersistentVolumeClaim 中的 storageClassName 显式设置为“”时,此示例对我来说效果很好。如果未明确设置,则假定为 gp2,这将导致错误消息,例如“无法使用 StorageClass“gp2”配置卷:无效的 AccessModes [ReadWriteMany]:仅支持 AccessModes [ReadWriteOnce]”【参考方案2】:

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

Amazon EKS Announced 于 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 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:创建存储类

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,您也可以在其中找到示例应用来验证您的设置。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于Kubernetes PVC 与 AWS 上的 ReadWriteMany的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes PV与PVC 持久卷应用

Kubernetes PV与PVC 持久卷应用

Kubernetes PV与PVC 持久卷应用

kubernetes 使用 PV 和 PVC 管理数据存储

Kubernetes 系列:持久化存储 PV与PVC

通过 AWS 上的 ELB 在 Kubernetes 上公开单个 Kafka 代理