Ubuntu日和

【第82回】無限増殖するミニPCの活用方法!MicroCloudでご家庭クラウドを構築してみたぞ

今こそ立ち上がれ、ご家庭クラスタ!

 ここ数年、ミニPCが大流行中だ。本サイトでも、セールの情報が毎日のように掲載されている。筆者は仕事柄、複数の検証機を動かす必要があるのだが、小さくて場所を取らず、価格的にも手を出しやすいミニPCは重宝している。そんなわけで気がつけば、自宅にあるのはミニPCばかりになってしまった。こうしたお手頃なデバイスが「気づけば増えている」現象は、本サイトの読者であれば理解していただけると思う。

 ところが時間が経つにつれ、少し古いデバイスは使われなくなってしまうのもまた世の常である。みなさんのご家庭にも、最近電源が入っていないミニPCが転がっていて、ちょっとした後ろめたさを感じていたりしないだろうか。

 ミニPCの特徴といえば、その小ささの割に、普段使いや検証用途には必要十分な性能を備えている点だ。特に、多くのモデルで有線LANのポートを2つ備えていることは見逃せない。そこで今回は、こうしたミニPCのご家庭での有効な活用方法を考えてみようと思う。

 実は最近、Ubuntuの開発を支援するCanonicalから、非常に手軽にデプロイできる軽量クラウドプラットフォームが登場した。それがMicroCloudだ。簡単にいってしまえば、複数のマシンでクラスタを組み、仮想マシンやコンテナを動かす基盤を簡単に作れるソリューションだ。小さくて、省電力で、そこそこの性能があり、数も揃えられるミニPCで遊ぶには、ちょうどいいお題ではないだろうか。

 というわけで今回は3台のミニPCを使って、最小構成のMicroCloudをご家庭内に構築してみたぞ。これなら、ミニPCをメンテナンスしたい時、たとえばOSのアップデートでホストの再起動が必要になった際も、仮想マシンを別のノードに移動して動かし続けられ、継続運用性を高められる。もちろんミニPCの物理的な入れ替えにも対応できる。

 一方、今回の解説で構築されるおうちクラウドは、フェイルオーバーに対応できない。誌面の都合で省くが、本気でフェイルオーバーを考慮するなら、ミニPCを4台以上用意し、ストレージをCephで構築するほうが現実的だ。

用意するもの

 まずはPCを3台用意しよう。本記事内では用意した3台を、便宜上1号機(mc1)、2号機(mc2)、3号機(mc3)と呼称する。ハードウェアの条件としては、有線LANのネットワーク(NIC)とSSDを、2つずつ搭載していることだ。

 NICが2つ必要なのは、MicroCloudの内部ネットワークと、仮想ネットワークをアップリンクに接続するネットワークの2つを分ける必要があるためだ。この仕様から、まさにミニPCがうってつけである。もしもNICが1つしかない古いPCを再利用するような場合は、USBのアダプタを足してもOKだ。とにかくNICが2つあればよい。両ポートとも、ケーブルは同じLANに繋いでおこう。3台×2ポートなので、最低でも8ポート以上のスイッチがあると、ケーブルの取り回しが楽になるだろう。

 SSDが2つ必要なのは、ベースOSとなるUbuntuのインストール先と、MicroCloudが使うストレージプールを構成する用途だ。なおパーティション分割ではだめで、物理的に2つのSSDを搭載する必要がある。M.2にくわえて2.5インチのSATA SSDが載せられるミニPCも多いので、それで対応するといいだろう。適当なSATA SSDは各自、机の引き出しや押し入れの在庫箱から発掘してほしい。もちろんUSB SSDでも代用できる。

 ちなみに一般的なクラスタでは、構成する全ノードのCPUを揃えるのがお約束となっている。ライブマイグレーションの互換性や、リソース配分計画の都合などがその理由だ。

 だがMicroCloudは、CPUが異なるノードの混在を公式にサポートしている。これはMicroCloudが、完全な互換性よりもハードウェア構成の柔軟性を重視しているためだ。こうした「制約のゆるさ」も、MicroCloudがご家庭で気軽に使える理由の1つだと筆者は考えている。

