【问题标题】:Share persistent volume claims amongst containers in Kubernetes/OpenShift在 Kubernetes/OpenShift 中的容器之间共享持久卷声明
【发布时间】:2016-05-23 16:58:00
【问题描述】:

这可能是一个愚蠢的问题,但我在网上找不到太多信息,想澄清一下。

给定两个部署 A 和 B,都具有不同的容器映像:

  • 它们部署在 K8/OpenShift 集群中的两个不同 pod(不同的 rc、svc 等)中。
  • 他们都需要访问同一个卷来读取文件(我们暂时不考虑锁定)或至少该卷中的相同目录结构。
  • 使用由针对 NFS 共享配置的 PV(持久卷)支持的 PVC(持久卷声明)装载此卷。

我可以确认上述内容实际上是可能的吗? IE。两个 不同 pod 连接到具有相同 PVC 的相同卷。所以他们都在阅读同一卷。

希望这是有道理的......

【问题讨论】:

    标签: openshift kubernetes


    【解决方案1】:

    TL;DR 您可以在同一个项目/命名空间中为共享卷(nfs、gluster 等)共享 PV 和 PVC,您还可以从多个项目/命名空间访问您的共享卷,但它需要项目专用的 PV 和 PVC,作为PV 绑定到单个项目/命名空间,PVC 是项目/命名空间范围内的。

    下面我试图说明当前的行为以及 PV 和 PVC 在 OpenShift 中的作用域。这些是使用 NFS 作为持久存储层的简单示例。

    此时的 accessModes 只是标签,它们在控制对 PV 的访问方面没有真正的功能。下面是一些例子来说明这一点

    PV 是全局的,因为它可以被任何项目/命名空间看到/访问,但是一旦它绑定到一个项目,它就只能被来自同一项目/命名空间的容器访问

    PVC 是特定于项目/命名空间的(因此,如果您有多个项目,则需要为每个项目创建一个新的 PV 和 PVC 以连接到共享的 NFS 卷 - 不能重用来自第一个项目的 PV)

    示例 1:
    我在“默认”项目/命名空间中运行了 2 个不同的 pod,它们都访问相同的 PV 和 NFS 导出共享。挂载和运行都很好。

    [root@k8dev nfs_error]# oc get pv
    NAME      LABELS    CAPACITY   ACCESSMODES   STATUS    CLAIM  REASON    AGE
    pv-nfs    <none>    1Gi        RWO           Bound default/nfs-claim             3m
    
    
    [root@k8dev nfs_error]# oc get pods    <--- running from DEFAULT project, no issues connecting to PV
    NAME              READY     STATUS    RESTARTS   AGE
    nfs-bb-pod2-pvc   1/1       Running   0          11m
    nfs-bb-pod3-pvc   1/1       Running   0          10m
    

    示例 2:
    我有 2 个不同的 pod 在“默认”项目/命名空间中运行,并尝试使用相同的 PV 创建另一个 pod,但来自名为 testproject 的新项目以访问相同的 NFS 导出。新 testproject 中的第三个 pod 将无法绑定到 PV,因为它已经被 default 项目绑定。

    [root@k8dev nfs_error]# oc get pv
    NAME      LABELS    CAPACITY   ACCESSMODES   STATUS    CLAIM  REASON    AGE
    pv-nfs    <none>    1Gi        RWO           Bound default/nfs-claim             3m
    
    
    [root@k8dev nfs_error]# oc get pods    <--- running from DEFAULT project, no issues connecting to PV
    NAME              READY     STATUS    RESTARTS   AGE
    nfs-bb-pod2-pvc   1/1       Running   0          11m
    nfs-bb-pod3-pvc   1/1       Running   0          10m
    

    ** 针对来自另一个项目(testproject)的现有 PV 创建新声明,PVC 将失败

    [root@k8dev nfs_error]# oc get pvc 
    NAME        LABELS    STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
    nfs-claim   <none>    Pending                                      2s
    

    ** nfs-claim 永远不会绑定到 pv-nfs PV,因为它无法从当前项目范围中看到它

    示例 3:

    我在“默认”项目中运行了 2 个不同的 Pod,然后从 testproject 创建另一个 PV、PVC 和 Pod。两个项目都可以访问相同的 NFS 导出共享,但我在每个项目中都需要一个 PV 和 PVC。

    [root@k8dev nfs_error]# oc get pv
    NAME      LABELS    CAPACITY   ACCESSMODES   STATUS     CLAIM                    REASON    AGE
    pv-nfs    <none>    1Gi        RWX           Bound     default/nfs-claim                  14m
    pv-nfs2   <none>    1Gi        RWX           Bound     testproject/nfs-claim2             9m
    
    
    
    [root@k8dev nfs_error]# oc get pods --all-namespaces
    NAMESPACE     NAME              READY     STATUS    RESTARTS   AGE
    default       nfs-bb-pod2-pvc   1/1       Running   0          11m
    default       nfs-bb-pod3-pvc   1/1       Running   0          11m
    testproject   nfs-bb-pod4-pvc   1/1       Running   0          15s
    

    ** 注意,我现在有 3 个 pod 跨两个项目运行到同一个 NFS 共享卷,但我需要两个 PV,因为它们绑定到一个项目,还有 2 个 PVC,每个项目一个,NFS PV I正在尝试访问

    示例 4:

    如果我绕过 PV 和 PVC,我可以直接使用 nfs 插件从任何项目直接连接到共享 NFS 卷

    volumes:
    - name: nfsvol
      nfs:
        path: /opt/data5
        server: nfs1.rhs
    

    现在,卷安全是在此之上的另一层,使用补充组(用于共享存储,即 nfs、gluster 等...),管理员和开发人员应该能够进一步管理和控制对共享 NFS 的访问系统。

    希望有帮助

    【讨论】:

    • 感谢这个帮助分配。
    • @DonovanMuller :我也在尝试对多个 pod 使用相同的 PV,它工作正常,但我认为在这种情况下,数据也在 pod 之间共享。这里我主要关心的是,如果 PV 包含 2 GB 的数据,那么所有数据是否都可用于使用这个 PV 的 Pod,这是我们不想要的。 Pod 应该只有它的数据,而不是其他的。我也在这里问过这个问题stackoverflow.com/questions/36624034/…,但没有回应。如果您能清除这一点,将会非常有帮助。提前致谢!
    • @screenlay :对于我的上述查询,我​​也会感谢您的想法。非常感谢!
    • @priyank - 我认为如果您想限制共享存储上的数据/目录,您可以从 securityContext 中传入补充组,然后在 NFS 服务器上设置所有权和组,即 dir1 对A 组和 B 组,然后 dir1/dirA 仅对 podA 开放,dir1/dirB 仅对 podB 开放 - 所以所有 pod 都可以访问 dir1 但只有 podA 可以访问 dirA 而 podB 可以访问 dirB
    • 示例 4 正是我需要解决的必须创建多个 PersistentVolume 和跨多个命名空间的声明
    【解决方案2】:

    AFAIK,不支持多次绑定 PV。您可以将卷源(在您的情况下为 NFS)直接用于您的用例。

    【讨论】:

    • 基于此(kubernetes.io/v1.1/examples/nfs),它实际上似乎是可能的?在示例中,有两个 rc 使用相同的 pvc。
    • 您可以在任何地方绑定 PV,但卷提供程序本身可以拒绝同时访问的附加请求(对于 Ceph、EBS 或 GCE)。 NFS 没有任何保证 - 如果您想防止 NFS 同时被两个 pod 使用,您将需要自己的防护/锁定。
    • @Clayton:我也在尝试对多个 pod 使用相同的 PV,它工作正常,但我认为在这种情况下,数据也在 pod 之间共享。这里我主要关心的是,如果 PV 包含 2 GB 的数据,那么所有数据是否都可用于使用这个 PV 的 Pod,这是我们不想要的。 Pod 应该只有它的数据,而不是其他的。我在这里也问过这个问题 stackoverflow.com/questions/36624034/... ,但没有回应。如果您能清除这一点,将会非常有帮助。提前致谢!
    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2019-10-26
    • 2017-12-07
    • 2019-09-12
    • 2021-03-28
    • 1970-01-01
    • 2019-11-12
    相关资源
    最近更新 更多