Как реализованы volumes в Kubernetes?

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

Ответ

Volumes в Kubernetes — это абстракция для предоставления хранилища контейнерам внутри Pod. Их основная цель — сохранять данные независимо от жизненного цикла контейнера.

Основные типы и их назначение:

  1. emptyDir — Временное хранилище, создаваемое при запуске Pod на ноде. Данные удаляются при удалении Pod. Используется для обмена данными между контейнерами в одном Pod или как кэш.
  2. hostPath — Монтирует файл или директорию с файловой системы ноды в Pod. Используется с осторожностью, так как привязывает Pod к конкретной ноде и может создать проблемы с безопасностью. Подходит для системных демонов (например, которым нужен доступ к /var/lib/docker).
  3. PersistentVolume (PV) — Ресурс кластера, представляющий собой кусок предварительно подготовленного сетевого хранилища (например, NFS, AWS EBS, GCE Persistent Disk). Администратор кластера создает PV.
  4. PersistentVolumeClaim (PVC) — Запрос пользователя (разработчика) на выделение хранилища из пула PV с определенными характеристиками (размер, режим доступа).

Типичный рабочий процесс (статическое выделение):

  1. Администратор создает PV.
  2. Разработчик создает PVC, который связывается с подходящим PV.
  3. Разработчик монтирует PVC в Pod.

Пример PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data-pvc
spec:
  accessModes:
    - ReadWriteOnce # Только одна нода может монтировать том на запись
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast-ssd # Опционально: указание класса хранилища

Использование PVC в Pod:

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: data-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: app-data-pvc # Ссылка на созданный PVC

Динамическое выделение (Dynamic Provisioning): — Более распространенный подход. Администратор определяет StorageClass, описывающий "поставщика" хранилища и его параметры. При создании PVC с указанием storageClassName система автоматически создает PV нужного типа. Это избавляет от необходимости заранее создавать PV вручную.