在Kubernetes/OpenShift中的容器之间共享持久量索赔

Don*_*ler 16 openshift kubernetes

这可能是一个愚蠢的问题,但我没有找到很多在线,并希望澄清这一点.

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

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

我可以确认上述实际上是可行的吗?即两个不同的吊舱使用相同的PVC连接到相同的卷.所以他们都是从同一卷读.

希望有道理......

scr*_*ley 21

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
Run Code Online (Sandbox Code Playgroud)

示例2:
我在"默认"项目/命名空间中运行了2个不同的pod,并尝试使用相同的PV创建另一个pod,但是从一个名为testprojectaccess的新项目访问相同的NFS导出.来自new的第三个pod testproject将无法绑定到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
Run Code Online (Sandbox Code Playgroud)

**从另一个项目(testproject)创建针对现有PV的新索赔,PVC将失败

[root@k8dev nfs_error]# oc get pvc 
NAME        LABELS    STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
nfs-claim   <none>    Pending                                      2s
Run Code Online (Sandbox Code Playgroud)

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

例3:

我有两个不同的pod在"默认"项目中运行,然后创建另一个PV和PVC和Pod testproject.两个项目都能够访问相同的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
Run Code Online (Sandbox Code Playgroud)

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

例4:

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

volumes:
- name: nfsvol
  nfs:
    path: /opt/data5
    server: nfs1.rhs
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助

  • 示例 4 正是我需要在多个命名空间中创建多个 PersistentVolume 和声明所需要的 (2认同)