在Kubernetes/OpenShift中的容器之间共享持久的卷声明

在Kubernetes/OpenShift中的容器之间共享持久的卷声明,openshift,kubernetes,Openshift,Kubernetes,这可能是个愚蠢的问题,但我在网上找不到太多,我想澄清一下 给定两个部署A和B,它们都具有不同的容器映像: 它们部署在K8/OpenShift集群中的两个不同的POD(不同的rc、svc等)中 它们都需要访问相同的卷来读取文件(暂时不要锁定),或者至少需要访问该卷中相同的目录结构 使用由针对NFS共享配置的PV(持久卷)支持的PVC(持久卷声明)装载此卷 我是否可以确认上述情况实际上是可能的?即,两个不同的吊舱用相同的PVC连接到同一体积。所以他们都在读同一卷书 希望这是有意义的…AFAIK,

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

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

  • 它们部署在K8/OpenShift集群中的两个不同的POD(不同的rc、svc等)中
  • 它们都需要访问相同的卷来读取文件(暂时不要锁定),或者至少需要访问该卷中相同的目录结构
  • 使用由针对NFS共享配置的PV(持久卷)支持的PVC(持久卷声明)装载此卷
我是否可以确认上述情况实际上是可能的?即,两个不同的吊舱用相同的PVC连接到同一体积。所以他们都在读同一卷书


希望这是有意义的…

AFAIK,不支持多次绑定PV。您可以直接为您的用例使用卷源(在您的用例中为NFS)。

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

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

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

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

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

示例1:
我在“默认”项目/命名空间中运行了两个不同的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
**针对另一个项目(testproject)的现有PV创建新的索赔,PVC将失败

[root@k8dev nfs_error]# oc get pvc 
NAME        LABELS    STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
nfs-claim   <none>    Pending                                      2s
**请注意,我现在有三个pod在两个项目中运行到同一个NFS共享卷,但我需要两个PV,因为它们绑定到单个项目,还有两个PVC,每个项目一个,我尝试访问的NFS PV

示例4:

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

volumes:
- name: nfsvol
  nfs:
    path: /opt/data5
    server: nfs1.rhs
现在,卷安全性是在此基础上的另一层,通过使用补充组(用于共享存储,即nfs、gluster等),管理员和开发人员应该能够进一步管理和控制对共享nfs系统的访问


希望这有帮助

基于此(),它实际上似乎是可能的?在本例中,有两个rc使用相同的pvc。您可以在任何地方绑定PV,但卷提供程序本身可以拒绝同时访问的附加请求(对于Ceph、EBS或GCE)。NFS没有任何保证-如果您想防止NFS同时从两个吊舱中使用,您需要自己的防护/锁定。@Clayton:我也尝试对多个吊舱使用相同的PV,效果很好,但我认为在这种情况下,吊舱之间也会共享数据。这里我主要关心的是,如果PV包含2 GB的数据,那么所有的数据是否都可以提供给使用这个PV的POD,这是我们不想要的。Pod应该只有它的数据,而不是其他数据。我在这里也问了这个问题,stackoverflow.com/questions/36624034/…,但没有回答。如果你能澄清这一点,那将非常有帮助。提前谢谢!感谢这有助于分配。@DonovanMuller:我也尝试将同一PV用于多个POD,它工作正常,但我认为在这种情况下,POD之间也会共享数据。这里我主要关心的是,如果PV包含2 GB的数据,那么所有的数据是否都可以提供给使用这个PV的POD,这是我们不想要的。Pod应该只有它的数据,而不是其他数据。我在这里也问了这个问题,但没有回答。如果你能澄清这一点,那将非常有帮助。提前谢谢@剧本:对于我的上述问题,我也很感激你的想法。非常感谢@priyank-我认为如果您想限制共享存储上的数据/目录,您可以从securityContext传入补充组,然后在NFS服务器上设置所有权和组,即dir1对组A和B开放,然后dir1/dirA只对podA开放,而dir1/dirB只对podB开放-因此所有POD都可以访问dir1,但只有podA可以访问dirA,podB可以访问dirB示例4正是我想要的需要避免跨多个名称空间创建多个PersistentVolume和声明
[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
volumes:
- name: nfsvol
  nfs:
    path: /opt/data5
    server: nfs1.rhs