Openshift 将NFS呈现给多个项目

Openshift 将NFS呈现给多个项目,openshift,kubernetes,openshift-origin,Openshift,Kubernetes,Openshift Origin,我有一个NFS挂载,其中包含一些只读媒体资产,我希望将这些资产呈现给多个项目 在每个项目中使用相同的NFS路径创建一个新的PV似乎太笨拙了。如果其他PVC意外地索取我的资产目录怎么办 除此之外,我不知道怎么做。我怎样才能做到这一点 编辑:澄清一下-我想避免集群管理员干预。创建PV时需要群集管理权限 PV配置 apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/bound-by-co

我有一个NFS挂载,其中包含一些只读媒体资产,我希望将这些资产呈现给多个项目

在每个项目中使用相同的NFS路径创建一个新的PV似乎太笨拙了。如果其他PVC意外地索取我的资产目录怎么办

除此之外,我不知道怎么做。我怎样才能做到这一点


编辑:澄清一下-我想避免集群管理员干预。创建PV时需要群集管理权限

PV配置

apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/bound-by-controller: "yes"
  creationTimestamp: null
  labels:
    app: my_app
  name: my-assets
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 25Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: my-assets
    namespace: my_namespace
    resourceVersion: "13480134"
    uid: ea36d352-1a22-11e7-a443-0050568b4a96
  nfs:
    path: /nfs_volume
    server: nfs_server
  persistentVolumeReclaimPolicy: Recycle
status: {}
来自my_命名空间以外的命名空间的PVC不能对此pv提出索赔。这是一个来自不同名称空间的PVC配置,无法使用
ReadWriteMany
声明现有PV

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    openshift.io/generated-by: OpenShiftNewApp
  creationTimestamp: null
  name: my-assets
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 25Gi
  selector:
    matchLabels:
      app: my_app
  volumeName: my-assets
status: {}

我不确定您所说的项目是什么意思,但如果您指的是不同应用程序的部署,那么它应该与具有类型为ReadWriteMany的NFS的单个PV定义一起工作。但是,我建议每次需要访问NFS的部署都包含一个PV和PVC定义。通过这种方式,它在部署中是明确的,您可以分别为每个应用程序更改它。想象一下,你想为一个应用程序而不是另一个应用程序更改它

下面是一个示例,我使用它将amazon EFS NFS装载到我的CockroachDB部署中的所有pod中,以编写备份。我把它分成两个YAML,但你也可以把它们折叠成一个文件。请注意,您可以对所有POD使用相同的PersistentVolumeClaim

1只蟑螂BPV.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cockroachdbpv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: {amazon path here}
    path: "/"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cockroachdbpv
spec:
  accessModes:
    - "ReadWriteMany"
  resources:
    requests:
      storage: 10Gi
2.yaml蟑螂

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: cockroachdb
spec:
  serviceName: "cockroachdb"
  replicas: 3
  template:
    metadata:
      labels:
        app: cockroachdb
      annotations:
        {...}        
    spec:
      containers:
      - name: cockroachdb
        {...}
        volumes:
        {...}
        - name: efsdir
          persistentVolumeClaim:
            claimName: cockroachdbpv

您只需在PV定义中以及在PVCs中列出
ReadWriteMany

这里有一个例子:

我认为kubernetes相当于“项目”是“名称空间”。我明白你的观点,每个名称空间1 PV,但我的计划是为不同的环境更改选择器(Dev Test Prod)。我仍然无法跨名称空间对1 PV提出多个索赔,我认为这是可能的。(请参见编辑配置)是的,这是正常行为。通过在需要访问的所有部署/状态集中使用相同的“claimName”,您应该能够重用持久卷声明(如我的示例中所示,这就是为什么我将PV与PVC一起部署在一个文件中)。好的,现在回到问题。。。这是否意味着不可能针对同一PV提出多个PVC索赔?要清楚,我想避免群集管理干预。创建PV时需要群集管理权限。但您是否总是使用群集管理在新命名空间中部署新应用?所以PV/PVC的定义可能是其中的一部分?参见编辑。PV被定义为
ReadWriteMany
-仍然无法跨不同的名称空间声明,请参见。不幸的是,PersistentVolume是一个名称空间对象。不可能从不同的名称空间针对它创建一个PVC-这是按预期工作的,不会被修复。