Ubuntuのインストールと初期設定

 まずは3台のPCそれぞれに、Ubuntu 24.04.3のサーバー版をインストールしよう。サーバー版Ubuntuのインストール方法は第26回を参照してほしい。

 ポイントは、MicroCloudはDHCPに非対応な点だ。そのためMicroCloudが内部通信に使う1つ目のNICには、必ず固定のIPアドレスを割り当てておこう。Ubuntuはインストール時のネットワーク設定を、インストール後も引き継いでくれるため、インストールの段階で設定しておくと楽だろう。

ネットワークの設定

 インストールが完了したら、2つ目のNICを手動で設定しよう。2つ目のNICは、IPアドレスが「割り当てられない」状態にしておく必要がある。つまり固定IPは割り当てず、DHCPもoffにする必要があるわけだ。そこでまず、2つ目のNICのデバイス名を調べる。これには「ip -br a」コマンドを使うと分かりやすい。以下の例では、enp2s0がインストール時に固定IPを割り当てたNICで、enxc84d44253b72が2つ目のNICであると分かる。

$ ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
enp2s0           UP             192.168.1.91/24 2405:6583:d820:800:642:1aff:feca:82e0/64 fe80::642:1aff:feca:82e0/64
enxc84d44253b72  UP
wlp3s0           DOWN

 以下のコマンドを実行して、netplanの設定ファイルを作成するとよい。なお当然だが、「enxc84d44253b72」の部分は環境に応じて適宜変更しよう。

$ cat <<EOF | sudo tee /etc/netplan/99-local.yaml
network:
  version: 2
  ethernets:
    enxc84d44253b72:
      dhcp4: false
      accept-ra: false
      link-local: []
EOF

 設定ファイルが作成できたら、以下のコマンドでパーミッションを変更してから、設定を反映しよう。

$ sudo chmod 0600 /etc/netplan/99-local.yaml
$ sudo netplan apply

ストレージの初期化

 MicroCloudが使う2つ目のストレージは、パーティションを持っていてはいけない。後で実行する初期化手順内でワイプしてくれるはずだが、筆者は念のため、ディスクの先頭をゼロ埋めしておくことにした。

 まず「lsblk」コマンドでストレージのデバイス名を調べよう。以下の例では、nvme0n1がUbuntuをインストールしたSSDで、sdaが2つ目のストレージであることが分かる。

$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0 931.5G  0 disk
├─sda1                      8:1    0 931.5G  0 part
└─sda9                      8:9    0     8M  0 part
nvme0n1                   259:0    0 931.5G  0 disk
├─nvme0n1p1               259:1    0     1G  0 part /boot/efi
├─nvme0n1p2               259:2    0     2G  0 part /boot
└─nvme0n1p3               259:3    0 928.5G  0 part
  ├─ubuntu--vg-ubuntu--lv 252:0    0   100G  0 lvm  /
  └─ubuntu--vg-mc         252:1    0 828.5G  0 lvm

 以下は/dev/sdaの先頭1GBをゼロ埋めする例だ。このコマンドを実行したデバイスは、文字通りパーティションが消える。くれぐれもデバイスを取り違えることがないよう、気をつけてほしい。

$ sudo dd if=/dev/zero of=/dev/sda bs=1M count=1024

snapパッケージのインストール

 最後に、snapで必要なパッケージをインストールしよう。これは簡単で、以下の4つのコマンドを実行すればいい。

$ sudo snap install lxd --channel=5.21/stable --cohort="+"
$ sudo snap install microceph --channel=squid/stable --cohort="+"
$ sudo snap install microovn --channel=24.03/stable --cohort="+"
$ sudo snap install microcloud --channel=2/stable --cohort="+"

 以上の作業を、3台のPCすべてに対して行なっておこう。

