Доступно с ограничениями в редакциях: CE

Доступно без ограничений в некоторых коммерческих редакциях: SE, SE+, EE

Подробнее см. в разделе Условия и цены.

Использование локального хранилища помогает избежать сетевых задержек и повышает производительность по сравнению с удалёнными хранилищами, доступ к которым осуществляется по сети. Этот подход идеально подходит для тестовых сред и EDGE-кластеров.

Включение модуля

Настройка локального блочного хранилища происходит на основе логического менеджера томов LVM (Logical Volume Manager). Управление LVM осуществляется модулем sds-node-configurator, который необходимо включить перед активацией модуля sds-local-volume.

Чтобы включить модуль, примените ресурс ModuleConfig:

d8 k apply -f - <<EOF
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: sds-node-configurator
spec:
  enabled: true
  version: 1
EOF

Дождитесь, когда модуль sds-node-configurator перейдет в состояние Ready. Проверить состояние можно, выполнив следующую команду:

d8 k get modules sds-node-configurator -w

В результате будет выведена информация о модуле sds-node-configurator:

NAME                    WEIGHT   STATE     SOURCE      STAGE   STATUS
sds-node-configurator   900      Enabled   deckhouse           Ready

Затем, чтобы включить модуль sds-local-volume с настройками по умолчанию, выполните команду:

d8 k apply -f - <<EOF
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: sds-local-volume
spec:
  enabled: true
  version: 1
EOF

Это приведет к тому, что на всех узлах кластера будут запущены служебные поды компонентов sds-local-volume. Чтобы проверить состояние модуля, выполните следующую команду:

d8 k get modules sds-local-volume -w

В результате будет выведена информация о модуле sds-local-volume:

NAME               WEIGHT   STATE     SOURCE     STAGE   STATUS
sds-local-volume   920      Enabled   Embedded           Ready

Чтобы проверить, что в пространстве имен d8-sds-local-volume и d8-sds-node-configurator все поды в состоянии Running или Completed и запущены на всех узлах, где планируется использовать ресурсы LVM, можно использовать команды:

d8 k -n d8-sds-local-volume get pod -w
d8 k -n d8-sds-node-configurator get pod -w

Преднастройка узлов

Создание групп томов LVM

Убедитесь, что на всех узлах, предназначенных для использования ресурсов LVM, запущены сервисные поды sds-local-volume-csi-node, обеспечивающие взаимодействие с узлами, содержащими компоненты LVM. Сделать это можно с помощью команды:

d8 k -n d8-sds-local-volume get pod -l app=sds-local-volume-csi-node -owide

Размещение данных подов по узлам определяется на основе специальных меток (nodeSelector), которые указываются в поле spec.settings.dataNodes.nodeSelector в настройках модуля.

Перед тем как приступить к настройке создания объектов StorageClass, необходимо объединить доступные на узлах блочные устройства в группы томов LVM. В дальнейшем группы томов будут использоваться для размещения ресурсов PersistentVolume.

Чтобы получить доступные блочные устройства, можно использовать ресурс BlockDevices который отражает их актуальное состояние:

d8 k get bd

В результате будет выведен список доступных блочных устройств:

NAME                                           NODE       CONSUMABLE   SIZE           PATH
dev-ef4fb06b63d2c05fb6ee83008b55e486aa1161aa   worker-0   false        976762584Ki    /dev/nvme1n1
dev-0cfc0d07f353598e329d34f3821bed992c1ffbcd   worker-0   false        894006140416   /dev/nvme0n1p6
dev-7e4df1ddf2a1b05a79f9481cdf56d29891a9f9d0   worker-1   false        976762584Ki    /dev/nvme1n1
dev-b103062f879a2349a9c5f054e0366594568de68d   worker-1   false        894006140416   /dev/nvme0n1p6
dev-53d904f18b912187ac82de29af06a34d9ae23199   worker-2   false        976762584Ki    /dev/nvme1n1
dev-6c5abbd549100834c6b1668c8f89fb97872ee2b1   worker-2   false        894006140416   /dev/nvme0n1p6

В примере выполнения команды выше в наличии имеется шесть блочных устройств, расположенных на трех узлах. Чтобы объединить блочные устройства на одном узле, необходимо создать группу томов LVM с помощью ресурса LVMVolumeGroup.

Для создания ресурса LVMVolumeGroup на узле worker-0 примените следующий ресурс, предварительно заменив имена узла и блочных устройств на свои:

d8 k apply -f - <<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: LVMVolumeGroup
metadata:
  name: "vg-on-worker-0"
spec:
  type: Local
  local:
    # Замените на имя своего узла, для которого создаете группу томов. 
    nodeName: "worker-0"
  blockDeviceSelector:
    matchExpressions:
      - key: kubernetes.io/metadata.name
        operator: In
        values:
          # Замените на имена своих блочных устройств узла, для которого создаете группу томов. 
          - dev-ef4fb06b63d2c05fb6ee83008b55e486aa1161aa
          - dev-0cfc0d07f353598e329d34f3821bed992c1ffbcd
  # Имя группы томов LVM, которая будет создана из указанных выше блочных устройств на выбранном узле.
  actualVGNameOnTheNode: "vg"
  # Раскомментируйте, если важно иметь возможность создавать thin-хранилища, детали будут раскрыты далее.
  # thinPools:
  #   - name: thin-pool-0
  #     size: 70% 
