<p>So I have 2 PVCs in 2 namespaces binding to 1 PV:</p>
<p>The following are the PVCs:</p>
<pre><code>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
</code></pre>
<p>and the PV:</p>
<pre><code>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
</code></pre>
<p>in the namespace &quot;mlo-dev&quot;, the binding is successful:</p>
<pre><code>$ 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:        &lt;none&gt;
</code></pre>
<p>Whereas in the namespace &quot;mlo-stage&quot;, the binding is failed with the error message: storageclass.storage.k8s.io &quot;mlo-git&quot; not found</p>
<pre><code>$ 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 &quot;mlo-git&quot; not found
</code></pre>
<p>As I know, PV is not scoped to namespace, so it should be possible for PVCs in different namespaces to bind to the same PV?</p>
<p>+++++
Added:
+++++</p>
<p>when &quot;kubectl describe pv pv-git&quot;, I got the following:</p>
<pre><code>$ 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:   &lt;none&gt;
Message:         
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /git
    HostPathType:  
Events:            &lt;none&gt;
</code></pre>

Ken Tsoi
<p>I've tried to reproduced your scenario (however if you would provide your <code>storageclass</code> yaml to exact reproduction, and changed <code>AccessMode</code> for tests) and in my opinion this behavior is correctly (worked as designed).</p>
<p>When you want to check if specific object is <code>namespaced</code> you can use command:</p>
<pre><code>$ kubectl api-resources | grep pv
persistentvolumeclaims            pvc                                         true         PersistentVolumeClaim
persistentvolumes                 pv                                          false        PersistentVolume
</code></pre>
<p>As <code>PVC</code> is true its mean <code>pvc</code> is namespaced, and <code>PV</code> is not.</p>
<p><a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims" rel="nofollow noreferrer">PersistentVolumeClain</a> and <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" rel="nofollow noreferrer">PersistentVolume</a> are bounding in relationship 1:1. When your first PVC bounded to PV, this PV is <code>taken</code> and cannot be used again in that moment. <strong>You should create second <code>PV</code>.</strong> It can be changed depends on <code>reclaimPolicy</code> and what happend with <code>pop</code>/<code>deployment</code></p>
<p>I guess you are using <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static" rel="nofollow noreferrer">Static</a> provisioning.</p>
<blockquote>
<p>A cluster administrator creates a number of PVs. They carry the details of the real storage, which is available for use by cluster users. They exist in the Kubernetes API and are available for consumption.</p>
</blockquote>
<p>In this case you have to create 1 <code>PV</code> to 1 <code>PVC</code>.</p>
<p>If you would use cloud environment, you would use <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic" rel="nofollow noreferrer">Dynamic</a> provisioning.</p>
<blockquote>
<p>When none of the static PVs the administrator created match a user's PersistentVolumeClaim, the cluster may try to dynamically provision a volume specially for the PVC. This provisioning is based on StorageClasses: the PVC must request a storage class and the administrator must have created and configured that class for dynamic provisioning to occur.</p>
</blockquote>
<p>As for example, on <a href="https://cloud.google.com/kubernetes-engine" rel="nofollow noreferrer">GKE</a> I've tried to reproduce it and 1 <code>PVC</code> bound to <code>PV</code>. As GKE is using <code>Dynamic provisioning</code>, when you defined only <code>PVC</code> it used <code>default storageclass</code> and automatically created <code>PV</code>.</p>
<pre><code>$ 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
</code></pre>
<p><strong>Solution</strong></p>
<p>To fix this issue, you should create another <code>PersistentVolume</code> to bound second <code>PVC</code>.</p>
<p><strong>For more details</strong> about bounding you can check <a href="https://stackoverflow.com/questions/57839938/kubernetes-pvcs-sharing-a-single-pv">this topic</a>. If you would like more information about <code>PVC</code> check <a href="https://stackoverflow.com/questions/63412552/why-readwriteonce-is-working-on-different-nodes">this SO thread</a>.</p>
<p><strong>If second <code>PV</code> won't help</strong>, please provide more details about your environment (Minikube/Kubeadm, K8s version, OS, etc.) and your <code>storageclass</code> YAML.</p>