MicroCloudのインストール

 必要な準備が整ったので、ここからはMicroCloudの構築設定を行なっていく。

MicroCloudの初期化の開始

 初期化作業は、1号機と2/3号機で実行するコマンドが違うため、取り違えに注意しよう。まずは1号機で、以下のコマンドを実行する。すると「Do you want to set up more than one cluster member?」と聞かれるので、「yes」と入力してEnterを押そう。

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

 次に、クラスタ内で使用するネットワークに使うIPアドレスを選択する。インストール時にIPを振ったNICがリストアップされるので、カーソルキーの上下で使うIPアドレスにカーソルを合わせ、Spaceで選択しよう。すると文字が緑色に変化するので、その状態でEnterを押そう。

1つ目のNICに割り当てられているIPアドレスが表示される
ここではIPv4アドレスを選択した

 すると、クラスタ参加用のパスフレーズが緑色の文字で表示される。以下の例でいえば、「lettuce defrost~」というやつだ。これを控えておこう。

クラスタ参加に必要となるパスフレーズを控える。これは次の手順で、参加メンバー側に入力する

 ここまで進んだら、いったん1号機はそのまま放置しておこう。くれぐれもコマンドを終了したり、ターミナルを閉じたりしないように。

2号機/3号機をクラスタに参加させる

 続いて2号機で以下のコマンドを実行しよう。

$ sudo microcloud join

 1号機同様に、クラスタ内で使用するネットワークに使うIPアドレスを選択する画面が表示される。ここでもインストール時に設定したIPv4アドレスを選択しよう。

2号機のIPアドレスを選択する

 「Specify the passphrase for joining the system」と表示されたら、先ほど1号機の画面に表示されたパスフレーズを入力する。

パスフレーズの入力画面

 すると自動的にinitコマンドを実行中の1号機を検索し、接続してくれる。以下のような画面が表示されたら、接続は完了だ。

1号機を見つけて、接続した状態

 2号機の作業はこれで完了となる。こちらもコマンドを終了したり、ターミナルを閉じたりせず、いったんこのまま放置しておこう。そして別のターミナルを開いて、3号機でもまったく同じ作業を行なおう。

MicroCloudの設定

 2号機、3号機でjoinコマンドを正しく実行できたら、先ほどから放置していた1号機の画面に戻ってこよう。以下のように1号機の画面に、2/3号機のIPアドレスとフィンガープリントが表示されているはずだ。IPアドレスを選択した時と同様に、2/3号機それぞれにカーソルを合わせ、Spaceで選択しよう。両方の文字が緑色になったことを確認したら、Enterを押す。

2/3号機をクラスタに参加させる

 続いてローカルストレージの設定だ。「Would you like to set up local storage?」と表示されるので、「yes」と入力してEnterを押そう。

Would you like to set up local storage? (yes/no) [default=yes]:        ← yesと入力してEnter

 各PCに搭載されている、2つ目のストレージがリストアップされるはずだ。ここでもすべてを選択して、文字が緑色に変わったことを確認してEnterを押そう。

ローカルストレージとして構成するストレージを選択する

 すると直後に、同じ画面が表示される。間違い探しのようだが、これは選択したストレージをワイプしていいか聞かれている。同様にすべてを選択してEnterを押そう。

選択したストレージをワイプする

 次にリモートストレージの設定を行なうのだが、今回のPCはほかにストレージを積んでないため、リモートストレージの設定はスキップされる。以下のWarningが表示されるが、これは無視して構わない。

! Warning: No disks available for distributed storage. Skipping configuration

 最後に、仮想ネットワークの設定を行なう。「Configure distributed networking?」と表示されたら、「yes」と入力してEnterを押す。