EOF

Дождитесь, когда созданный ресурс LVMVolumeGroup перейдет в состояние Ready. Чтобы проверить состояние ресурса, выполните следующую команду:

d8 k get lvg vg-on-worker-0 -w

В результате будет выведена информация о состоянии ресурса:

NAME             THINPOOLS   CONFIGURATION APPLIED   PHASE   NODE       SIZE       ALLOCATED SIZE   VG   AGE
vg-on-worker-0   1/1         True                    Ready   worker-0   360484Mi   30064Mi          vg   1h

Если ресурс перешел в состояние Ready, то это значит, что на узле worker-0 из блочных устройств /dev/nvme1n1 и /dev/nvme0n1p6 была создана группа томов LVM с именем vg.

Далее необходимо повторить создание ресурсов LVMVolumeGroup для оставшихся узлов (worker-1 и worker-2), изменив в примере выше имя ресурса LVMVolumeGroup, имя узла и имена блочных устройств, соответствующих узлу. Убедитесь, что группы томов LVM созданы на всех узлах, где планируется их использовать, выполнив следующую команду:

d8 k get lvg -w

В результате будет выведен список созданных групп томов:

NAME             THINPOOLS   CONFIGURATION APPLIED   PHASE   NODE       SIZE       ALLOCATED SIZE   VG   AGE
vg-on-worker-0   0/0         True                    Ready   worker-0   360484Mi   30064Mi          vg   1h
vg-on-worker-1   0/0         True                    Ready   worker-1   360484Mi   30064Mi          vg   1h
vg-on-worker-2   0/0         True                    Ready   worker-2   360484Mi   30064Mi          vg   1h

Создание StorageClass с типом thick

Создание объектов StorageClass осуществляется через ресурс LocalStorageClass, который определяет конфигурацию для желаемого класса хранения. Ручное создание ресурса StorageClass без LocalStorageClass может привести к ошибкам.

При создании LocalStorageClass важно выбрать тип хранения, который может иметь значение thick, либо thin.

Thick-пул обеспечивает высокую производительность, сопоставимую с производительностью накопителя, но не поддерживает создание снапшотов.

Пример создания ресурса LocalStorageClass с типом thick:

d8 k apply -f - <<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: LocalStorageClass
metadata:
  name: local-storage-class-thick
spec:
  lvm:
    lvmVolumeGroups:
      - name: vg-on-worker-0
      - name: vg-on-worker-1
      - name: vg-on-worker-2
    type: Thick
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer
EOF

Проверьте, что созданный LocalStorageClass перешёл в состояние Created, выполнив следующую команду:

d8 k get lsc local-storage-class -w

В результате будет выведена информация о созданном LocalStorageClass:

NAME                        PHASE     AGE
local-storage-class-thick   Created   1h

Убедитесь, что был создан соответствующий StorageClass, выполнив следующую команду:

d8 k get sc local-storage-class

В результате будет выведена информация о созданном StorageClass:

NAME                        PROVISIONER                      RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-storage-class-thick   local.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   1h

Создание StorageClass с типом thin

В отличие от thick-пула, thin-пул позволяет использовать снапшоты и overprovisioning (сверхвыделение ресурсов), но имеет меньшую производительность.

Overprovisioning следует использовать с осторожностью, контролируя доступное пространство в пуле. В системе мониторинга кластера предусмотрены события при снижении свободного места до 20%, 10%, 5% и 1%. Полное заполнение пула может привести к деградации работы модуля и риску потери данных.

Созданные ранее LVMVolumeGroup подходят для создания thick-хранилищ. Если вам важно иметь возможность создавать хранилища с типом thin, обновите конфигурацию ресурсов LVMVolumeGroup, добавив определение для thin-пула:

d8 k patch lvg vg-on-worker-0 --type='json' -p='[
  {
    "op": "add",
    "path": "/spec/thinPools",
    "value": [
      {
        "name": "thin-pool-0",
        "size": "70%"
      }
    ]
  }
]'

В обновленной версии LVMVolumeGroup 70% доступного пространства будет использовано для создания thin-хранилищ. Оставшиеся 30% могут быть использованы для thick-хранилищ.

Повторите добавление thin-пулов для оставшихся узлов (worker-1 и worker-2). Пример создания ресурса LocalStorageClass с типом thin:

d8 k apply -f - <<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: LocalStorageClass
metadata:
  name: local-storage-class-thin
spec:
  lvm:
    lvmVolumeGroups:
      - name: vg-on-worker-0
        thin:
          - name: thin-pool-0
      - name: vg-on-worker-1
        thin:
          - name: thin-pool-0
      - name: vg-on-worker-2
        thin:
          - name: thin-pool-0
    type: Thin
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer
EOF

Проверьте, что созданный LocalStorageClass перешёл в состояние Created, выполнив следующую команду:

d8 k get lsc local-storage-class -w

В результате будет выведена информация о созданном LocalStorageClass:

NAME                       PHASE     AGE
local-storage-class-thin   Created   1h

Убедитесь, что был создан соответствующий StorageClass, выполнив следующую команду:

d8 k get sc local-storage-class

В результате будет выведена информация о созданном StorageClass:

NAME                       PROVISIONER                      RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-storage-class-thin   local.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   1h