A PersistentVolume (PV) is a cluster-scoped object describing real storage: a cloud disk, an NFS export, a node directory. A PersistentVolumeClaim (PVC) is a namespaced request by size, access mode and class. The control plane binds each claim to one matching volume, and Pods mount the claim, so application manifests do not change with the storage. An administrator can create volumes by hand (PVC and PVS are reused column lists):
kubectl apply -f - <<'EOF'
apiVersion: v1
kind: PersistentVolume
metadata: { name: manual-pv }
spec: { capacity: { storage: 1Gi }, accessModes: [ReadWriteOnce], storageClassName: manual,
hostPath: { path: /srv/manual-pv } }
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: { name: manual-claim }
spec: { storageClassName: manual, accessModes: [ReadWriteOnce],
resources: { requests: { storage: 500Mi } } }
EOF
kubectl wait --for=jsonpath='{.status.phase}'=Bound pvc/manual-claim >/dev/null
C=NAME:.metadata.name,STATUS:.status.phase
PVC=$C,VOLUME:.spec.volumeName,SIZE:.status.capacity.storage
PVS=$C,SIZE:.spec.capacity.storage,CLAIM:.spec.claimRef.name
PVS=$PVS,POLICY:.spec.persistentVolumeReclaimPolicy
kubectl get pv manual-pv -o custom-columns=$PVS; kubectl get pvc manual-claim -o custom-columns=$PVCOutput
persistentvolume/manual-pv created persistentvolumeclaim/manual-claim created NAME STATUS SIZE CLAIM POLICY manual-pv Bound 1Gi manual-claim Retain NAME STATUS VOLUME SIZE manual-claim Bound manual-pv 1Gi
Binding is one-to-one: the 500 MiB claim received the whole 1 GiB volume. A claim with no match stays Pending. Static volumes suit existing NFS shares or disks; otherwise dynamic provisioning creates one per claim.