StorageClass и динамическое выделение дисков
provisioner, reclaimPolicy и volumeBindingMode: три поля, которые решают, как и когда под PVC появится реальный диск.
StorageClass: рецепт диска
PersistentVolumeClaim (PVC) - запрос на хранилище: «дай 1 GiB в режиме ReadWriteOnce (том монтируется на запись только одним узлом)». StorageClass решает, как этот объём появится.
StorageClass - объект кластера, описывающий способ создания дисков. Он живёт на уровне всего кластера, не в namespace. У него три ключевых поля.
| Поле | Что решает | Значение у local-path |
|---|---|---|
provisioner | какой плагин создаёт PV | rancher.io/local-path |
reclaimPolicy | судьба диска после удаления PVC | Delete |
volumeBindingMode | момент создания PV | WaitForFirstConsumer |
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-path
provisioner: rancher.io/local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
provisioner
provisioner - плагин, который создаёт PersistentVolume (PV) под запрос
PVC. PV - это сам кусок хранилища. В небольших локальных кластерах
provisioner обычно называется rancher.io/local-path и создаёт каталог
на узле. В AWS это ebs.csi.aws.com. Нужный плагин должен работать в
кластере, иначе PVC зависнет в статусе Pending.
Старые имена вида kubernetes.io/aws-ebs или kubernetes.io/gce-pd
попадаются в древних манифестах. Эти встроенные провизионеры вырезали из
ядра Kubernetes, сегодня любое хранилище подключается через CSI-драйвер,
и в поле provisioner пишут его имя.
reclaimPolicy
reclaimPolicy задаёт, что делать с PV после удаления PVC.
Delete- PV и диск под ним удаляются. Значение по умолчанию для большинства классов.Retain- PV и диск остаются. Безопаснее для важных данных на проде.
volumeBindingMode
volumeBindingMode задаёт момент создания PV.
Immediate- PV создаётся сразу после появления PVC. На кластере с несколькими зонами PV может оказаться не в той зоне, где встанет Pod.WaitForFirstConsumer- PV создаётся, когда появится Pod, использующий PVC. Это значение по умолчанию уlocal-path.
Из-за WaitForFirstConsumer PVC без Pod остаётся в Pending.
Он перейдёт в Bound только после старта Pod. Pod - наименьшая
единица, которую запускает Kubernetes.
StorageClass по умолчанию
Один StorageClass в кластере обычно помечен как класс по умолчанию
аннотацией storageclass.kubernetes.io/is-default-class: "true". Если
в PVC не указано поле storageClassName, берётся этот класс. Если
класса по умолчанию нет и поле пустое, PVC останется в Pending.
kubectl get sc
# NAME PROVISIONER ... DEFAULT
# local-path (default) rancher.io/local-path ... true
В колонке DEFAULT стоит true у класса по умолчанию.
Явный storageClassName
В PVC класс можно указать прямо:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-fast
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 1Gi
Явный storageClassName убирает зависимость от того, какой класс в
кластере выбран по умолчанию. Имя пишут как есть, символ в символ:
опечатка вроде local_path вместо local-path приведёт к ошибке,
такого класса в кластере нет.
Имя дефолтного класса зависит от дистрибутива. В k3s и k3d это
local-path, в kind и minikube — standard, в облаках свои имена
(gp2, standard-rwo и подобные). Не копируй имя из примера вслепую:
посмотри своё через kubectl get sc.
Полезные команды
# Список SC в кластере
kubectl get sc
# Параметры конкретного класса
kubectl describe sc local-path
# Поля PVC
kubectl explain pvc.spec
Домашка
Теорию закрепляет задание на своём кластере: 1 шаг с проверкой. Кластер поднимается по треку Kubernetes локально, задания лежат в репозитории k8s-practice.
./run.sh start k8s-storage-class # развернуть стартовое состояние
./run.sh verify k8s-storage-class # проверить текущий шаг
Коротко
- StorageClass - кластерный объект, рецепт создания дисков. В namespace он не живёт.
provisionerназывает плагин, который делает PV. Нет плагина в кластере - PVC висит вPending.reclaimPolicy: Deleteубирает диск вместе с PVC,Retainоставляет.volumeBindingMode: WaitForFirstConsumerоткладывает создание PV до появления Pod-потребителя.- PVC без
storageClassNameберёт класс по умолчанию. Класса по умолчанию нет - PVC не привяжется.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс