🐱

MicroCloudを構築してみる(実運用編)

に公開

下記お試しから、再度実運用に向けて再構築した内容のまとめになります。
https://zenn.dev/playree/articles/a24522140e4364
「MicroCloudとは」「必要なハードウェア」などはお試し編の記事を参照ください。

構築する内容

  • PCは4台構成
    汎用スペックPCを3台、高スペックPCを1台、用途によって使い分ける想定。
    PC1台に2つのNIC(LANポート)が必要。
    まずは3台で初期構築し、1台はその後に追加してみます。(追加操作をやってみたいので、後から追加していますが、もちろん最初から4台で初期構築してOKです。
  • ローカルストレージと分散ストレージの両方を用意
    2.5Gbpsのネットワークでは分散ストレージは300MB/s程しか出ないことが分かったので、ローカルストレージも用意することにしました。
    ディスクI/Oを必要とするものはローカルストレージ、ディスクI/Oをあまり必要としなく高可用性を求めるものは分散ストレージ、というように使い分ける想定。
  • WebUIにLet's Encryptで発行したSSL証明書を導入
    せっかくなので警告が出ないようにしておきたい。
  • MicroCloudで作成するインスタンスにノードと同じサブネットのIPを払い出せるようにする
    作成したインスタンスに他のPCからSSHやリモートアクセスをしたいので。
  • MicroCloudには内部ネットワークか、VPN経由でのみアクセス可能にする。
    基本的に外部からはアクセスできないようにしておきます。

構成図

構成としては下記を予定。

ハードウェア(PC)の準備

お試し編で利用したミニPCを利用するのですが1つ問題が。
今回は分散ストレージに加えてローカルストレージも用意しようとしているので、
PC1台に対して、

  • OS用
  • 分散ストレージ用
  • ローカルストレージ用

の計3つのSSDが必要になるのですが、ミニPCなのでSSDのスロットが2つしかありませんでした。
そこで思いついたのが、分散ストレージは結局300MB/s程しか速度が出ないので(ネットワークがボトルネックになって)、USBで外付けでも良いのではないかと。
USB3.2のGen1が5Gbpsなので、お手頃なUSB3.2の外付けSSDのケースとSSDを用意しました。
USB4までいくとお高いのですが、USB3.2の外付けケースなら二千円ほどで用意できました。

それと、PC4台となるとルーターやスイッチングハブに8ポート以上の空きが必要となります。
自分は5ポートと8ポートの2台のハブを用意しました。
2台用意したのは、クラスター間のデータ同期の為の通信はかなり帯域を圧迫する可能性があるので、物理的に分けたかった為です。

PCセットアップ

基本的にお試し編と同じ流れになりますが、ローカルストレージの設定などが途中で加わります。

注意点

セットアップの際の注意点は下記。

  • ローカル/分散ストレージ用のSSDはフォーマットしてパーティションなしの状態にする
    パーティションが存在すると、MicroCloudの初期設定で対象として認識されません。
    OSインストール時にフォーマットしておくのがお勧めです。
  • NICは、内部ネットワーク用を固定IP、仮想ネットワーク用をIP未割り当て状態にする
    MicroCloudはDHCPに対応していないのと、IP未割り当て状態にしないとこれもMicroCloudの初期設定で対象として認識されない為です。
    IP未割り当ての設定もあるので、OSインストール後にNetplanで設定します。
  • ルーターのDHCPで利用しない帯域を用意しておく
    内部ネットワーク用の固定IPや、仮想ネットワーク用にIP帯域を割り当てるので、その分をDHCPで利用されないようにしておく必要があります。

※今後の記載は、
172.16.10.1/24をデフォルトゲートウェイとするネットワークで、172.16.10.100以降をMicroCloud用に利用できる想定で記載していきます。

OSインストール

自分はUbuntu Server 24.04.3 LTSminimizedでインストールしました。

  • ネットワーク設定は一旦DHCP
    もちろんここで固定IPを割り振ってもいいです。
  • SSDは3つともフォーマットして片方にインストール
    ローカル/分散ストレージ用にフォーマットしたままのSSDを残しておきます。

※今後の記載は、
PC名をnode1,node2,node3とした想定で記載していきます。

OSインストールが完了したらとりあえずアップデートしておきます。

$ sudo apt update
$ sudo apt upgrade

自分は基本的にVimを使うのでインストール。

$ sudo apt install vim

ネットワーク設定

NICは、内部ネットワーク用を固定IP、仮想ネットワーク用をIP未割り当て状態にする

この設定を行います。
今回はさらに内部ネットワーク用にブリッジも作成します。(インスタンスに払い出すIPをノードと同じサブネットにするため)

デフォルトで50-cloud-init.yamlが存在するはずなので、60-mc-config.yamlとして設定します。(ファイル名は50以降であればなんでも良いです。

固定IPは下記を割り振ります。

  • node1:172.16.10.101
  • node2:172.16.10.102
  • node3:172.16.10.103

まずはNICのデバイス名を確認します。

$ ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
enp1s0           UP             172.16.10.2/24 metric xxx
eno1             UP             172.16.10.3/24 metric xxx
wlp3s0           DOWN

enp1s0eno1が今回の対象です。(名前はPCによって異なります。
OSインストール時はDHCPにしていたので、現状は自動でIPが割り当てられています。

では、Netplanの設定をします。

$ sudo vim /etc/netplan/60-mc-config.yaml
60-mc-config.yaml
network:
  version: 2
  ethernets:
    enp1s0:
      dhcp4: false
      dhcp6: false
    eno1:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
  bridges:
    br0:
      interfaces: [enp1s0]
      dhcp4: false
      addresses: [172.16.10.101/24]
      routes:
        - to: default
          via: 172.16.10.1
      nameservers:
        addresses: [172.16.10.1]
      parameters:
        stp: false
      dhcp6: false

enp1s0を固定IPのブリッジ(br0)に、eno1をIP未割り当て(仮想ネットワーク用)にする設定です。

権限を変更し、適用します。

$ sudo chmod 600 /etc/netplan/60-mc-config.yaml
$ sudo netplan apply

変更を確認します。

$ ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
enp1s0           UP
eno1             UP
br0              UP             172.16.10.101/24 xxx
wlp3s0           DOWN

これを固定IPを変えてPC3台で実施します。

MicroCloudのセットアップ

PCの準備が出来たらMicroCloudをセットアップします。
インストールやその後の管理はSnapを利用します。

各種パッケージのインストール

公式手順通りにインストールします。

$ sudo snap install lxd --cohort="+"
$ sudo snap install microceph --cohort="+"
$ sudo snap install microovn --cohort="+"
$ sudo snap install microcloud --cohort="+"

自動アップデートを停止しておきたい場合は下記も実行します。

$ sudo snap refresh --hold lxd microceph microovn microcloud

3台のPCでそれぞれ実施します。

MicroCloudの初期化

MicroCloudの初期化を行っていきます。
ここからはnode1~3それぞれのターミナルを開いておきます。
(途中でターミナルを閉じないでください。

まずはnode1で下記initコマンドを実行します。

$ sudo microcloud init
Waiting for services to start ...
Do you want to set up more than one cluster member? (yes/no) [default=yes]:

クラスタ構成にするのでyesを選択。

 Using address 172.16.10.101 for MicroCloud
Use the following command on systems that you want to join the cluster:

 microcloud join

When requested, enter the passphrase:

 aaaa bbbb cccc dddd

Verify the fingerprint 3f93b9bf1b30 is displayed on joining systems.
Systems will appear in the table as they are detected. Select those that should join the cluster:
 Filter | <type to filter rows>
   ┌──────┬─────────┬─────────────┐
   │ NAME │ ADDRESS │ FINGERPRINT │
   ├──────┼─────────┼─────────────┤
   └──────┴─────────┴─────────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

そうするとこのようにパスフレーズが表示され、node2,node3からのjoin待ち状態になります。
このターミナルは開いたままにしておき、node2,node3で作業します。

他のノードをJOIN

node2,node3でそれぞれ下記joinを実行します。

$ sudo microcloud join
Waiting for services to start ...
 Using address 172.16.10.102 for MicroCloud
Verify the fingerprint 7ad4c8e0c792 is displayed on the other system.
Specify the passphrase for joining the system:

パスフレーズを入力しろと出るので、node1に表示されているパスフレーズを入力します。

Searching for an eligible system ...

 Found system node1 at 172.16.10.101 using fingerprint 3f93b9bf1b30

Select node2 on node1 to let it join the cluster

こんな感じに進みます。
node2,node3でそれぞれ実施したら、次はnode1での作業に戻ります。
それぞれのターミナルは開いたままにしておいてください。

MicroCloudの初期化の続き

残りの設定はnode1で行います。
node2,node3でjoinを実行すると、node1の画面には下記のようにnode2,node3が表示されているはずです。

Systems will appear in the table as they are detected. Select those that should join the cluster:
 Filter | <type to filter rows>
   ┌───────┬───────────────┬──────────────┐
   │ NAME  │    ADDRESS    │ FINGERPRINT  │
   ├───────┼───────────────┼──────────────┤
 > │ node2 │ 172.16.10.102 │ 7ad4c8e0c792 │
   │ node3 │ 172.16.10.103 │ 1d7470d0e14a │
   └───────┴───────────────┴──────────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

node2,node3を選択してEnter。

 Selected node1 at 172.16.10.101
 Selected node2 at 172.16.10.102
 Selected node3 at 172.16.10.103

Gathering system information ...
Would you like to set up local storage? (yes/no) [default=yes]:

これで3ノードが選択され、各種設定に進みます。
まずはローカルストレージを設定するか?と聞かれるので、yesを選択。

Select exactly one disk from each cluster member:
 Filter | <type to filter rows>
   ┌──────────┬──────────────────────┬───────────┬──────┬───────────────────────────────────────────────────────────┐
   │ LOCATION │        MODEL         │ CAPACITY  │ TYPE │                           PATH                            │
   ├──────────┼──────────────────────┼───────────┼──────┼───────────────────────────────────────────────────────────┤
 > │  node1   │ Predator SSD GM7 1TB │ 953.87GiB │ nvme │ /dev/disk/by-id/nvme-eui.303031303035313050c68e0850534148 │
   │  node1   │    RTL9210CN NVME    │ 953.87GiB │ scsi │          /dev/disk/by-id/wwn-0x32030301a4e40739           │
   │  node2   │ Predator SSD GM7 1TB │ 953.87GiB │ nvme │ /dev/disk/by-id/nvme-eui.303031303035303550c68e0850534148 │
   │  node2   │    RTL9210CN NVME    │ 953.87GiB │ scsi │          /dev/disk/by-id/wwn-0x32030301a25e1b48           │
   │  node3   │ Predator SSD GM7 1TB │ 953.87GiB │ nvme │ /dev/disk/by-id/nvme-eui.303031303035383450c68e0850534148 │
   │  node3   │    RTL9210CN NVME    │ 953.87GiB │ scsi │          /dev/disk/by-id/wwn-0x32030301afaf0e2c           │
   └──────────┴──────────────────────┴───────────┴──────┴───────────────────────────────────────────────────────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

3ノードで利用可能なSSDが表示されるので、3x2=6台のSSDが表示されます。
ここではローカルストレージで利用するSSDを選択するので、各ノードの外付けではないSSDを選択します。

Select which disks to wipe:
 Filter | <type to filter rows>
   ┌──────────┬──────────────────────┬───────────┬──────┬───────────────────────────────────────────────────────────┐
   │ LOCATION │        MODEL         │ CAPACITY  │ TYPE │                           PATH                            │
   ├──────────┼──────────────────────┼───────────┼──────┼───────────────────────────────────────────────────────────┤
 > │  node1   │ Predator SSD GM7 1TB │ 953.87GiB │ nvme │ /dev/disk/by-id/nvme-eui.303031303035313050c68e0850534148 │
   │  node2   │ Predator SSD GM7 1TB │ 953.87GiB │ nvme │ /dev/disk/by-id/nvme-eui.303031303035303550c68e0850534148 │
   │  node3   │ Predator SSD GM7 1TB │ 953.87GiB │ nvme │ /dev/disk/by-id/nvme-eui.303031303035383450c68e0850534148 │
   └──────────┴──────────────────────┴───────────┴──────┴───────────────────────────────────────────────────────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

選択したSSDのデータは全て削除して良いので、全て選択してEnter。

Would you like to set up distributed storage? (yes/no) [default=yes]:

次は分散ストレージの設定なのでyesを選択。

Select from the available unpartitioned disks:
 Filter | <type to filter rows>
   ┌──────────┬────────────────┬───────────┬──────┬────────────────────────────────────────┐
   │ LOCATION │     MODEL      │ CAPACITY  │ TYPE │                  PATH                  │
   ├──────────┼────────────────┼───────────┼──────┼────────────────────────────────────────┤
 > │  node1   │ RTL9210CN NVME │ 953.87GiB │ scsi │ /dev/disk/by-id/wwn-0x32030301a4e40739 │
   │  node2   │ RTL9210CN NVME │ 953.87GiB │ scsi │ /dev/disk/by-id/wwn-0x32030301a25e1b48 │
   │  node3   │ RTL9210CN NVME │ 953.87GiB │ scsi │ /dev/disk/by-id/wwn-0x32030301afaf0e2c │
   └──────────┴────────────────┴───────────┴──────┴────────────────────────────────────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

利用できるSSDの一覧が表示されるので残りは全部分散ストレージ用なので、全部選択しEnter。

Select which disks to wipe:

再度同じ画面が表示されますが、今度は消去して良いか?の確認なので、再度全部を選択してEnter。

Do you want to encrypt the selected disks? (yes/no) [default=no]:

暗号化は必要ないのでnoを選択。

Would you like to set up CephFS remote storage? (yes/no) [default=yes]:

CephFSも特に利用しないのでnoを選択。

What subnet (IPv4/IPv6 CIDR) would you like your Ceph internal traffic on? [default=172.16.10.0/24]:

Cephのトラフィック用のsubnetの指定ですが、内部ネットワークと同じで良いのでデフォルトを選択。

What subnet (either IPv4 or IPv6 CIDR notation) would you like your Ceph public traffic on? [default=172.16.123.0/24]:

Cephのパブリックトラフィック用のsubnetの指定ですが、これも内部ネットワークと同じで良いのでデフォルトを選択。

Configure distributed networking? (yes/no) [default=yes]:

分散ネットワークの設定なのでyesを選択。

Select an available interface per system to provide external connectivity for distributed network(s):
 Filter | <type to filter rows>
   ┌──────────┬────────┬──────────┐
   │ LOCATION │ IFACE  │   TYPE   │
   ├──────────┼────────┼──────────┤
 > │  node1   │ enp1s0 │ physical │
   │  node1   │  eno1  │ physical │
   │  node1   │  br0   │  bridge  │
   │  node2   │ enp1s0 │ physical │
   │  node2   │  eno1  │ physical │
   │  node2   │  br0   │  bridge  │
   │  node3   │ enp1s0 │ physical │
   │  node3   │  eno1  │ physical │
   │  node3   │  br0   │  bridge  │
   └──────────┴────────┴──────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

利用可能なNICの一覧が表示されるので、各ノードのeno1(仮想ネットワーク用)を選択してEnter。

 Using eno1 on node1 for OVN uplink
 Using eno1 on node2 for OVN uplink
 Using eno1 on node3 for OVN uplink

Specify the IPv4 gateway (CIDR) on the uplink network:

アップリンクのゲートウェイの指定(CIDR表記)なので、172.16.10.1/24
これは環境によって変わります。
基本的にはルーターのIPアドレスになるかと思います。

Specify the first IPv4 address in the range to use on the uplink network:

LXDで利用するIPの範囲(最初)なので、172.16.10.110

Specify the last IPv4 address in the range to use on the uplink network:

LXDで利用するIPの範囲(最後)なので、172.16.10.129
つまりこの場合、172.16.10.110172.16.10.129の20個IP範囲を割り当てています。
インスタンスの外部通信用に一時的に使用できるIPアドレスのプールなので、ノード数+バッファ分があれば良いらしい。

Specify the IPv6 gateway (CIDR) on the uplink network:

IPv6は利用しないので、何も入力せずにEnter。

Specify the DNS addresses (comma-separated IPv4 / IPv6 addresses) for the distributed network [default=172.16.10.1]:

分散ネットワークのDNSアドレスなので、デフォルトを選択。

Configure dedicated OVN underlay networking? (yes/no) [default=no]:

アンダーレイネットワークの設定は不要なのでnoを選択。

ここまでで初期設定の入力は完了です。

Initializing new services ...
 Local MicroCloud is ready
 Local MicroOVN is ready
 Local MicroCeph is ready
 Local LXD is ready
Awaiting cluster formation ...
 Peer node2 has joined the cluster
 Peer node3 has joined the cluster
Configuring cluster-wide devices ...
MicroCloud is ready

初期化が進み、readyになれば完了です。
node2,node3のほうも下記のような表示になって、設定が完了しているはず。

Complete the remaining configuration on node1 ...
Successfully joined the MicroCloud cluster and closing the session.
Commencing cluster join of the remaining services (LXD,MicroCeph,MicroOVN)

MicroCloudのステータス確認

初期化が完了したらMicroCloudのステータスを確認しておきます。

$ sudo microcloud status

 Status: HEALTHY

┌───────┬───────────────┬──────┬─────────────────┬────────────────────────┬────────┐
│ Name  │    Address    │ OSDs │ MicroCeph Units │     MicroOVN Units     │ Status │
├───────┼───────────────┼──────┼─────────────────┼────────────────────────┼────────┤
│ node1 │ 172.16.10.101 │  1   │   mds,mgr,mon   │ central,chassis,switch │ ONLINE │
│ node2 │ 172.16.10.102 │  1   │   mds,mgr,mon   │ central,chassis,switch │ ONLINE │
│ node3 │ 172.16.10.103 │  1   │   mds,mgr,mon   │ central,chassis,switch │ ONLINE │
└───────┴───────────────┴──────┴─────────────────┴────────────────────────┴────────┘

HEALTHYになっていればOKです。

初期設定としてはこれで完了です!

ノードを追加する

最小構成である3台構成での構築が完了したので、ここにノードを追加してみます。
といってもやることは初期構築とあまり変わりません。
node9として追加してみます。(node4としなかったのは、スペックが違うので分けたかっただけ。

追加ノードのPCセットアップ

まずは追加するノードのPCを「各種パッケージのインストール」まで実施します。

既存ノードでADD

node1~3のどれかで、addを実行します。

$ sudo microcloud add
Waiting for services to start ...
Use the following command on systems that you want to join the cluster:

 microcloud join

When requested, enter the passphrase:

 aaaa bbbb cccc dddd

Verify the fingerprint f20dfb51a211 is displayed on joining systems.
Systems will appear in the table as they are detected. Select those that should join the cluster:
 Filter | <type to filter rows>
   ┌──────┬─────────┬─────────────┐
   │ NAME │ ADDRESS │ FINGERPRINT │
   ├──────┼─────────┼─────────────┤
   └──────┴─────────┴─────────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

追加するノードでJOIN

追加するノードでjoinを実行し、パスフレーズを入力します。

$ sudo microcloud join
Waiting for services to start ...
 Using address 172.16.123.33 for MicroCloud
Verify the fingerprint a52562d916cb is displayed on the other system.
Specify the passphrase for joining the system:

既存ノードで承認

あとは既存ノードで追加するノードを選択します。

Systems will appear in the table as they are detected. Select those that should join the cluster:
 Filter | <type to filter rows>
   ┌───────┬───────────────┬──────────────┐
   │ NAME  │    ADDRESS    │ FINGERPRINT  │
   ├───────┼───────────────┼──────────────┤
 > │ node9 │ 172.16.10.109 │ 5f41a93aee60 │
   └───────┴───────────────┴──────────────┘
 space to select; enter to confirm
 ↑/↓ to move; → to select all; ← to select none

これだけです。

$ sudo microcloud status

 Status: HEALTHY

┌───────┬───────────────┬──────┬─────────────────┬────────────────────────┬────────┐
│ Name  │    Address    │ OSDs │ MicroCeph Units │     MicroOVN Units     │ Status │
├───────┼───────────────┼──────┼─────────────────┼────────────────────────┼────────┤
│ node1 │ 172.16.10.101 │  1   │   mds,mgr,mon   │ central,chassis,switch │ ONLINE │
│ node2 │ 172.16.10.102 │  1   │   mds,mgr,mon   │ central,chassis,switch │ ONLINE │
│ node3 │ 172.16.10.103 │  1   │   mds,mgr,mon   │ central,chassis,switch │ ONLINE │
│ node9 │ 172.16.10.109 │  1   │        -        │     chassis,switch     │ ONLINE │
└───────┴───────────────┴──────┴─────────────────┴────────────────────────┴────────┘

この通り、node9が追加されています。

WebUIの利用、インスタンス作成

WebUIの利用、インスタンス作成手順は下記参照。

https://zenn.dev/playree/articles/a24522140e4364#microcloudの稼働確認

LXD WebUIにSSL証明書を導入

WebUIはHTTPSで提供されますが、デフォルトだと自己証明書となっています。
警告が表示されるのはやはり邪魔なので、正規のSSL証明書を設定します。

クライアント認証やHTTPSで提供されていることから、
Nginx(SSL証明書) → WebUI
というような構成にはできないので、WebUIにSSL証明書を設定します。
SSL証明書を更新する為のコマンドが用意されているのでそれを使います。

まずはcertbotなどでSSL証明書を取得します。
https://zenn.dev/playree/articles/94a4c90419ae26

取得したSSL証明書を指定して下記update-certificateコマンドで更新します。

lxc cluster update-certificate fullchain.pem privkey.pem

SSL証明書自体はcertbotが自動で更新してくれるので、Cronで1日1回ファイルの更新を確認して、更新があればupdate-certificateコマンドを実行するようなシェルなどを用意すると良いかと思います。

各種プロファイル

良く利用する設定はプロファイルとして用意しておきます。

ブリッジ(br0)を利用するプロファイル

ノードと同じサブネットのIPを払い出すために用意したブリッジ(br0)を利用する為の設定です。
おそらくUIでは設定できないので、YAML ConfigurationをONにしてYAMLとして設定します。

name: br0
description: Network br0
devices:
  eth0:
    nictype: bridged
    parent: br0
    type: nic

SSH接続可能なデフォルトユーザーを設定するプロファイル

インスタンス作成時に、SSH接続可能なユーザーを作成してしまう設定です。
作成と同時にSSH接続可能になるので便利です。

  • sshuserの部分がユーザー名なので、ここは好きに変更
  • shellの行はデフォルトをbashにする設定
  • sudoの行はsudoでパスワードを要求しない設定にする設定
  • ssh_authorized_keysでSSH公開鍵を設定

cloud-configの仕組みを利用して設定します。

name: sshuser
description: Add User sshuser
config:
  cloud-init.vendor-data: |
    #cloud-config
    users:
      - name: sshuser
        shell: /bin/bash
        sudo: "ALL=(ALL) NOPASSWD:ALL"
        ssh_authorized_keys:
          - ssh-ed25519 xxxx

ssh-ed25519 xxxxはSSH公開鍵を指定

スペック定義のプロファイル

インスタンスのスペックをあらかじめプロファイルとして定義しておくと便利です。
例えば、

name: small
description: CPU2 / RAM2GB / SSD20GB(local)
devices:
  root:
    path: /
    pool: local
    size: 20GiB
    type: disk
config:
  limits.cpu: '2'
  limits.memory: 2GiB

Discussion