Configure distributed networking? (yes/no) [default=yes]:         ← yesと入力してEnter

 仮想ネットワークがアップリンクネットワークに接続するためのNICを選択しよう。IPアドレスを振ってない、2つ目のNICがそれぞれリストアップされるはずだ。これもすべてSpaceで選択してEnterを押そう。

2つ目のNICをすべて選択する

 仮想ネットワークの具体的な設定を入力しよう。インターネットに出ていくためのIPv4のゲートウェイ、MicroCloudが仮想ネットワークで使用するIPアドレスのレンジ、使用するDNSサーバーのアドレスをそれぞれ入力する。今回は家庭のLAN内にMicroCloudを構築しているため、「Specify the IPv4 gateway (CIDR) on the uplink network」には普段使っているゲートウェイのIPアドレスをそのまま記述しよう。大抵の場合、インターネットに接続しているルーターのIPアドレスになるだろう。

 「Specify the first IPv4 address in the range to use on the uplink network」と「Specify the last IPv4 address in the range to use on the uplink network」には、仮想ネットワークに割り当てる最初のIPアドレスと、最後のIPアドレスを入力する。LANのプライベートIPアドレスのうち、DHCPなどで使用していない領域を割り当てよう。

 「Specify the IPv6 gateway (CIDR) on the uplink network」だが、今回はIPv6を指定しないため、空欄のままEnterを押そう。

 「Specify the DNS addresses (comma-separated IPv4 / IPv6 addresses) for the distributed network」には、普段使っているDNSサーバーのIPアドレスを入力しよう。カンマ区切りで複数入力できる。以下は筆者の自宅内の例だ。

Specify the IPv4 gateway (CIDR) on the uplink network: 192.168.1.1/24
Specify the first IPv4 address in the range to use on the uplink network: 192.168.1.50
Specify the last IPv4 address in the range to use on the uplink network: 192.168.1.90
Specify the IPv6 gateway (CIDR) on the uplink network:
Specify the DNS addresses (comma-separated IPv4 / IPv6 addresses) for the distributed network [default=192.168.1.1]: 192.168.1.4,192.168.1.5

 これで設定は完了だ。以下のように「MicroCloud is ready」の表示がなされれば、インストールは成功している。

MicroCloudのインストール完了

 また2/3号機の画面も、以下のようになっているはずだ。

Successfully joined the MicroCloud cluster and closing the sessionと表示されていれば、クラスタへの参加が完了している

 ここまで確認ができたら、2/3号機のターミナルは閉じてしまって構わない。

クラスタの確認

 構築したクラスタの状態は、「lxc」コマンドで確認できる。まず「lxc cluster list」を実行してみよう。以下のように、クラスタを構成するノードの情報が表示される。なおこのコマンドは、1/2/3号機、いずれで実行しても構わない。

$ lxc cluster list
+------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| NAME |            URL            |      ROLES      | ARCHITECTURE | FAILURE DOMAIN | DESCRIPTION | STATE  |      MESSAGE      |
+------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| mc1  | https://192.168.1.91:8443 | database-leader | x86_64       | default        |             | ONLINE | Fully operational |
|      |                           | database        |              |                |             |        |                   |
+------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| mc2  | https://192.168.1.92:8443 | database        | x86_64       | default        |             | ONLINE | Fully operational |
+------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| mc3  | https://192.168.1.93:8443 | database        | x86_64       | default        |             | ONLINE | Fully operational |
+------+---------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+

 「lxc storage」では、ストレージの状態を確認できる。今回の例では「local」というZFSのストレージが作成されていることが分かる。

$ lxc storage list
+-------+--------+----------------------+---------+---------+
| NAME  | DRIVER |     DESCRIPTION      | USED BY |  STATE  |
+-------+--------+----------------------+---------+---------+
| local | zfs    | Local storage on ZFS | 7       | CREATED |
+-------+--------+----------------------+---------+---------+

