Гид по технологиям

Постоянное хранение данных в Kubernetes

5 min read DevOps Обновлено 12 Dec 2025
Постоянное хранение в Kubernetes
Постоянное хранение в Kubernetes

Логотип Kubernetes на стилизованном фоне

Кратко

Kubernetes по умолчанию предоставляет эфемерные файловые системы для Pod. Для сохранения данных вне жизненного цикла контейнера используются PersistentVolume (PV) и PersistentVolumeClaim (PVC). Ниже — понятное руководство с примером, объяснением классов хранилищ, режимов доступа, рекомендациями и контрольными списками для команд.

Быстрые ссылки

  • Базовый пример
  • Классы хранилищ
  • Режимы доступа
  • Рекомендации и контрольные списки
  • Заключение

Почему это важно

Контейнеры по своей природе статeless — их файловая система исчезает при пересоздании. PersistentVolume и PersistentVolumeClaim позволяют хранить данные независимо от жизненного цикла Pod, что критично для баз данных, очередей и любых приложений, которым нужна долговременная запись.

Базовый пример

Ниже показан минимальный рабочий набор: PersistentVolume, PersistentVolumeClaim и Pod, который использует PVC. Пример предполагает namespace pvc-demo. Примеры используют hostPath для локального тестирования; в production используйте облачные или сетевые драйверы.

Применение манифестов:

kubectl apply -f pv.yaml -n pvc-demo
kubectl apply -f pvc.yaml -n pvc-demo
kubectl apply -f pod.yaml -n pvc-demo

Создание PersistentVolume

Файл pv.yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-volume
  namespace: pvc-demo
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data

Объяснение ключей:

  • storageClassName: имя класса хранилища; при ручном создании часто ставят “manual”.
  • capacity.storage: вместимость PV (здесь 2Gi).
  • accessModes: режимы монтирования (см. раздел ниже).
  • hostPath: локальный путь на узле (только для тестов).

Создание PersistentVolumeClaim

Файл pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-volume-claim
  namespace: pvc-demo
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

PVC запрашивает 1Gi из PV с классом manual. Kubernetes попытается найти подходящий PV и пометит их статус как Bound, когда сопоставление выполнено.

Проверка статусов:

kubectl get pv my-volume -n pvc-demo
kubectl get pvc my-volume-claim -n pvc-demo

Добавление Pod

Файл pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: pvc-demo
spec:
  containers:
    - name: my-container
      image: my-image:latest
      volumeMounts:
        - mountPath: /path/in/container
          name: my-pod-volume
  volumes:
    - name: my-pod-volume
      persistentVolumeClaim:
        claimName: my-volume-claim

Pod ссылается на PVC в секции volumes; в volumeMounts указываете тот же name и путь внутри контейнера. Всё, что записано в /path/in/container, будет сохраняться на PV вне жизненного цикла Pod.

Классы хранилищ

Класс хранилища (StorageClass) описывает «тип» тома и параметры динамического provisioner’а. Часто управляемые Kubernetes-сервисы (GKE, EKS, AKS, DigitalOcean) поставляют свои StorageClass:

  • GKE: gcePersistentDisk (или стандартные классы GCP)
  • DigitalOcean: do-block-storage
  • AWS: gp2 / gp3 (EBS)

Когда используется динамическое provisioner’ы, вам не нужно вручную создавать PV: создайте только PVC с нужным storageClassName и ресурсом requests.storage — провайдер создаст PV автоматически.

Важно

  • Не все StorageClass поддерживают все accessModes.
  • Если storageClassName у PVC пустой, будет использован дефолтный класс кластера (если он настроен).

Режимы доступа

Доступные значения поля accessModes:

  • ReadWriteOnce — том можно смонтировать для чтения/записи только на одном узле.
  • ReadOnlyMany — том можно монтировать на несколько узлов только для чтения.
  • ReadWriteMany — том можно монтировать на несколько узлов для чтения и записи.

Последствия

  • Для реплицируемых Pod, которые нуждаются в общем томе на разных узлах, нужен ReadWriteMany (или ReadOnlyMany, если только чтение).
  • Многие облачные блоковые диски не поддерживают ReadWriteMany; для этого часто используют сетевые файловые системы (NFS, GlusterFS, CIFS) или CSI-драйверы типа NFS/CEPH/Rook.

Провайдеры и ограничения

  • Проверяйте документацию драйвера: не все плагины поддерживают все режимы.
  • Сочетание accessModes влияет на алгоритм планировщика Kubernetes при распределении Pod по узлам.

Когда это не сработает

  • HostPath используется только для локальных тестов: если Pod переедет на другой узел, данные не будут доступны.
  • Некоторые облачные диски нельзя одновременно монтировать на два узла в режиме ReadWriteMany.
  • Неправильно указанный storageClassName или отсутствующий default StorageClass приведёт к ожиданию PVC в состоянии Pending.

Альтернативные подходы

  • Использовать объект StatefulSet для приложений, где важен постоянный идентификатор и привязка хранилища к реплике.
  • Применять оператор для динамических распределённых хранилищ (Rook, OpenEBS, Longhorn) для управления распределёнными томами.
  • Для мульти-рид/райт сценариев применять сетевые файловые системы (NFS, CIFS) или распределённые файловые системы (Ceph, GlusterFS).

