Динамическое предоставление томов дает возможность создания томов по требованию. Без динамического представления админисраторы кластера должны вручную обращаться к своим облачным хранилищам или службам хранения данных для создания новых томов, а затем создавать объекты персистентных томов PersistentVolume для представления этих хранилищ в Kubernetes. Функция динамического представления убирает необходимость предварительной подготовки хранилища администраторами кластера. Вместо этого, она автоматически представляет хранилище, когда пользователь создает объекты PersistentVolumeClaim.
Общая информация
Реализация динамического предоставления томов основана на объекте класса хранилища (StorageClass) в API, который находится в API группе storage.k8s.io. Администратор кластера может определить необходимое количество обьектов классов хранилища, в каждом их которых указывается плагин для тома (aka представитель), который предоставляет том и набор параметров для передачи представителю при предоставлении. Администратор кластера может определить и представить множество разновидностей хранилищ (от одной или разных систем хранения данных) в кластере, каждый с собственным набором параметров. Этот подход также избавляет конечного пользователя от сложностей и нюансов процесса выделения хранилища, но все еще дает возможность выбора из множества возможных хранилищ.
Дополнительную информацию о классах хранилищ можно найти по адресу: https://kubernetes.io/docs/concepts/storage/storage-classes/
Включение динамического предоставления
Чтобы включить динамическое предоставление, админисратору кластера нужно предварительно создать один или более объектов StorageClass для пользователей. Объекты StorageClass определяют какой надо использовать плагин преддоставления и какие параметры следует ему передавать когда будет вызвано динамическое предоставление. Имя объекта StorageClass должно быть валидным DNS именем субдомена.
Следующий манифест создает класс хранилища "slow" который предоставляет персистентные диски, похожие на стандартные.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: slow
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
Следующий манифест создает класс хранилища "fast" который предоставляет персистентные диски, похожие на SSD.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
Использование динамического предоставления
Пользователи запрашивают динамически-предоставляемые хранилища включая класс хранилища в свои манифесты PersistentVolumeClaim. До версии Kubernetes v1.6 это делалось через аннотацию volume.beta.kubernetes.io/storage-class. Однако, эта аннотация стала устаревшей с версии 1.9. Пользователи теперь могут и должны вместо этого использовать поле storageClassName объекта PersistentVolumeClaim. Значение этого поля должно совпадать с именем класса хранилища StorageClass, сконфигурированного администратором (смотри далее).
Чтобы выбрать класс хранилища "fast", пользователь должен был бы создать следующий PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: claim1
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast
resources:
requests:
storage: 30Gi
Это требование повлечет автоматическое предоставление персистентного диска типа SSD. При удалении требования, том также будет удален.
Поведение по умолчанию
Может быть выставлено такое динамическое предоставление в кластере, что если не указан класс хранилища, то они все считаются динамическими. Администратор кластера может включить это поведение так:
- Пометить один объект класса хранилищ по умолчанию;
- Убедиться, что контроллер допуска DefaultStorageClass включен в API сервере.
Администратор может пометить конкретный StorageClass по умолчанию, добавив ему аннотацию storageclass.kubernetes.io/is-default-class. Когда в кластере существует класс хранилища по умолчанию и пользователь создает PersistentVolumeClaim, в котором не указан storageClassName, то контроллер допуска DefaultStorageClass автоматически добавляет поле storageClassName, которое указывает на класс по умолчанию.
Если создать более одного класса хранилищ по умолчанию в кластере, то в таком случае будет использоваться самый последний класс, назначенный классом по умолчанию.
В мульти-зональных кластерах Поды могут быть распределены по зонам в регионе. Однозональные сервисы хранения данных должны в этом случае присутствовать на всех зонах, где будут эти Поды. Это можно настроить установкой режима монтирования томов Volume Binding Mode.