Ответ
StorageClass в Kubernetes — это объект, который описывает «класс» или тип хранилища, который может быть динамически выделен для Pod'ов. Он абстрагирует физические характеристики хранилища (производительность, тип диска, политики) и позволяет администраторам предлагать разработчикам различные типы хранилищ через самообслуживание.
Как это работает:
- Администратор кластера определяет один или несколько StorageClass, указывая провизионера (provisioner) и его параметры.
- Разработчик создает PersistentVolumeClaim (PVC), ссылаясь на нужный StorageClass по имени.
- Контроллер постоянных томов (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'у — важно для зональных кластеров).