AWS 上具有 ReadWriteMany 的 Kubernetes PVC
Kubernetes PVC with ReadWriteMany on AWS
我想在 AWS 上设置 PVC,我需要 ReadWriteMany
作为访问模式。不幸的是,EBS 只支持 ReadWriteOnce
.
我该如何解决这个问题?
- 我看到有一个支持
ReadWriteMany
的 AWS EFS 测试版提供程序,但如前所述,这仍然是测试版,它的安装看起来有些不稳定。
- 我可以使用节点亲和力将所有依赖于 EBS 卷的 pods 强制到单个节点,并保持
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 以获得详细说明,您还可以在其中找到示例应用程序来验证您的设置。
正如您提到的带有 affinity
和 node selector
的 EBS 卷将停止可扩展性,但是只有 ReadWriteOnce
可以使用 EBS。
分享我的经验,如果您在文件系统上执行许多操作并频繁推送和获取文件,EFS
可能会很慢,这会降低应用程序性能。 EFS 的运行速度很慢。
但是,您可以在后面使用 GlusterFs
配置 EBS 卷。 GlusterFS
也支持 ReadWriteMany
并且它比 EFS
更快,因为它是块存储 (SSD)。
我想在 AWS 上设置 PVC,我需要 ReadWriteMany
作为访问模式。不幸的是,EBS 只支持 ReadWriteOnce
.
我该如何解决这个问题?
- 我看到有一个支持
ReadWriteMany
的 AWS EFS 测试版提供程序,但如前所述,这仍然是测试版,它的安装看起来有些不稳定。 - 我可以使用节点亲和力将所有依赖于 EBS 卷的 pods 强制到单个节点,并保持
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 以获得详细说明,您还可以在其中找到示例应用程序来验证您的设置。
正如您提到的带有 affinity
和 node selector
的 EBS 卷将停止可扩展性,但是只有 ReadWriteOnce
可以使用 EBS。
分享我的经验,如果您在文件系统上执行许多操作并频繁推送和获取文件,EFS
可能会很慢,这会降低应用程序性能。 EFS 的运行速度很慢。
但是,您可以在后面使用 GlusterFs
配置 EBS 卷。 GlusterFS
也支持 ReadWriteMany
并且它比 EFS
更快,因为它是块存储 (SSD)。