После добавления worker-узлов необходимо настроить хранилище, которое будет использоваться для создания дисков виртуальных машин и для хранения метрик компонентов кластера. Хранилище можно выбрать из списка поддерживаемых.

Далее рассматривается использование программно-определяемого реплицируемого блочного хранилища на базе DRBD, которое позволяет создавать реплицируемые тома на основе дискового пространства узлов. Для примера настроим StorageClass на основе томов с двумя репликами, которые располагаются на дисках /dev/sda.

Для выполнения приведенных ниже команд необходима установленная утилита d8 (Deckhouse CLI) и настроенный контекст kubectl для доступа к кластеру. Также, можно подключиться к master-узлу по SSH и выполнить команду от пользователя root с помощью sudo -i.

Включение возможности использования реплицируемого хранилища

Включите модули sds-node-configurator, snapshot-controller и sds-replicated-volume при помощи веб-интерфейса администратора или через CLI:

  1. Включите модуль sds-node-configurator:

    sudo -i d8 s module enable sds-node-configurator
    
  2. Дождитесь, пока модуль sds-node-configurator перейдёт в состояние Ready:

    d8 k get module sds-node-configurator -w
    
  3. Включите модуль snapshot-controller:

    sudo -i d8 s module enable snapshot-controller
    
  4. Включите модуль sds-replicated-volume:

    sudo -i d8 s module enable sds-replicated-volume
    
  5. Дождитесь пока модуль sds-replicated-volume перейдёт в состояние Ready:

    sudo -i d8 k wait module sds-replicated-volume --for='jsonpath={.status.status}=Ready' --timeout=1200s
    
  6. Убедитесь, что в пространствах имен d8-sds-node-configurator, d8-snapshot-controller и d8-sds-replicated-volume все поды находятся в статусе Running или Completed:

    sudo -i d8 k -n d8-sds-node-configurator get pod -owide -w
    sudo -i d8 k -n d8-sds-snapshot-controller get pod -owide -w
    sudo -i d8 k -n d8-sds-replicated-volume get pod -owide -w
    

Настройка реплицируемого хранилища

Настройка хранилища включает в себя объединение доступных блочных устройств на узлах в пулы, из которых затем будет создан StorageClass.

  1. Получите доступные блочные устройства:

    d8 k get blockdevices.storage.deckhouse.io
    

Пример вывода с дополнительными дисками sda…

   NAME                                           NODE           CONSUMABLE   SIZE          PATH        AGE
   dev-93640bc74158c6e491a2f257b5e0177309588db0   master-0       false        468851544Ki   /dev/sda    8m28s
   dev-40bf7a561aee502f20b81cf1eff873a0455a95cb   dvp-worker-1   false        468851544Ki   /dev/sda    8m17s
   dev-b1c720a7cec32ae4361de78b71f08da1965b1d0c   dvp-worker-2   false        468851544Ki   /dev/sda    8m12s
  1. Создайте VolumeGroup на каждом узле.

    На каждом узле необходимо создать группу томов LVM с помощью ресурса LVMVolumeGroup.

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

    export NODE_NAME="<NODE_NAME>"
    export DEV_NAME="<BLOCK_DEVICE_NAME>"
    d8 k apply -f - <<EOF
    apiVersion: storage.deckhouse.io/v1alpha1
    kind: LVMVolumeGroup
    metadata:
      name: "vg-on-${NODE_NAME}"
    spec:
      type: Local
      local:
        nodeName: "$NODE_NAME"
      blockDeviceSelector:
        matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values:
              - "$DEV_NAME"
      # Имя группы томов LVM, которая будет создана из указанных выше блочных устройств на выбранном узле.
      actualVGNameOnTheNode: "vg-1"
    EOF
    

    Дождитесь, что все созданные ресурсы LVMVolumeGroup перейдут в состояние Ready:

    d8 k get lvg -w
    

Пример вывода…

   NAME                THINPOOLS  CONFIGURATION APPLIED   PHASE   NODE          SIZE       ALLOCATED SIZE VG   AGE
   vg-on-master-0      0/0        True                    Ready   master-0      360484Mi   30064Mi        vg-1 29s
   vg-on-dvp-worker-1  0/0        True                    Ready   dvp-worker-1  360484Mi   30064Mi        vg-1 58s
   vg-on-dvp-worker-2  0/0        True                    Ready   dvp-worker-2  360484Mi   30064Mi        vg-1 6s
  1. Создайте пул из групп томов LVM.

    Созданные группы томов нужно собрать в пул для репликации (задаётся в ресурсе ReplicatedStoragePool). Для этого выполните следующую команду (укажите имена созданных групп томов):

    d8 k apply -f - <<EOF
    apiVersion: storage.deckhouse.io/v1alpha1
    kind: ReplicatedStoragePool
    metadata:
      name: sds-pool
    spec:
      type: LVM
      lvmVolumeGroups:
        # Укажите свои имена групп томов.
        - name: vg-on-dvp-worker-01
        - name: vg-on-dvp-worker-02
        - name: vg-on-master
    EOF
    

    Дождитесь, когда ресурс перейдет в состояние Completed:

    d8 k get rsp data -w
    

Пример вывода…

   NAME         PHASE       TYPE   AGE
   sds-pool     Completed   LVM    32s
  1. Задайте параметры StorageClass.

    Модуль sds-replicated-volume использует ресурсы ReplicatedStorageClass для автоматического создания StorageClass с нужными характеристиками. В этом ресурсе важны следующие параметры:

    • replication — параметры репликации, для 2 реплик будет использоваться значение Availability;
    • storagePool — имя созданного ранее пула, в данном примере указывается sds-pool.

    Остальные параметры описаны в документации ресурса ReplicatedStorageClass.

    d8 k apply -f - <<EOF
    apiVersion: storage.deckhouse.io/v1alpha1
    kind: ReplicatedStorageClass
    metadata:
      name: sds-r2
    spec:
      replication: Availability
      storagePool: sds-pool
      reclaimPolicy: Delete
      topology: Ignored
    EOF
    

    Проверьте, что в кластере появился соответствующий StorageClass:

    d8 k get sc
    

Пример вывода…

   NAME     PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
   sds-r2   replicated.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   6s
  1. Установите StorageClass по умолчанию (укажите имя своего объекта StorageClass):

    DEFAULT_STORAGE_CLASS=<DEFAULT_STORAGE_CLASS_NAME>
    d8 k patch mc global --type='json' -p='[{"op": "replace", "path": "/spec/settings/defaultClusterStorageClass", "value": "'"$DEFAULT_STORAGE_CLASS"'"}]'