Модуль находится в процессе активного развития. Функциональность может существенно измениться.

Работоспособность модуля гарантируется только при использовании стоковых ядер, поставляемых вместе с поддерживаемыми дистрибутивами.

Работоспособность модуля при использовании других ядер или дистрибутивов возможна, но не гарантируется.

Контроллер работает с двумя типами ресурсов:

  • 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-ресурс отсутствует.
    • В этом случае контроллер самостоятельно заполняет все поля ресурса.
  • Пользовательское создание:

    • Пользователь вручную создает ресурс, заполняя только поля 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
        blockDeviceNames:
          - dev-c1de9f9b534bf5c0b44e8b1cd39da80d5cda7c3f
          - dev-f3269d92a99e1f668255a47d5d3500add1462711
        actualVGNameOnTheNode: "vg-0"
      
    • Пример ресурса для создания локальной LVM Volume Group и Thin-pool на ней из нескольких BlockDevice:

      apiVersion: storage.deckhouse.io/v1alpha1
      kind: LvmVolumeGroup
      metadata:
        name: "vg-thin-on-node-0"
      spec:
        type: Local
        blockDeviceNames:
          - dev-0428672e39334e545eb96c85f8760fd59dcf15f1
          - dev-456977ded72ef804dd7cec90eec94b10acdf99b7
        actualVGNameOnTheNode: "vg-thin"
        thinPools:
        - name: thin-1
          size: 250Gi
      

    Обратите внимание, что в ресурсе не указывается узел, на котором будет создана Volume Group. Узел берется из ресурсов BlockDevice, имена которых указаны в spec.blockDeviceNames.

    Внимание! Все выбранные блок-девайсы должны принадлежать одному узлу для LVMVolumeGroup с типом ‘Local’.

Обновление ресурса LVMVolumeGroup

Контроллер в автоматическом режиме обновляет поле status ресурса LVMVolumeGroup, отображая актуальные данные о соответствующей LVM Volume Group на узле. Пользователю не рекомендуется собственноручно вносить изменения в поле status.

Контроллер не обновляет поле spec, так как указанное поле отображает желаемое состояние LVM Volume Group. Пользователь может вносить изменения в поле spec, чтобы изменить состояние указанной в ресурсе LVM Volume Group на узле.

Удаление ресурса LVMVolumeGroup

Контроллер автоматически удалит ресурс, если указанная в нем Volume Group стала недоступна по той или иной причине (например на узле были отключены все блочные устройства, из которых состояла Volume Group).

Пользователь может удалить ресурс самостоятельно, но в том случае, если на момент удаления ресурса соответствующая LVM Volume Group еще будет существовать на узле, контроллер создаст по существующей Volume Group ресурс автоматически, указав для созданного ресурса новое сгенерированное имя.

Пользователь может удалить LVM Volume Group с узла и связанные с ним LVM Physical Volume, добавив в соответствующий LVMVolumeGroup-ресурс аннотацию storage.deckhouse.io/sds-delete-vg: "". Контроллер отреагирует на указанную аннотацию и запустит процесс удаления LVM Volume Group и ее составляющих с узла.

Внимание! Запрещено удаление LVM Volume Group описанным выше методом, если она содержит Logical Volume, даже если это только Thin-pool, который указан в spec. Пользователю необходимо самостоятельно удалять все Logical Volume, которые содержит удаляемая Volume Group.