【问题标题】:Kubernetes: 2 PVCs in 2 namespaces binding to the same PV, one successful, one failedKubernetes:2个命名空间中的2个PVC绑定到同一个PV,一个成功,一个失败
【发布时间】:2020-12-31 00:02:09
【问题描述】:

所以我在 2 个命名空间中有 2 个 PVC 绑定到 1 个 PV:

以下是 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-git
  namespace: mlo-dev
  labels:
    type: local
spec:
  storageClassName: mlo-git
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-git
  namespace: mlo-stage
  labels:
    type: local
spec:
  storageClassName: mlo-git
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

和 PV:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-git
  labels:
    type: local
spec:
  storageClassName: mlo-git
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /git

在命名空间“mlo-dev”中,绑定成功:

$ kubectl describe pvc pvc-git -n mlo-dev
Name:          pvc-git
Namespace:     mlo-dev
StorageClass:  mlo-git
Status:        Bound
Volume:        pv-git
Labels:        type=local
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Mounted By:    
...
various different pods here...
...
Events:        <none>

而在命名空间“mlo-stage”中,绑定失败并显示错误消息: storageclass.storage.k8s.io "mlo-git" not found

$ kubectl describe pvc pvc-git -n mlo-stage
Name:          pvc-git
Namespace:     mlo-stage
StorageClass:  mlo-git
Status:        Pending
Volume:        
Labels:        type=local
Annotations:   Finalizers:  [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Mounted By: 
...
various different pods here...
...
Events:
  Type     Reason              Age                   From                         Message
  ----     ------              ----                  ----                         -------
  Warning  ProvisioningFailed  3m4s (x302 over 78m)  persistentvolume-controller  storageclass.storage.k8s.io "mlo-git" not found

据我所知,PV 不限于命名空间,所以不同命名空间中的 PVC 应该可以绑定到同一个 PV?

+++++ 添加: +++++

当“kubectl describe pv pv-git”时,我得到以下信息:

$ kubectl describe pv pv-git
Name:            pv-git
Labels:          type=local
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    mlo-git
Status:          Bound
Claim:           mlo-dev/pvc-git
Reclaim Policy:  Retain
Access Modes:    RWX
VolumeMode:      Filesystem
Capacity:        1Gi
Node Affinity:   <none>
Message:         
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /git
    HostPathType:  
Events:            <none>

【问题讨论】:

  • 你也可以kubectl describe PV 吗?
  • 谢谢@Jonas,我已经添加了“kubectl describe pv pv-git”的结果

标签: kubernetes namespaces persistent-volumes kubernetes-pvc persistent-volume-claims


【解决方案1】:

我已尝试重现您的场景(但是,如果您提供 storageclass yaml 以进行精确重现,并更改 AccessMode 以进行测试),我认为这种行为是正确的(按设计工作)。

当您想检查特定对象是否为namespaced 时,您可以使用命令:

$ kubectl api-resources | grep pv
persistentvolumeclaims            pvc                                         true         PersistentVolumeClaim
persistentvolumes                 pv                                          false        PersistentVolume

由于PVC 是真的,它的意思是pvc 是命名空间,而PV 不是。

PersistentVolumeClainPersistentVolume 以 1:1 的关系绑定。当你的第一个 PVC 绑定到 PV 时,这个 PV 是taken 并且在那一刻不能再次使用。 您应该创建第二个PV 可以根据reclaimPolicypop/deployment 发生的情况进行更改

我猜你正在使用Static 配置。

集群管理员创建了许多 PV。它们携带真实存储的详细信息,可供集群用户使用。它们存在于 Kubernetes API 中,可供使用。

在这种情况下,您必须创建 1 个PV 到 1 个PVC

如果您要使用云环境,您将使用 Dynamic 配置。

当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时,集群可能会尝试为 PVC 动态配置卷。此配置基于 StorageClasses:PVC 必须请求一个存储类,并且管理员必须创建并配置该类才能进行动态配置。

例如,在 GKE 上,我尝试复制它,并且 1 PVC 绑定到 PV。由于 GKE 使用的是 Dynamic provisioning,当您仅定义 PVC 时,它使用了 default storageclass 并自动创建了 PV

$ kubectl get pv,pvc -A
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
persistentvolume/pv-git                                     1Gi        RWO            Retain           Bound    mlo-dev/pvc-git     mlo-git                 15s
persistentvolume/pvc-e7a1e950-396b-40f6-b8d1-8dffc9a304d0   1Gi        RWO            Delete           Bound    mlo-stage/pvc-git   mlo-git                 6s

NAMESPACE   NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mlo-dev     persistentvolumeclaim/pvc-git   Bound    pv-git                                     1Gi        RWO            mlo-git        10s
mlo-stage   persistentvolumeclaim/pvc-git   Bound    pvc-e7a1e950-396b-40f6-b8d1-8dffc9a304d0   1Gi        RWO            mlo-git        9s

解决方案

要解决此问题,您应该创建另一个PersistentVolume 来绑定第二个PVC

有关边界的更多详细信息,您可以查看this topic。如果您想了解有关PVC 的更多信息,请查看this SO thread

如果第二个 PV 没有帮助,请提供有关您的环境(Minikube/Kubeadm、K8s 版本、操作系统等)和您的 storageclass YAML 的更多详细信息。

【讨论】:

  • 谢谢@PjoterS,您创建另一个 PV 以绑定到第二个 PVC 的解决方案解决了我的问题!答案非常翔实!
猜你喜欢
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2019-11-22
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多