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 的访问系统。
希望有帮助