StatefulSet и storage
Тема дорожной карты · Kubernetes
Stateful-хранилище в Kubernetes — набор примитивов и паттернов, обеспечивающих долговечное хранилище с сохранением идентичности для приложений вроде баз данных, очередей сообщений и распределённых файловых систем, которые не могут допустить потерю данных при перезапусках или перепланировании Pod'ов. Основой stateful-хранилища является спецификация CSI (Container Storage Interface), реализуемая драйверами AWS EBS CSI driver, GCE PD CSI driver, Rook/Ceph CSI и Longhorn, провизирующими и подключающими блочное или файловое хранилище к узлам и предоставляющими его через объекты PersistentVolume. StatefulSet потребляет stateful-хранилище через volumeClaimTemplates, автоматически создающие уникально именованные PersistentVolumeClaim — например, data-postgres-0, data-postgres-1, — обеспечивая сохранение хранилища каждой реплики даже после удаления и перепланирования. Объекты StorageClass управляют поведением провайдера через параметры type: gp3, fsType: ext4 и reclaimPolicy: Retain, а accessModes: [ReadWriteOnce] применяет привязку к одному узлу для блочного хранилища или ReadWriteMany для общих томов NFS или CephFS. Резервное копирование и восстановление stateful-хранилища в Kubernetes обрабатывается Velero, делающим снимки PersistentVolume через API снимков CSI-томов и хранящим резервные копии в S3-совместимом объектном хранилище.
Как это работает
StatefulSet и storage в Kubernetes соединяет pods с долговременным хранилищем через три слоя: PersistentVolumeClaim (PVC), декларируемый пользователем, PersistentVolume (PV), стоящий за claim (pre-provisioned или динамически создаваемый через StorageClass) и underlying storage (cloud block storage, NFS, Ceph и т.д.). При старте pod с PVC volume монтируется; при перемещении pod volume следует за ним.
Когда применять
Используйте StatefulSet и storage для 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.