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

Share persistent volume claims amongst containers in Kubernetes/OpenShift

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

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

我可以确认以上内容是否真的可行吗? IE。两个 不同 pods 使用相同的 PVC 连接到相同的卷。所以他们都在阅读同一本书。

希望这是有道理的...

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

长话短说;博士 您可以在共享卷(nfs、gluster 等)的相同 project/namespace 内共享 PV 和 PVC,您也可以从多个 project/namespace 访问您的共享卷,但这需要项目专用 PV和 PVC,因为 PV 绑定到单个 project/namespace 而 PVC 是 project/namespace 范围的。

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

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

PV 是全局的,因为它可以被任何 project/namespace seen/accessed,但是一旦它被绑定到一个项目,它就只能被来自同一个 seen/accessed 的容器访问。 =64=]

PVC 是 project/namespace 特定的(因此,如果您有多个项目,则每个项目都需要一个新的 PV 和 PVC 才能连接到共享的 NFS 卷 - 不能重复使用第一个项目的 PV )

示例 1:
我在 "default" project/namespace 中有 2 个不同的 pods 运行ning,它们都访问相同的 PV 和 NFS 导出共享。 mount 和 运行 都很好。

[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:
我在 "default" project/namespace 中有 2 个不同的 pods 运行ning 并尝试使用相同的 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:

我在 "default" 项目中有 2 个不同的 pods 运行ning,然后从 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

** 注意,我现在在两个项目中有三个 pods 运行 相同的 NFS 共享卷,但我需要两个 PV,因为它们绑定到一个项目,以及 2 个 PVC,每个项目和我尝试访问的 NFS PV

例4:

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

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

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

希望对您有所帮助