在 Kubernetes/OpenShift 中的容器之间共享持久卷声明
Share persistent volume claims amongst containers in Kubernetes/OpenShift
这可能是个愚蠢的问题,但我在网上找不到太多内容,想澄清一下。
给定两个部署 A 和 B,两者都具有 不同 个容器映像:
- 它们部署在 K8/OpenShift 集群中的两个不同 pods(不同的 rc、svc 等)中。
- 他们都需要访问同一个卷来读取文件(让我们暂时不锁定)或至少该卷中的相同目录结构。
- 使用由针对 NFS 共享配置的 PV(持久卷)支持的 PVC(持久卷声明)安装此卷。
我可以确认以上内容是否真的可行吗? 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 系统。
希望对您有所帮助
这可能是个愚蠢的问题,但我在网上找不到太多内容,想澄清一下。
给定两个部署 A 和 B,两者都具有 不同 个容器映像:
- 它们部署在 K8/OpenShift 集群中的两个不同 pods(不同的 rc、svc 等)中。
- 他们都需要访问同一个卷来读取文件(让我们暂时不锁定)或至少该卷中的相同目录结构。
- 使用由针对 NFS 共享配置的 PV(持久卷)支持的 PVC(持久卷声明)安装此卷。
我可以确认以上内容是否真的可行吗? 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 系统。
希望对您有所帮助