Мини-методология внедрения постоянного хранилища (шаги)

  1. Оцените требования приложения: IOPS, throughput, доступность, режим доступа.
  2. Выберите тип хранилища и StorageClass, совместимый с accessModes.
  3. Для локальной отладки используйте hostPath; в production — облачные/сетевые драйверы или CSI.
  4. Настройте PVC с requests.storage и нужным storageClassName.
  5. Примените манифесты и проверьте состояние PV/PVC.
  6. Ручные тесты: создайте Pod, запишите и прочитайте данные при пересоздании Pod.
  7. Документируйте политику удаления (reclaimPolicy) PV: Retain, Recycle или Delete.

Контрольные списки по ролям

DevOps / Platform Engineer

  • Настроить и документировать StorageClass в кластере.
  • Обеспечить резервное копирование PV и стратегию восстановления.
  • Проверить поддержку accessModes у выбранного провайдера.

Разработчик

  • Запросить PVC с адекватным размером и классом.
  • Разделить конфигурацию: secrets, configMaps и тома данных.
  • Тестировать восстановление при пересоздании Pod.

SRE

  • Следить за метриками дисковой подсистемы (IOPS, latency, available capacity).
  • Настроить alerting на заполнение PVC.
  • Прогонять сценарии failover и проверки данных.

Сравнение подходов (кратко)

  • hostPath: быстрый для разработки, не подходит для HA.
  • Cloud Block Storage (EBS/GCE PD): высокие IOPS, обычно RWO.
  • NFS/Share/Distributed FS: поддерживает RWX, может требовать управляющий кластер.
  • CSI-провайдеры: гибкость, динамический provisioning, зависят от реализации.

Диагностика типичных проблем

  • PVC остаётся в состоянии Pending: проверьте storageClassName и подходящие PV.
  • Сбои монтирования: проверьте права на директорию hostPath и логи kubelet на узле.
  • Неожиданное удаление данных: проверьте reclaimPolicy PV (Delete удалит ресурс вместе с PV).

Decision flowchart по выбору решения

flowchart TD
  A[Требуется постоянное хранилище?] -->|Нет| B[Используйте ephemeral тома]
  A -->|Да| C{Нужно монтирование на нескольких узлах}
  C -->|Нет| D[Используйте блоковое хранилище 'EBS/GCE PD']
  C -->|Да| E{Нужно RWX или только RO}
  E -->|RWX| F[Используйте NFS/CEPH/CSI с поддержкой RWX]
  E -->|RO| G[Можно использовать ReadOnlyMany через сетевой том]
  D --> H[Выбрать StorageClass и PVC]
  F --> H
  G --> H
  H --> I[Тестирование и мониторинг]

Критерии приёмки

  • PVC получает статус Bound к PV.
  • Данные, записанные в Pod, доступны после пересоздания Pod.
  • Размер PV >= заявленного в PVC.
  • Мониторинг оповещает при заполнении > 80%.

Краткая сводка ключевых фактов

  • PV независим от Pod; PVC — запрос Pod на использование PV.
  • StorageClass управляет динамическим созданием PV.
  • accessModes определяют, как и где можно монтировать том.
  • Для HA/мульти-нода используйте RWX-совместимые решения.

1‑строчный глоссарий

  • PersistentVolume (PV): абстракция физического или сетевого тома.
  • PersistentVolumeClaim (PVC): запрос Pod на PV.
  • StorageClass: шаблон и параметры для динамического provisioner’а.
  • accessModes: режимы монтирования тома (RWO, ROX, RWX).

Риски и рекомендации

  • Не используйте hostPath в production — потеря данных при переносе Pod.
  • Планируйте политику резервного копирования и восстановления заранее.
  • Проверяйте, поддерживает ли ваш провайдер нужные accessModes и постарайтесь автоматизировать создание StorageClass.

Заключение

PersistentVolume и PersistentVolumeClaim — основа постоянного хранения в Kubernetes. Понимание взаимодействия PV/PVC, выбора StorageClass и доступа критично для устойчивости приложений. Следуйте мини‑методологии, используйте role‑based контрольные списки и тестируйте сценарии восстановления, чтобы избежать потери данных.

Важно

  • Всегда документируйте выбранные StorageClass и стратегию удаления данных (reclaimPolicy).

Краткое резюме

  • Создавайте PVC для всех приложений с данными.
  • Подбирайте StorageClass в соответствии с требованиями (IOPS, доступность, режим доступа).
  • Тестируйте восстановление и мониторьте заполнение томов.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как исправить ошибку DirectX в MW3
Техподдержка

Как исправить ошибку DirectX в MW3

Совместный плейлист в YouTube Music
Музыка

Совместный плейлист в YouTube Music

Как удалить плейлист в Spotify — быстро и навсегда
Музыка

Как удалить плейлист в Spotify — быстро и навсегда

Отключить Xbox Game Bar в Windows 10 — 4 способа
Windows

Отключить Xbox Game Bar в Windows 10 — 4 способа

Очередь видео в YouTube: как пользоваться
Инструкции

Очередь видео в YouTube: как пользоваться

Резервное копирование сохранений Steam
Игры

Резервное копирование сохранений Steam