【问题标题】:Present NFS to multiple projects向多个项目展示 NFS
【发布时间】:2017-04-06 03:19:33
【问题描述】:

我有一个 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_namespace 以外的命名空间的 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: {}

【问题讨论】:

    标签: openshift kubernetes openshift-origin


    【解决方案1】:

    我不确定您所说的项目是什么意思,但如果您指的是不同应用程序的 Deployments,它应该与类型为 ReadWriteMany 的 NFS 的单个 PV 定义一起使用。但是,我建议始终在每个需要访问 NFS 的部署中包含一个 PV 和 PVC 定义。这样它在部署中是明确的,您可以为每个应用程序单独更改它。想象一下,您想为一个应用更改它,而不是另一个。

    这是一个示例,我使用 Amazon EFS NFS 挂载到我的 CockroachDB 部署中的所有 POD 以编写备份。我将其拆分为 2 个 yaml,但您也可以将它们折叠到一个文件中。请注意,您可以对所有 POD 使用相同的 PersistentVolumeClaim。

    1个蟑螂dbPV.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 cockroachdb.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
    

    【讨论】:

    • 我认为 kubernetes 等效于“项目”是“命名空间”我明白你的意思是每个命名空间有 1 个 PV,但我的计划是为不同的环境更改选择器(开发测试产品)。我仍然无法跨命名空间对 1 个 PV 提出多项声明,我认为这是可能的。 (请参阅配置的编辑)
    • 是的,这是正常行为。您应该能够通过在您需要访问的所有 Deployments/StatefulSets 中使用相同的“claimName”来重用 Persistent Volume Claim(如在我的示例中 - 这就是我将 PV 与 PVC 一起部署在单个文件中的原因)。
    • 好的,回到问题...这是否意味着不可能针对同一个 PV 提出多个 PVC 声明?
    • 要明确 - 我想避免集群管理员干预。创建 PV 时需要集群管理员权限。
    • 但是您总是使用集群管理员在新命名空间中部署新应用程序?所以 PV/PVC 定义可能是其中的一部分?
    【解决方案2】:

    您只需在 PV 定义和 PVC 中将 ReadWriteMany 列为 access mode

    这里有一个例子: https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/nfs

    【讨论】:

    • 查看编辑。 PV 被定义为 ReadWriteMany - 仍然无法跨不同的命名空间声明
    • 我明白了。不幸的是,PersistentVolume 是一个命名空间对象。无法从不同的命名空间针对它创建 PVC - 这是按预期工作的,不会被修复。
    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2011-05-05
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多