<p>This was discussed by k8s maintainers in <a href="https://github.com/kubernetes/kubernetes/issues/7438#issuecomment-97148195" rel="noreferrer">https://github.com/kubernetes/kubernetes/issues/7438#issuecomment-97148195</a>:</p>
<blockquote>
<blockquote>
<p>Allowing users to ask for a specific PV breaks the separation between them</p>
</blockquote>
<p>I don't buy that.  We allow users to choose a node.  It's not the common
case, but it exists for a reason.</p>
</blockquote>
<p>How did it end? What's the intended way to have &gt;1 PV's and PVC's like the one in <a href="https://github.com/kubernetes/kubernetes/tree/master/examples/nfs" rel="noreferrer">https://github.com/kubernetes/kubernetes/tree/master/examples/nfs</a>?</p>
<p>We use NFS, and PersistentVolume is a handy abstraction because we can keep the <code>server</code> IP and the <code>path</code> there. But a PersistentVolumeClaim gets <em>any</em> PV with sufficient size, preventing <code>path</code> reuse.</p>
<p>Can set <code>volumeName</code> in a PVC <code>spec</code> block (see <a href="https://github.com/kubernetes/kubernetes/pull/7529" rel="noreferrer">https://github.com/kubernetes/kubernetes/pull/7529</a>) but it makes no difference.</p>

<p>There is a way to pre-bind PVs to PVCs today, here is an example showing how:</p>
<ol>
<li>Create a PV object with a ClaimRef field referencing a PVC that you will subsequently create:
<pre><code> $ kubectl create -f pv.yaml
 persistentvolume &quot;pv0003&quot; created
</code></pre>
where <code>pv.yaml</code> contains:
<pre><code> apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: pv0003
 spec:
   storageClassName: &quot;&quot;
   capacity:
     storage: 5Gi
   accessModes:
     - ReadWriteOnce
   persistentVolumeReclaimPolicy: Retain
   claimRef:
     namespace: default
     name: myclaim
   nfs:
     path: /tmp
     server: 172.17.0.2
</code></pre>
</li>
<li>Then create the PVC with the same name:
<pre><code> kind: PersistentVolumeClaim
 apiVersion: v1
 metadata:
   name: myclaim
 spec:
   storageClassName: &quot;&quot;
   accessModes:
     - ReadWriteOnce
   resources:
     requests:
       storage: 5Gi
</code></pre>
</li>
<li>The PV and PVC should be bound immediately:
<pre><code> $ kubectl get pvc
 NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
 myclaim   Bound     pv0003    5Gi        RWO           4s
 $ ./cluster/kubectl.sh get pv
 NAME      CAPACITY   ACCESSMODES   STATUS    CLAIM             REASON    AGE
 pv0003    5Gi        RWO           Bound     default/myclaim             57s
</code></pre>
</li>
</ol>
