Функциональность модуля может измениться, но основные возможности сохранятся. Совместимость с будущими версиями обеспечивается, но может потребовать дополнительных действий по миграции.
Работоспособность модуля гарантируется только при использовании стоковых ядер, поставляемых вместе с поддерживаемыми дистрибутивами.
Работоспособность модуля при использовании других ядер или дистрибутивов возможна, но не гарантируется.
Контроллер работает с двумя типами ресурсов:
BlockDevice
;LVMVolumeGroup
.
Работа с ресурсами BlockDevice
Создание ресурса BlockDevice
Контроллер регулярно сканирует существующие девайсы на узле, и в случае, если девайс удовлетворяет всем необходимым
условиям со стороны контроллера, создается custom resource
(CR) BlockDevice
с уникальным именем, в котором отображена
полная и необходимая информация о соответствующем девайсе.
Требования контроллера к девайсу
- Не является drbd-устройством.
- Не является псевдодевайсом (то есть не loop device).
- Не является
Logical Volume
. - Файловая система отсутствует или соответствует
LVM2_MEMBER
. - У блок-девайса отсутствуют партиции.
- Размер блок-девайса больше 1 Gi.
- Если девайс — виртуальный диск, у него должен быть серийный номер.
Информацию из полученного ресурса контроллер будет использовать для своей дальнейшей работы с ресурсами LVMVolumeGroup
.
Обновление ресурса BlockDevice
Контроллер самостоятельно обновляет информацию в ресурсе, если состояние указанного в нем блок-девайса поменялось на узле.
Удаление ресурса BlockDevice
Контроллер автоматически удалит ресурс, если указанный в нем блок-девайс стал недоступен. Удаление произойдёт только в следующих случаях:
- если ресурс был в статусе Consumable;
- если блок-девайс принадлежит
Volume Group
, у которой нет LVM-тегаstorage.deckhouse.io/enabled=true
(этаVolume Group
не управляется нашим контроллером).
Контроллер выполняет вышеперечисленные виды работ автоматически и не требует вмешательства со стороны пользователя.
В случае ручного удаления ресурса, он будет пересоздан контроллером.
Работа с ресурсами LVMVolumeGroup
Ресурсы BlockDevice
необходимы для создания и обновления ресурсов LVMVolumeGroup
.
На данный момент поддерживаются только локальные Volume Group
.
LVMVolumeGroup
-ресурсы предназначены для взаимодействия с LVM Volume Group
на узлах и отображения актуальной информации об их состоянии.
Создание ресурса LVMVolumeGroup
Ресурс LVMVolumeGroup
может быть создан 2 способами:
-
Автоматическое создание:
- Контроллер автоматически сканирует информацию о существующих
LVM Volume Group
на узлах и создает ресурс в случае, если уLVM Volume Group
имеется LVM-тегstorage.deckhouse.io/enabled=true
и соответствующий ей Kubernetes-ресурс отсутствует. - В этом случае контроллер самостоятельно заполнит все поля
Spec
-секции ресурса, кроме поляthinPools
. Пользователю необходимо вручную добавить вSpec
ресурса информацию оThin-pool
, имеющимся на узле, в случае, если он хочет, чтобы данныйThin-pool
попал под управление контроллера.
- Контроллер автоматически сканирует информацию о существующих
-
Пользовательское создание:
-
Пользователь вручную создает ресурс, заполняя только поля
metadata.name
иspec
, в котором указывает желаемое состояние новойVolume Group
. -
Конфигурация, указанная пользователем, пройдет специальную валидацию на корректность.
-
После успешного прохождения валидации контроллер использует указанную конфигурацию, чтобы по ней создать указанную
LVM Volume Group
на узле и обновить пользовательский ресурс актуальной информацией о состоянии созданнойLVM Volume Group
. -
Пример ресурса для создания локальной
LVM Volume Group
из несколькихBlockDevice
:apiVersion: storage.deckhouse.io/v1alpha1 kind: LVMVolumeGroup metadata: name: "vg-0-on-node-0" spec: type: Local local: nodeName: "node-0" blockDeviceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: In values: - dev-07ad52cef2348996b72db262011f1b5f896bb68f - dev-e90e8915902bd6c371e59f89254c0fd644126da7 actualVGNameOnTheNode: "vg-0"
apiVersion: storage.deckhouse.io/v1alpha1 kind: LVMVolumeGroup metadata: name: "vg-0-on-node-0" spec: type: Local local: nodeName: "node-0" blockDeviceSelector: matchLabels: kubernetes.io/hostname: node-0 actualVGNameOnTheNode: "vg-0"
-
Пример ресурса для создания локальной
LVM Volume Group
иThin-pool
на ней из несколькихBlockDevice
:apiVersion: storage.deckhouse.io/v1alpha1 kind: LVMVolumeGroup metadata: name: "vg-0-on-node-0" spec: type: Local local: nodeName: "node-0" blockDeviceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: In values: - dev-07ad52cef2348996b72db262011f1b5f896bb68f - dev-e90e8915902bd6c371e59f89254c0fd644126da7 actualVGNameOnTheNode: "vg-0" thinPools: - name: thin-1 size: 250Gi
apiVersion: storage.deckhouse.io/v1alpha1 kind: LVMVolumeGroup metadata: name: "vg-0-on-node-0" spec: type: Local local: nodeName: "node-0" blockDeviceSelector: matchLabels: kubernetes.io/hostname: node-0 actualVGNameOnTheNode: "vg-0" thinPools: - name: thin-1 size: 250Gi
Вы можете указать любые удобные для Вас селекторы для ресурсов
BlockDevice
. Так, например, Вы можете выбрать все девайсы на этом узле (используя, например,matchLabels
), либо выбрать часть, дополнительно указав их имена (или иные другие параметры). Обратите внимание, что полеspec.local
является обязательным для типаLocal
. В случае расхождения имени в полеspec.local.nodeName
и селекторах создание LVMVolumeGroup выполнено не будет.Внимание! Все выбранные блок-девайсы должны принадлежать одному узлу для
LVMVolumeGroup
с типом ‘Local’. -
Обновление ресурса LVMVolumeGroup
Вы можете изменить желаемое состояние VolumeGroup
или thin pool
на узлах с помощью изменения поля spec
соответствующего ресурса LVMVolumeGroup
. Контроллер автоматически провалидирует новые данные и, в случае их валидного состояния, внесет необходимые изменения в сущности на узле.
Контроллер в автоматическом режиме обновляет поле status
ресурса LVMVolumeGroup
, отображая актуальные данные о соответствующей LVM Volume Group
на узле.
Пользователю не рекомендуется собственноручно вносить изменения в поле status
.
Контроллер не обновляет поле
spec
, так как указанное поле отображает желаемое состояниеLVM Volume Group
. Пользователь может вносить изменения в полеspec
, чтобы изменить состояние указанной в ресурсеLVM Volume Group
на узле.
Удаление ресурса LVMVolumeGroup
Контроллер автоматически удалит ресурс, если указанная в нем Volume Group
стала недоступна по той или иной причине (например на узле были отключены все блочные устройства, из которых состояла Volume Group
).
Пользователь может удалить LVM Volume Group
с узла и связанные с ним LVM Physical Volume
, выполнив команду на удаление ресурса LVMVolumeGroup
.
kubectl delete lvg %lvg-name%
Вывод ресурса BlockDevice
из LVMVolumeGroup
ресурса
Для того чтобы вывести BlockDevice
ресурс из LVMVolumeGroup
ресурса, необходимо либо изменить поле spec.blockDeviceSelector
LVMVolumeGroup
ресурса (добавить другие селекторы), либо изменить соответствующие лейблы у BlockDevice
ресурса, чтобы они больше не попадали под селекторы LVMVolumeGroup
. После этого вам необходимо вручную выполнить команды pvmove
, vgreduce
, и pvremove
на узле.
Внимание! Если удаляемый ресурс
LVMVolumeGroup
содержитLogical Volume
(даже если это толькоThin-pool
, который указан вspec
) пользователю необходимо самостоятельно удалить всеLogical Volume
, которые содержит удаляемаяVolume Group
. В противном случае ни ресурс, ниVolume Group
удалены не будут.
Пользователь может запретить удаление
LVMVolumeGroup
ресурса, повесив на ресурс специальную аннотациюstorage.deckhouse.io/deletion-protection
. При наличии данной аннотации контроллер не будет удалять ни ресурс, ни соответствующуюVolume Group
до тех пор, пока аннотация не будет снята с ресурса.