$ lxc storage info local
info:
  description: Local storage on ZFS
  driver: zfs
  name: local
  space used: 2.48MiB
  total space: 899.25GiB
used by:
  profiles:
  - default
  volumes:
  - backups (location "mc1")
  - backups (location "mc2")
  - backups (location "mc3")
  - images (location "mc1")
  - images (location "mc2")
  - images (location "mc3")

 さらなるlxcコマンドについての詳細は、ドキュメントを参照してほしい。

Web UIにアクセス

 MicroCloudはコンテナや仮想マシンを動かすため、LXDを基盤として構築されている。LXDにはなかなか便利なWeb UI(LXD-UI)が用意されており、MicroCloudでもデフォルトで利用できるようになっている。Webブラウザから、先ほど「lxc cluster list」で表示された、1号機のURLにアクセスしてみよう。お決まりのSSL証明書に関する警告が表示されるが、自分でセットアップしたサーバーであるため、これは無視しよう。

 LXD-UIは、よくあるID/パスワードではなく、クライアント証明書を使って認証を行なう。少し手間ではあるのだが、以下のスクリーンショットの手順で操作すればよい。なおここでは、WebブラウザはUbuntu標準のFirefoxを使っているものとする。

 まずはクライアント証明書を生成する。「Generate certificate」をクリックしよう。

最初に表示される画面。ここで証明書を生成する

 クライアント証明書はパスワードで保護もできる。今回はパスワードは設定しないこととしたので、そのまま「Generate and download」をクリックしよう。

パスワードで保護する場合は、「Password protected」をONにしよう

 すると「lxd-ui-サーバーのIPアドレス.pfx」という名前のファイルがダウンロードされる。これをFirefoxに追加しよう。Firefoxのアドレスバーに「about:preferences#privacy」と入力すると、設定画面が開く。「証明書」セクションにある「証明書を表示」をクリックしよう。

Firefoxに証明書を追加する

 証明書マネージャーが開くので、「あなたの証明書」タブを開き、「インポート」ボタンをクリックする。先ほどダウンロードしたpfxファイルをインポートしよう。以下のように、LXD UIが発行した証明書がインポートできたら、「OK」をクリックしてウィンドウを閉じる。

証明書をインポートした状態

 もう一度LXD-UIのURLにアクセスすると、クライアント証明書の提示を求められる。先ほどインポートした証明書を選択して「OK」をクリックしよう。これでLXD-UIへのログインは完了だ。

証明書を送信してログインする

 最後に、Trustトークンを入力する必要がある。1号機のターミナルで、以下のコマンドを入力しよう。画面にトークンが表示されるので、これを控えておく。

$ lxc auth identity create tls/lxd-ui --group admins
コマンドラインからトークンを取得する

 LXD-UIの画面に戻り、テキストボックスにトークンをコピペして「Connect」をクリックする。

トークンの入力

 これでインストールとUIの設定は完了だ。以後はWebブラウザから、自由にコンテナや仮想マシンを作成できる。ネットワークの設定や、ターミナルアクセスも、LXD-UIを経由して行なえるのだ。

MicroCloudでUbuntuを起動して、ターミナルをWebから操作している例
GUIも問題なく動く
MicroCloud上で起動した仮想マシンの中で、Dockerを動かすこともできる

 MicroCloudではLXDによるシステムコンテナを高速に起動できる。つまりインストールの手間なしに、まっさらのUbuntu環境を立ち上げられるのだ。「ちょっとアプリの動作を確認したい」といった際に、使い捨ての検証環境を用意できるのは非常に便利だ。

 パブリッククラウドは費用面の問題があり、かといって本格的なプライベートクラウドの導入はハードルが高いだろう。小規模な仮想マシンプラットフォームを手軽にデプロイできるMicroCloudは、個人から小規模チーム向けの、学習・検証用基盤としては、非常に使いやすいのではないだろうか。

 ぜひ余っているPCを使って、自宅にクラウドを召喚してみて欲しい。