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

标签 openshift kubernetes

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

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

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

  • 我可以确认上述实际上是可能的吗? IE。两个不同的 Pod 使用相同的 PVC 连接到同一个卷。所以他们都在读同一卷书。

    希望这是有道理的...

    最佳答案

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

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

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

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

    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将无法绑定(bind)到 PV,因为它已被 default 绑定(bind)项目。
    [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 永远不会绑定(bind)到 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
    

    ** 注意,我现在有三个 pod 在两个项目中运行到同一个 NFS 共享卷,但我需要两个 PV,因为它们绑定(bind)到一个项目,还有 2 个 PVC,每个项目一个用于我尝试的 NFS PV使用权

    示例 4:

    如果我绕过 PV 和 PVC,我可以直接使用 nfs 插件从任何项目连接到共享 NFS 卷
    volumes:
    - name: nfsvol
      nfs:
        path: /opt/data5
        server: nfs1.rhs
    

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

    希望有帮助

    关于openshift - 在 Kubernetes/OpenShift 中的容器之间共享持久卷声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364367/

    相关文章:

    Openshift/OKD - 如何模板 docker secret

    python - 也可以从 uWSGI 访问静态文件

    asp.net - Openshift - 构建错误 : non-zero (13) exit code

    docker - 是否可以在集群内的容器内运行 kubectl?

    azure - 无法从 Azure 容器注册表拉取镜像 - 拉取被拒绝

    node.js - 我无法使用nodejs在openshift中上传图像

    mongodb - com.mongodb.MongoException : not authorized for insert on myworld. 用户

    kubernetes - PHP 本地开发 - minikube 还是 docker-compose?

    postgresql - Kubernetes 集群中 Postgres 数据库的持久卷

    parallel-processing - 避免在 OpenShift/Kubernetes 集群中并行处理 pod