Короткий ответ
PersistentVolume (PV) — это объект, описывающий конкретный ресурс хранения в кластере (диск, NFS-шару и т.п.), а PersistentVolumeClaim (PVC) — это запрос приложения на хранилище с нужным объёмом и режимом доступа; Kubernetes связывает (bind) PVC с подходящим PV, а Pod монтирует именно PVC.
Как это работает подробнее
администратор кластера (или StorageClass с динамическим provisioning) создаёт PV, а разработчик описывает PVC с требованиями (размер, accessMode, класс хранилища); контроллер находит подходящий PV и связывает его с PVC один к одному. При динамическом provisioning (через StorageClass) PV создаётся автоматически в момент создания PVC, без ручного шага.
Пример кода
manifest.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata: { name: data-claim }
spec:
accessModes: ["ReadWriteOnce"]
resources: { requests: { storage: 5Gi } }
storageClassName: standardЧто использовать на практике
- Практика. приложения в манифестах ссылаются только на PVC, оставаясь независимыми от конкретной реализации хранилища (облачный диск, NFS, Ceph) — это абстракция, позволяющая переносить манифесты между средами. Режим доступа
ReadWriteOnceозначает, что том можно монтировать на чтение-запись только на одном узле одновременно, что важно учитывать при проектировании StatefulSet.
Подводные камни
- Риски. путать PV (ресурс кластера, создаёт администратор или StorageClass) и PVC (запрос приложения) — это разные уровни абстракции; пытаться смонтировать один и тот же PVC с
ReadWriteOnceв поды на разных узлах одновременно и получать ошибку монтирования; не указыватьstorageClassName, полагаясь на класс по умолчанию, который может отличаться между кластерами.