Что такое volume в Kubernetes и зачем он нужен?

Что такое volume в Kubernetes и зачем он нужен

Volume в Kubernetes — это абстракция для хранения данных, которую можно подключать к Pod и контейнерам внутри Pod. Она даёт место для данных, отличное от временной файловой системы контейнера (overlay/fs слоя), и решает две основные задачи: сохранить нужные данные при перезапуске контейнера внутри того же Pod и/или предоставить общий каталог для нескольких контейнеров в одном Pod.

Ключевые свойства

  • Volume объявляется в spec.volumes Pod-а и монтируется в контейнеры через volumeMounts.

  • Жизненный цикл volume привязан к Pod (для многих видов volume): когда Pod удаляется — volume, описанный в Pod, тоже теряется (есть исключения — PersistentVolume).

  • Volume обеспечивает совместный доступ для всех контейнеров в одном Pod (полезно для sidecar-паттернов).

  • Есть как эпhemerальные (временные, например emptyDir), так и персистентные (PersistentVolume + PVC), которые сохраняют данные независимо от конкретных Pod.

Типы и примеры использования

  • emptyDir — временная директория на ноде, создаётся при запуске Pod и удаляется при его завершении. Подходит для временных файлов, кэшей между контейнерами в Pod. Можно задать emptyDir.medium: "Memory" для tmpfs (RAM).

  • hostPath — монтирует путь с ноды в Pod. Используйте с осторожностью (безопасность, привязка к ноде).

  • configMap / secret — монтируют конфигурацию или секреты как файлы или переменные окружения.

  • downwardAPI — даёт доступ к метаданным Pod (имя, namespace, labels) как файлы/переменные.

  • persistentVolumeClaim (PVC) — логический запрос хранения; связывается с PersistentVolume (PV), который представляет реальный ресурс хранения (NFS, cloud-disk, iSCSI, Ceph, CSI-драйвер и т.д.). PVC позволяет получить персистентное хранилище, которое переживёт перезапуск Pod и даже удаление/воссоздание Pod на другой ноде (если PV поддерживает это).

  • CSI (Container Storage Interface) — современный плагинный механизм для подключения внешних систем хранения (AWS EBS, GCE PD, Azure Disk, NFS, Gluster, Ceph, и др.) через драйверы.

Доступ и режимы

  • AccessModes для PV/PVC: ReadWriteOnce (RWO) — запись с одного узла, ReadOnlyMany (ROX) — можно читать с многих узлов, ReadWriteMany (RWX) — запись с многих узлов (поддерживается не всеми провайдерами).

  • Reclaim policy у PV (например Delete/Retain) — что происходит с физическим хранилищем после удаления PV/PVC.

Примеры YAML

Ephemeral (emptyDir):

apiVersion: v1
kind: Pod
metadata:
name: example-emptydir
spec:
containers:
\- name: app
image: busybox
command: \["sh","-c","sleep 3600"\]
volumeMounts:
\- name: cache
mountPath: /cache
volumes:
\- name: cache
emptyDir: {}
Persistent (PVC + Pod):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-claim
spec:
accessModes:
\- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
\---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-pvc
spec:
containers:
\- name: db
image: postgres
volumeMounts:
\- name: data
mountPath: /var/lib/postgresql/data
volumes:
\- name: data
persistentVolumeClaim:
claimName: my-claim

Практические сценарии

  • Базы данных и блоб-хранилища — требуют персистентного тома (PVC → PV).

  • Совместная работа контейнеров в Pod (sidecar logging, agent) — emptyDir или общий том.

  • Передача конфигурации/секретов — configMap / secret.

  • Быстрый временный кэш или временный рабочий каталог — emptyDir.

  • Логи/архивы — лучше централизовать (EFK, Loki), но для краткосрочной потребности можно монтировать том.

Ограничения и подводные камни

  • Некоторые volume (hostPath, локальные PV) привязывают Pod к конкретной ноде — это ухудшает переносимость.

  • Не всякое хранилище поддерживает RWX; для масштабируемых приложений нужен сетевой сторидж с поддержкой мульти-рид/райт.

  • Если приложение пишет файлы внутри контейнера (не stdout), kubectl logs это не покажет — нужно монтировать или просматривать файлы через exec или собирать логи агентом.

  • Права и безопасность: hostPath и неправильные права на монтируемые секреты опасны, внимательно настраивайте права доступа и securityContext.

Полезные опции

  • subPath — смонтировать только поддиректорию тома в контейнер.

  • readOnly: true на volumeMount — сделать том доступным только для чтения.

  • Динамическое выделение (StorageClass) — позволяет автоматически создавать PV при создании PVC.

  • Расширение PVC, снапшоты и бэкапы — зависят от провайдера/StorageClass.

Знание типов томов, их жизненного цикла и режимов доступа — ключ к корректному проектированию хранения в Kubernetes и к избеганию потерь данных при перезапусках, обновлениях и переносе подов между нодами.