IncusでLINSTORをセットアップするには

LINSTORクラスターをセットアップしてIncusのストレージプロバイダーとして設定するにはこのガイドに従ってください。

このガイドでは、Ubuntu 24.04を動かしている3つのノード(server01, server02, server03)をセットアップします。このすべてでIncusのインスタンスを動かしLINSTORクラスターにストレージを提供します。ストレージ専用のノードを持ちネットワーク経由でストレージを利用するだけいった他の設定もサポートされています。ストレージの設定にかかわらず、すべてのIncusノードはノードにボリュームをマウントできるようにするためLINSTORサテライトサービスを動かすのがよいです。

また注目すべきは、ここではLINSTORストレージバックエンドとしてLVM Thinを使いますが、通常のLVMとZFSもサポートされています。

  1. 3つのマシン上で以下の手順を実行し、必須のLINSTORコンポーネントをインストールします:

    1. LINBIT PPAを追加します:

      sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
      sudo apt update
      
    2. 必須パッケージをインストールします:

      sudo apt install lvm2 drbd-dkms drbd-utils linstor-satellite
      
    3. マシンの起動時にLINSTORサテライトサービスが常に開始されるよう自動起動を有効にします:

      sudo systemctl enable --now linstor-satellite
      
  2. 最初のマシン(server01)上で以下の手順を実行し、LINSTORコントローラーをセットアップし、LINSTORクラスターを起動します:

    1. LINSTORコントローラーとクライアントパッケージをインストールします:

      sudo apt install linstor-controller linstor-client python3-setuptools
      
    2. マシンの起動時にLINSTORコントローラーサービスが常に開始されるよう自動起動を有効にします:

      sudo systemctl enable --now linstor-controller
      
    3. LINSTORクラスターにノードを追加します(<server_1><server_2><server_3>を対応するマシンのIPアドレスに置き換えて実行します)。この例ではserver01は(コントローラーとサテライトを)組み合わせたノードですが、他の2つはサテライトのみです。

      linstor node create server01 <server_1> --node-type combined
      linstor node create server02 <server_2> --node-type satellite
      linstor node create server03 <server_3> --node-type satellite
      
    4. すべてのノードがオンラインになり、ノード名がIncusクラスター内のノード名と一致していることを確認します:

      ~$ linstor node list
      ╭─────────────────────────────────────────────────────────────╮ Node     NodeType  Addresses                   State  ╞═════════════════════════════════════════════════════════════╡ server01 COMBINED  10.172.117.211:3366 (PLAIN) Online server02 SATELLITE 10.172.117.35:3366 (PLAIN)  Online server03 SATELLITE 10.172.117.232:3366 (PLAIN) Online ╰─────────────────────────────────────────────────────────────╯
    5. すべてのノードで必要な機能が使えるようになっていることを確認します。この例の場合、LVMThinDRBDですが、利用可能となっています:

      ~$ linstor node info
      ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ Node     Diskless LVM LVMThin ZFS/Thin File/Thin SPDK EXOS Remote SPDK Storage Spaces Storage Spaces/Thin ╞═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡ server01 +        +   +       +        +         -    -    +           -              -                   server02 +        +   +       +        +         -    -    +           -              -                   server03 +        +   +       +        +         -    -    +           -              -                   ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────╮ Node     DRBD LUKS NVMe Cache BCache WriteCache Storage ╞═══════════════════════════════════════════════════════════════════════╡ server01 +    -    -    +     -      +          +       server02 +    -    -    +     -      +          +       server03 +    -    -    +     -      +          +       ╰───────────────────────────────────────────────────────────────────────╯
    6. クラスターにストレージを寄与するそれぞれのサテライトノードでストレージプールを作成します。この例ではすべてのサテライトノードがストレージを寄与しますが、専用のストレージノードを用意するようなセットアップでは、それらのノードでだけストレージプールを作成します。vgcreatepvcreateを使って手動でLVMボリュームグループをセットアップしLINSTORにこれらのボリュームグループを使ってストレージプールをセットアップするようにさせることもできますが、linstor physical-storage create-device-poolはこのセットアップを手軽に自動化できます。またプールを構成する複数のデバイスを指定することもできますが、この例では各ノードにある単一の/dev/nvme1n1デバイスを持っているものとします:

      linstor physical-storage create-device-pool --storage-pool nvme_pool --pool-name nvme_pool lvmthin server01 /dev/nvme1n1
      linstor physical-storage create-device-pool --storage-pool nvme_pool --pool-name nvme_pool lvmthin server02 /dev/nvme1n1
      linstor physical-storage create-device-pool --storage-pool nvme_pool --pool-name nvme_pool lvmthin server03 /dev/nvme1n1
      
    7. すべてのストレージプールが作成され、サイズが期待どおりであることを確認します:

      ~$ linstor storage-pool list
      ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ StoragePool          Node     Driver   PoolName                    FreeCapacity TotalCapacity CanSnapshots State SharedName                    ╞════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡ DfltDisklessStorPool server01 DISKLESS                                                           False        Ok    server01;DfltDisklessStorPool DfltDisklessStorPool server02 DISKLESS                                                           False        Ok    server02;DfltDisklessStorPool DfltDisklessStorPool server03 DISKLESS                                                           False        Ok    server03;DfltDisklessStorPool nvme_pool            server01 LVM_THIN linstor_nvme_pool/nvme_pool     49.89 GiB      49.89 GiB True         Ok    server01;nvme_pool            nvme_pool            server02 LVM_THIN linstor_nvme_pool/nvme_pool     49.89 GiB      49.89 GiB True         Ok    server02;nvme_pool            nvme_pool            server03 LVM_THIN linstor_nvme_pool/nvme_pool     49.89 GiB      49.89 GiB True         Ok    server03;nvme_pool            ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
    8. IncusがLINSTORコントローラーと通信できるように設定します(<server_1>をコントローラーマシンのIPアドレスに置き換えます):

      incus config set storage.linstor.controller_connection=http://<server_1>:3370
      
    9. Incusにストレージプールを作成します。このIncusストレージプール上のボリュームにLINSTORがnvme_poolストレージプールを確実に使うようにlinstor.resource_group.storage_poolオプションを指定します。これは複数のLINSTORストレージプールがある場合に特に有効です(例:NVMEドライブに1つとSATA HDDに別の1つ):

      incus storage create remote linstor --target server01
      incus storage create remote linstor --target server02
      incus storage create remote linstor --target server03
      incus storage create remote linstor linstor.resource_group.storage_pool=nvme_pool
      
    10. LINSTORリソースグループがIncusにより作成されたことを確認します:

      ~$ linstor resource-group list
      ╭──────────────────────────────────────────────────────────────────────────────────────╮ ResourceGroup SelectFilter              VlmNrs Description                     ╞══════════════════════════════════════════════════════════════════════════════════════╡ DfltRscGrp    PlaceCount: 2                                                      ╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡ remote        PlaceCount: 2                     Resource group managed by Incus                StoragePool(s): nvme_pool                                          ╰──────────────────────────────────────────────────────────────────────────────────────╯
    11. ストレージをテストするため、いくつかボリュームとインスタンスを作成します:

      incus launch images:debian/12 c1 --storage remote
      incus storage volume create remote fsvol
      incus storage volume attach remote fsvol c1 /mnt
      
      incus launch images:debian/12 v1 --storage remote --vm -c migration.stateful=true
      incus storage volume create remote vol --type block size=42GiB
      incus storage volume attach remote vol v1
      
    12. Incusで作成されたリソースがLINSTORでどのように見えているかを確認します:

      ~$ linstor resource-definition list --show-props Aux/Incus/name Aux/Incus/type Aux/Incus/content-type
      ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ ResourceName                                  Port ResourceGroup Layers       State Aux/Incus/name                                                                Aux/Incus/type   Aux/Incus/content-type ╞═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡ incus-volume-1cb987892f6748299a7f894a483e4e7e 7004 remote        DRBD,STORAGE ok    incus-volume-v1                                                               virtual-machines block                  incus-volume-5b680bf0dd6f4b39b784c1c151dd510c 7002 remote        DRBD,STORAGE ok    incus-volume-default_fsvol                                                    custom           filesystem             incus-volume-5d7ee1b9c5224f73b3dd3c3a4ff46fed 7000 remote        DRBD,STORAGE ok    incus-volume-198e0b3f6b3685418d9c21b58445686f939596b1fccd8e295191fe515d1ab32c images           filesystem             incus-volume-9f7ed7091da346e2b7c764348ffada54 7001 remote        DRBD,STORAGE ok    incus-volume-c1                                                               containers       filesystem             incus-volume-10991980d449418b9b8714b769f030d7 7005 remote        DRBD,STORAGE ok    incus-volume-default_vol                                                      custom           block                  incus-volume-af0e3529ad514b7b89c7a3a9b8b718ff 7003 remote        DRBD,STORAGE ok    incus-volume-dfc28af5f731668509b897ce7eb30d07c5bfe50502da4b2f19421a8a0b05137a images           block                  ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