← Kubernetes: хранилище
6 мин · средне · Урок 2 из 2

StorageClass и динамическое выделение дисков

provisioner, reclaimPolicy и volumeBindingMode: три поля, которые решают, как и когда под PVC появится реальный диск.

StorageClass: рецепт диска

PersistentVolumeClaim (PVC) - запрос на хранилище: «дай 1 GiB в режиме ReadWriteOnce (том монтируется на запись только одним узлом)». StorageClass решает, как этот объём появится.

StorageClass - объект кластера, описывающий способ создания дисков. Он живёт на уровне всего кластера, не в namespace. У него три ключевых поля.

ПолеЧто решаетЗначение у local-path
provisionerкакой плагин создаёт PVrancher.io/local-path
reclaimPolicyсудьба диска после удаления PVCDelete
volumeBindingModeмомент создания PVWaitForFirstConsumer
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.

volumeBindingMode

volumeBindingMode задаёт момент создания PV.

Из-за 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    # проверить текущий шаг

Коротко

Прошли материал до конца? Отметьте урок пройденным.