Kubernetes 如果我有一个PVC在所有statefulset副本中共享同一卷,是否存在任何技术问题?

Kubernetes 如果我有一个PVC在所有statefulset副本中共享同一卷,是否存在任何技术问题?,kubernetes,kubernetes-statefulset,kubernetes-pvc,Kubernetes,Kubernetes Statefulset,Kubernetes Pvc,Kubernetes为statefulset上的每个VolumeClaimTemplate定义创建一个PersistentVolume。这使得每个statefulset pod都有自己的存储,而不是在副本之间共享。但是,我希望在所有statefulset副本中共享相同的卷 看起来应该采用以下方法: 在同一命名空间上创建PVC 在statefulset上,使用卷绑定PVC 确保PVC为ReadOnlyMany或ReadWriteMany 假设我的应用程序能够处理共享卷上的任何并发,如果我有一个PV

Kubernetes为statefulset上的每个VolumeClaimTemplate定义创建一个PersistentVolume。这使得每个statefulset pod都有自己的存储,而不是在副本之间共享。但是,我希望在所有statefulset副本中共享相同的卷

看起来应该采用以下方法:

  • 在同一命名空间上创建PVC
  • 在statefulset上,使用卷绑定PVC
  • 确保PVC为ReadOnlyMany或ReadWriteMany

  • 假设我的应用程序能够处理共享卷上的任何并发,如果我有一个PVC在所有StatefolSet副本上共享同一卷,是否存在任何技术问题?

    我完全同意@Jonas和@David Maze的评论:


    你可以这样做,它应该会起作用。没有必要使用volumeClaimTemplates,除非您的应用程序需要它


    两个明显的问题是,ReadWriteMany卷实际上有点难以获取(像AWS EBS卷这样的卷只是ReadWriteOnce),而且许多要在状态集(像数据库)中运行的东西都希望独占使用它们的文件系统空间,并使用文件锁定来实现这一点


    答复问题:

    如果我有一个PVC在所有statefulset副本中共享同一卷,是否存在任何技术问题

    我认为这主要取决于:

    • 应用程序将如何处理这样的场景,其中它具有单个PVC(写入并发性)
    • Kubernetes群集支持(或可以实施)哪种存储解决方案
    主观地说,我认为当以上几点得到承认并与集群/应用程序允许的需求和配置相一致时,不应该存在问题


    从应用程序的角度来看,我们讨论的软件存在固有的缺陷。每个应用程序的行为可能不同,需要进行不同的调优(请参阅David Maze评论)

    我们也不了解您的基础架构,因此很难向您指出潜在的问题。从硬件角度(Kubernetes群集)来看,这将本质上用于对您想要使用的特定存储解决方案进行研究。不同的云提供商和内部解决方案可能会有所不同。您需要检查应用程序的要求,以使其与您拥有的选项保持一致

    继续讨论
    ,我认为重要的事情之一是
    访问模式

    引用官方文件:

    访问模式 PersistentVolume可以以资源提供程序支持的任何方式装载到主机上。如下表所示,供应商将具有不同的能力,每个PV的访问模式设置为该特定卷支持的特定模式。例如,NFS可以支持多个读/写客户机,但特定的NFS PV可能在服务器上以只读方式导出。每个PV都有自己的访问模式集,描述特定PV的功能

    访问模式为:

    • ReadWriteOnce--卷可以通过单个节点以读写方式装入
    • ReadOnlyMany--卷可以由多个节点以只读方式装入
    • ReadWriteMany--卷可以由许多节点以读写方式装入
    在CLI中,访问模式缩写为:

    • RWO-ReadWriteOnce
    • ROX-现成的
    • RWX-ReadWriteMany

    您可能遇到的一个问题是当
    PVC
    安装到
    节点
    并且
    sts-X
    Pod
    )被安排到另一个
    节点
    时,
    ReadWriteOnce
    的问题,我想您已经知道了


    但是,我希望在所有statefulset副本中共享相同的卷

    具有卷的
    StatefulSet
    示例可在所有副本中共享(Kubernetes文档中的修改示例):

    apiVersion:apps/v1 种类:StatefulSet 元数据: 名称:网站 规格: 选择器: 火柴标签: 应用程序:nginx必须匹配.spec.template.metadata.labels 服务名称:“nginx” 副本:3#默认为1 模板: 元数据: 标签: 应用程序:nginx#必须匹配.spec.selector.matchLabels 规格: 终止时间:10秒 容器: -姓名:nginx 图片:nginx 端口: -集装箱港口:80 名称:网站 #卷启动 体积数量: -名称:示例pvc 挂载路径:/usr/share/nginx/html 卷数: -名称:示例pvc persistentVolumeClaim: 索赔名称:sts用pvc #卷尾
    额外资源:


    您可以做到这一点,它应该会起作用。除非您的应用程序需要,否则无需使用
    volumeClaimTemplates
    。两个明显的问题是,ReadWriteMany卷实际上有点难以获取(像AWS EBS卷这样的卷只是ReadWriteOnce),以及许多您希望在状态集(比如数据库)中运行的内容希望独占使用他们的文件系统空间,并使用文件锁定来强制执行此操作。Hello@yersan。是吗?是的@WytrzymałyWiktor,它确实消除了我的疑虑