There is a way to pre-bind PVs to PVCs today, here is an example showing how:
1) Create a PV object with a ClaimRef field referencing a PVC that you will subsequently create:
$ kubectl create -f pv.yaml
persistentvolume "pv0003" created
where pv.yaml contains:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
claimRef:
namespace: default
name: myclaim
nfs:
path: /tmp
server: 172.17.0.2
2) Then create the PVC with the same name:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
3) The PV and PVC should be bound immediately:
$ 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
We are also planning on introducing "Volume Selectors", which will enable users to select specific storage based on some implementation specific characteristics (specific rack, for example, or in your case, a way to enforce 1:1 PV to PVC mapping).
See https://github.com/kubernetes/kubernetes/issues/18333.