在 Kubernetes 中使用不同的 PV 时,是否可以在不同的命名空间中使用相同名称的 PVC?

Is it possible to have PVC's with the same name accross different namespace when using different PV's in Kubernetes?

我有 2 个不同的命名空间:prod-01prod-02,我想做的是构建我的副本prod-01prod-02 命名空间,为其 pvc 保留相同的名称,这样我就不必维护 2 套图表每个不同的命名空间。

这是它的样子:

$ kubectl get ns | grep prod
prod-01          Active    178d
prod-02          Active    8d
$ 

如下所示,我为每个命名空间设置了 2 对 pv:

$ kubectl get pv -o wide | grep prod
prod-01-db-pv                    50Gi       RWX            Retain           Bound       prod-01/app-db                                                                      164d
prod-01-nosql-db-pv              5Gi        RWX            Retain           Bound       prod-01/app-nosql-db                                                                149d
prod-02-db-pv                50Gi       RWX            Retain           Available   prod-02/app-db                                                          41m
prod-02-nosql-db-pv          5Gi        RWX            Retain           Available   prod-02/app-nosql-db                                                    19m
$ 

以下是 prod-01 的 PVC 的显示方式:

$ kubectl get pvc --namespace=prod-01
NAME              STATUS    VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   AGE
app-db         Bound     prod-01-db-pv         50Gi       RWX                           164d
app-nosql-db   Bound     prod-01-nosql-db-pv   5Gi        RWX                           149d
$ 

这就是我想要完成的事情:

$ kubectl get pvc --namespace=prod-02
NAME              STATUS    VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
app-db         Pending   prod-02-db-pv         0                                        2m
app-nosql-db   Pending   prod-02-nosql-db-pv   0                                        24m
$ 

如上所示,prod-02 命名空间的 pvc 永远停留在 Pending 状态。

当我将 prod-02 上的 pvc 名称更改为任何不同的名称时,它们会按预期结合。

这让我觉得我不能在 pvc 上使用相同的名称,即使它们位于不同的命名空间并指向不同的 pv ......但是,在搜索文档时,我找不到任何证据证明这一点问题,想知道我是否会遗漏一些东西。

简单来说,我可以在不同的命名空间中使用多个同名的 pvc(考虑到它们使用不同的 pv)吗?


更新: kubectl describe pvc

的结果
$ kubectl describe pvc app-db --namespace=prod-02
Name:          app-db
Namespace:     prod-02
StorageClass:  
Status:        Pending
Volume:        prod-02-db-pv
Labels:        <none>
Annotations:   <none>
Finalizers:    []
Capacity:      0
Access Modes:  
Events:        <none>
$ 

这也是 kubectl get pvc 的输出:

$ kubectl get pvc app-db --namespace=prod-02  -o yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: 2018-09-22T22:00:34Z
  name: app-db
  namespace: prod-02
  resourceVersion: "43027607"
  selfLink: /api/v1/namespaces/prod-02/persistentvolumeclaims/app-db
  uid: ee81b951-beb2-11e8-b972-005056bbded7
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
  volumeName: prod-02-db-pv
status:
  phase: Pending
$ 

这里还有一些关于 pv 的详细信息:

$ kubectl get pv prod-02-db-pv --namespace=prod-02 -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  creationTimestamp: 2018-09-22T21:15:19Z
  name: prod-02-db-pv
  resourceVersion: "43020171"
  selfLink: /api/v1/persistentvolumes/prod-02-db-pv
  uid: 9c07d7a6-beac-11e8-b972-005056bbded7
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 50Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: app-db
    namespace: prod-02
  nfs:
    path: /nfs_server/prod02/db
    server: 158.87.52.35
  persistentVolumeReclaimPolicy: Retain
status:
  phase: Available
$ 

在此先感谢您的帮助!

PVC 是命名空间资源,但不是 PV。即,您可以在不同的命名空间中拥有多个同名的 PVC。

您配置 pv 的方式可能存在问题。

您能否确保在 nfs 属性下的 pv 配置中使用正确的 IP 地址:

nfs:
path: /nfs_server/prod01/db
server: 158.87.52.35

从 OpenShift 文档中 link 找到我的问题的原因:

原来问题与在用于创建 prod-02 pv 的 yaml 文件中错误使用 claimRefs 有关,这是完整的解释:

Specifying a volumeName in your PVC does not prevent a different PVC from binding to the specified PV before yours does. Your claim will remain Pending until the PV is Available.

Specifying a claimRef in a PV does not prevent the specified PVC from being bound to a different PV. The PVC is free to choose another PV to bind to according to the normal binding process. Therefore, to avoid these scenarios and ensure your claim gets bound to the volume you want, you must ensure that both volumeName and claimRef are specified.

因此,在修复 claimRefs 并重新创建我的 pv 之后,pvc 开始按预期绑定,即使在其他命名空间上使用了相同的名称 :-)