Функциональность модуля может измениться, но основные возможности сохранятся. Совместимость с будущими версиями обеспечивается, но может потребовать дополнительных действий по миграции.

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

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

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

  • 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
        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 с узла и связанные с ним LVM Physical Volume, выполнив команду на удаление ресурса LVMVolumeGroup.

kubectl delete lvg %lvg-name%

Внимание! Если удаляемый ресурс LVMVolumeGroup содержит Logical Volume (даже если это только Thin-pool, который указан в spec) пользователю необходимо самостоятельно удалить все Logical Volume, которые содержит удаляемая Volume Group. В противном случае ни ресурс, ни Volume Group удалены не будут.

Пользователь может запретить удаление LVMVolumeGroup ресурса, повесив на ресурс специальную аннотацию storage.deckhouse.io/deletion-protection. При наличии данной аннотации контроллер не будет удалять ни ресурс, ни соответствующую Volume Group до тех пор, пока аннотация не будет снята с ресурса.