Что такое StorageClass в Kubernetes?

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

Ответ

StorageClass в Kubernetes — это объект, который описывает «класс» или тип хранилища, который может быть динамически выделен для Pod'ов. Он абстрагирует физические характеристики хранилища (производительность, тип диска, политики) и позволяет администраторам предлагать разработчикам различные типы хранилищ через самообслуживание.

Как это работает:

  1. Администратор кластера определяет один или несколько StorageClass, указывая провизионера (provisioner) и его параметры.
  2. Разработчик создает PersistentVolumeClaim (PVC), ссылаясь на нужный StorageClass по имени.
  3. Контроллер постоянных томов (Persistent Volume Controller) наблюдает за новыми PVC, находит подходящий StorageClass и автоматически создает PersistentVolume (PV), используя соответствующего провизионера.

Пример StorageClass для быстрого SSD-хранилища в AWS:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs # Провизионер для AWS EBS
parameters:
  type: gp3                     # Тип тома AWS (General Purpose SSD)
  fsType: ext4                  # Файловая система
  iopsPerGB: "50"              # Дополнительные IOPS
reclaimPolicy: Delete           # Том удаляется при удалении PVC
allowVolumeExpansion: true      # Позволяет увеличивать размер тома
volumeBindingMode: WaitForFirstConsumer # Отложенное выделение

Практическое применение в DevOps:

  • Самообслуживание: Разработчики могут запрашивать хранилище, не зная деталей облачного провайдера, просто указав storageClassName: fast-ssd в своем PVC.
  • Оптимизация затрат: Можно создать разные классы: fast-ssd для баз данных, standard-hdd для архивов логов, network-ssd (например, AWS EFS) для разделяемых данных.
  • Динамическое выделение: Устраняет необходимость вручную создавать тома (PV) заранее.
  • Миграция и переносимость: Манифесты с StorageClass могут быть частью Helm-чартов или Kustomize, что делает развертывание приложения с состоянием переносимым между разными кластерами (при условии поддержки провизионера).

Важные параметры:

  • reclaimPolicy: Delete (том удаляется) или Retain (том сохраняется, данные не теряются).
  • volumeBindingMode: Immediate (сразу) или WaitForFirstConsumer (том создается только при назначении Pod'у — важно для зональных кластеров).