在kubernetes/k8s StatefulSet中,使用nfs/efs作为PersistentVolume和普通卷的区别是什么?

3

我正在尝试在我们的k8s集群上安装Cassandra有状态副本集。我们希望将AWS EFS挂载到所有Cassandra pod上。在配置卷时,我发现有两种声明卷的方式。

  1. 创建一个EFS,在我们的集群上安装efs-provisioner(一种持久卷插件),创建一个PersistentVolume与EFS-provisioner一起使用,并在Pod模板中使用volumeClaimTemplates(我认为实际上是指persistentVolumeClaimTemplates,我不知道他们为什么忽略了persistent前缀)。像这样:
apiVersion: v1
kind: Pod
metadata:
  name: hello-openshift-nfs-pod 
  labels:
    name: hello-openshift-nfs-pod
spec:
  containers:
    - name: hello-openshift-nfs-pod
      image: openshift/hello-openshift 
      ports:
        - name: web
          containerPort: 80
      volumeMounts:
        - name: nfsvol 
          mountPath: /usr/share/nginx/html 
  securityContext:
      supplementalGroups: [100003] 
      privileged: false
  volumes:
    - name: nfsvol
      persistentVolumeClaim:
        claimName: nfs-pvc 

(来自文章的代码)

  1. 或者,我可以直接将EFS挂载到我的Cassandra pod上:
apiVersion: v1
kind: Pod
metadata:
  name: hello-openshift-nfs-pod 
  labels:
    name: hello-openshift-nfs-pod
spec:
  containers:
    - name: hello-openshift-nfs-pod
      image: openshift/hello-openshift 
      ports:
        - name: web
          containerPort: 80
      volumeMounts:
        - name: nfsvol 
          mountPath: /usr/share/nginx/html 
  securityContext:
      supplementalGroups: [100003] 
      privileged: false
  volumes:
    - name: cassandra-shared-volume
      nfs:
        server: <EFS file system endpoint url>
        path: "/cassandra/shared"


所以对我来说,方法1就像将nfs(在这种情况下是EFS)包装在持久卷中。虽然几乎每个团队都使用nfs,但我不知道方法1的主要好处是什么。在efs-provisioner的FAQ中有一个简短的答案:他们说:“我注意到EFS直接挂载到efs-provisioner容器,我可以为我的应用程序做到这一点吗?是的,但不建议这样做。您会失去StorageClass的可重用性,无法为新容器和Pod动态提供新的PersistentVolumes。” 这个答案很好,但我想知道是否比单独的更有含义。有一个StatefulSet文档说: “给定Pod的存储必须由基于请求的存储类的PersistentVolume Provisioner进行配置,或者由管理员预先配置。”
所以我想知道 StatefulSet 是否必须具有 PersistentVolume 存储类型。主要冲突在于,与块存储不同,EFS 本身是持久性的,并且其动态扩展能力已由 AWS 处理,不需要 persistentVolumeProvisioner 来创建新资源。
我想知道方法1是否有任何重大优点或方法2中的缺陷,我必须使用方法1吗?
1个回答

1

使用SAN和像EFS这样的网络文件系统通常不建议用于Cassandra,因为存在性能问题。根据工作流程,您可以通过临时(实例)存储与EBS相比获得可接受的性能,如此处所述。

添加容器层并未防止这些问题,目前我们正在进行类似的概念验证,设置写入密集型场景,并已能够使用i3实例和临时存储来定义PersistentVolumes,但这还不是最终答复,因为我们继续寻找适合我们目的的正确配置。


是的,他们发现EFS太慢了,然后改用EBS。感谢您的建议~。 - affe
临时存储绝对是最快的选择,因为它是节点上的存储,IO 通过机器总线传递。EBS 和 EFS 都是网络连接存储,因此性能受网络 IO 限制。但是,临时存储只适用于复制或临时文件,因为其生命周期随节点结束而结束。 - Tom Harrison
是的,这将取决于使用情况;在那个时候,我们能够通过临时驱动器大幅降低延迟,但缺点是节点的更换需要更长时间才能完成。 - Carlos Monroy Nieblas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接