Какие есть способы хранения данных в Kubernetes?

«Какие есть способы хранения данных в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Kubernetes предлагает несколько абстракций для работы с данными, от временных до постоянных.

1. Тома (Volumes), привязанные к жизненному циклу пода

  • emptyDir: Создается при создании пода на ноде и удаляется при удалении пода. Используется для обмена данными между контейнерами в одном поде или как кэш.
    volumes:
    - name: shared-data
      emptyDir: {}
  • hostPath: Монтирует файл или директорию с файловой системы хостовой ноды в под. Опасно для продакшена (зависит от ноды, нарушает безопасность), но полезно для системных демонов (например, мониторинга), которым нужен доступ к /proc или /var/lib/docker.

2. Постоянное хранилище (Persistent Storage)

Это основное решение для stateful-приложений. Основано на двух ресурсах:

  • PersistentVolume (PV): Абстракция физического ресурса хранения в кластере (например, облачный диск, NFS-шара). Администратор создает PV.
  • PersistentVolumeClaim (PVC): Запрос пользователя (пода) на определенное количество ресурсов хранилища. Kubernetes привязывает подходящий PV к PVC.
    # PVC (в манифесте пода или StatefulSet)
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: postgres-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: fast-ssd

3. Динамическое выделение хранилища (StorageClass)

Позволяет автоматически создавать PV по запросу PVC. Определяет "класс" хранилища (например, fast-ssd, slow-hdd).

# PVC с указанием StorageClass триггерит создание PV в облаке
kind: PersistentVolumeClaim
metadata:
  name: dynamic-pvc
spec:
  storageClassName: gp2 # AWS EBS класс
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi

4. Конфигурация и секреты (ConfigMap, Secret)

  • ConfigMap: Хранит конфигурационные данные в виде пар ключ-значение или файлов. Монтируется в под как переменные окружения или файлы.
  • Secret: Аналогичен ConfigMap, но предназначен для хранения чувствительных данных (пароли, токены). Данные хранятся в base64-кодировке.

Практическая рекомендация: Для баз данных (PostgreSQL, Redis) всегда используйте StatefulSet в связке с PersistentVolumeClaim и StorageClass. Это обеспечивает стабильные сетевые идентификаторы (postgres-0, postgres-1) и то, что каждый под получит свой уникальный том, который будет следовать за ним при пересоздании на другой ноде.