PVs and PVCs

PersistentVolumes and PersistentVolumeClaims

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):

A hand-made PersistentVolume and a claim that binds to itShell
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=$PVC
Output
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.