Ответ
Kubernetes Storage — это набор абстракций и механизмов для управления состоянием (stateful) данных в кластере, обеспечивающий их сохранность между перезапусками и ресхедулированием подов. В отличие от ephemeral storage, это решение для данных, которые должны пережить жизненный цикл отдельного пода.
Ключевые компоненты:
- PersistentVolume (PV) — абстракция физического или сетевого хранилища (например, диска AWS EBS, Azure Disk, NFS-шары, Ceph RBD) как ресурса кластера.
- PersistentVolumeClaim (PVC) — запрос пользователя (пода) на выделение хранилища с определёнными характеристиками (размер, режим доступа) из доступных PV.
- StorageClass — шаблон для динамической подготовки (Dynamic Provisioning) PV. Позволяет создавать хранилище "по требованию" при создании PVC.
- CSI (Container Storage Interface) — стандартный плагин для интеграции сторонних систем хранения.
Пример манифеста PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data-pvc
spec:
accessModes:
- ReadWriteOnce # Только одна нода может монтировать том на запись
resources:
requests:
storage: 50Gi
storageClassName: gp2 # Ссылка на StorageClass для динамического создания
Типы и выбор хранилища:
- Блоковые (EBS, GCE Persistent Disk, Azure Disk): Высокая производительность для баз данных (режимы
ReadWriteOnce). - Файловые (EFS, Azure Files, NFS): Разделяемый доступ между несколькими подами (режимы
ReadWriteMany), подходит для веб-контента. - Объектные (S3, GCS): Обычно подключаются не через стандартный PV/PVC, а через sidecar-контейнеры или библиотеки приложения, для бэкапов и больших данных.
Практическое использование: В StatefulSet'ах (например, для Kafka или PostgreSQL) мы явно связываем каждый инстанс пода с уникальным PVC, что гарантирует сохранность данных при рестарте и миграции пода на другую ноду.