PersistentVolume и PVC
Тема дорожной карты · Kubernetes
PersistentVolume (PV) и PersistentVolumeClaim (PVC) — двухуровневая абстракция хранилища Kubernetes, разделяющая способ провизирования хранилища и его потребления нагрузками. PersistentVolume — ресурс уровня кластера, представляющий единицу хранилища — на основе CSI-драйвера, NFS-ресурса или облачного диска (AWS EBS, GCP PD, Azure Disk) — с полями spec.capacity.storage, spec.accessModes (ReadWriteOnce, ReadWriteMany, ReadOnlyMany) и spec.persistentVolumeReclaimPolicy со значениями Retain, Recycle или Delete. PersistentVolumeClaim — ресурс уровня пространства имён, через который Pod запрашивает хранилище, указывая spec.resources.requests.storage и опциональный storageClassName; плоскость управления Kubernetes привязывает PVC к подходящему PV или динамически провизирует его через StorageClass и CSI-драйвер. Pod'ы монтируют PVC через spec.volumes[].persistentVolumeClaim.claimName и ссылаются на них в spec.containers[].volumeMounts, обеспечивая долговечное хранилище, переживающее жизненный цикл Pod'а. StatefulSet использует volumeClaimTemplates для автоматического создания PVC на каждую реплику, давая каждому Pod'у уникальный PersistentVolume для stateful-нагрузок вроде баз данных.
Как это работает
PersistentVolume и PVC в Kubernetes соединяет pods с долговременным хранилищем через три слоя: PersistentVolumeClaim (PVC), декларируемый пользователем, PersistentVolume (PV), стоящий за claim (pre-provisioned или динамически создаваемый через StorageClass) и underlying storage (cloud block storage, NFS, Ceph и т.д.). При старте pod с PVC volume монтируется; при перемещении pod volume следует за ним.
Когда применять
Используйте PersistentVolume и PVC для stateful-нагрузок: БД, очереди сообщений, кэши с persistence, загрузки файлов. Подбирайте тип под нагрузку — block storage (EBS, GCE PD) для одно-pod БД; ReadWriteMany (NFS, EFS, CephFS) когда несколько pods делят данные; ephemeral emptyDir для scratch space, которое может исчезнуть. Не используйте один PVC для несвязанных нагрузок — coupling усложняет upgrade.
Типичные ошибки
Storage-ловушки: неверный access mode (ReadWriteOnce на Deployment с replicas > 1 — pods deadlock на attach); не установили volumeBindingMode: WaitForFirstConsumer (volume провижится в не той AZ); забыли, что StatefulSet PVC НЕ удаляются при удалении StatefulSet (данные и счёт продолжают идти). Backup-стратегия важна: Velero или CSI-snapshot pipeline до production.