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

4
我有两个不同的命名空间:prod-01prod-02。我的目标是将我的prod-01构建成prod-02命名空间的副本,并保持其pvc的相同名称,以便我不必为每个不同的命名空间维护两套图表。
以下是示例:
$ kubectl get ns | grep prod
prod-01          Active    178d
prod-02          Active    8d
$ 

如下所示,每个命名空间都有两对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 名称更改为任何其他名称时,它们按预期连接。

这让我想到,即使在不同的命名空间中并指向不同的 PV,我也不能使用相同名称的 PVC。但是,在查找文档时,我没有发现任何与此问题相关的证据,因此想知道是否有什么我可能遗漏的内容。

简而言之,我可以在不同的命名空间中拥有多个使用相同名称的 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
$ 

感谢您提前的帮助!

以下是关于IT技术的翻译内容:


你对 kubectl describe pvc app-db --namespace=prod-02 看到了什么? - Rico
在问题底部包含了带有命令结果的更新。 - silveiralexf
2个回答

6

PVC是具有命名空间的资源,但不是PV。也就是说,您可以在不同命名空间下拥有多个名称相同的PVC。

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

请确保在pv配置中,在nfs属性下使用了正确的IP地址:

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

是的,IP 是正确的。正如提到的那样,当我使用不同名称创建 PVC 时,它们会按预期绑定,只有在使用其他命名空间上使用的相同名称时才保留为“挂起”。 - silveiralexf
只是想知道为什么prod02 pv的路径是/nfs_server/prod01/db。 - Harish Ambady
抱歉,我掩盖了原始数据并插入了错误的信息,已经修复,谢谢。 - silveiralexf

2

在OpenShift文档的以下链接中找到了我的问题原因:

事实证明,问题与在用于创建prod-02 pv的yaml文件中错误使用claimRefs有关,以下是完整的说明:

在PVC中指定volumeName不能防止其他PVC在您之前绑定到指定的PV。只有在PV可用时,您的声明才会保持挂起状态。

在PV中指定claimRef不能防止指定的PVC被绑定到另一个PV。PVC可以根据正常的绑定过程自由选择要绑定的另一个PV。因此,为避免这些情况并确保您的声明绑定到所需的卷,必须同时指定volumeName和claimRef。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接