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】:正如您提到的 affinity
和 node selector
的 EBS 卷将停止可扩展性,但只有 ReadWriteOnce
的 EBS 可以工作。
分享我的经验,如果您在文件系统上执行许多操作并经常推送和获取文件,EFS
可能会很慢,这会降低应用程序性能。 EFS 上的运行速度很慢。
但是,您可以在后面使用 GlusterFs
,它将配置 EBS 卷。 GlusterFS
也支持ReadWriteMany
并且与EFS
相比会更快,因为它是块存储(SSD)。
【讨论】:
以上是关于Kubernetes PVC 与 AWS 上的 ReadWriteMany的主要内容,如果未能解决你的问题,请参考以下文章