年末に衝動的にデスクトップ用途のPCを購入し、それまで使っていた「最初はESXiを入れてたけど新PCのProxmox VEに移行したため(それ以前のPCはwin10からアップグレードできなかったので)Windows11で使ってたIntel NUC」が再び役割を終えて部屋のオブジェになっていたので、これにもProxmox VEを入れてクラスタを組んでみることにした。
(というのを冬休みに試そうとしてたのに延び延びに。。)
構成
| node | address | version | spec | memo |
|---|---|---|---|---|
| pve01 | 192.168.0.4 | 8.3.3 | 16CPUs / RAM64GB | メインのPVE(MINISFORUM) |
| pve02 | 192.168.0.5 | 8.3.3 | 8CPUs / RAM64GB | 追加のPVE(Intel NUC) |
メインで使っていたpve01に、別ハードへ新規インストールしたpve02をクラスタ参加させる、というシナリオ。
k3sやkubeadminを使ったマルチノードKubernetes構築をやってると作業のイメージは付きやすい(当社比)
基本的にマニュアル通りやれば簡単に構築できる。
ノードの準備
PVEのインストールは通常通りなので割愛。
pve01は運用中のもので、VMや仮想ネットワーク等いろいろ作成済みの状態。
一方pve02はインストール直後でVM等無しの状態。(ドキュメントによるとID重複を避けるためVMを持っているとNGとのこと)
クラスタの作成
まずは複数のノードを参加させる箱となるクラスタを作成。
GUIとCLIの2通りの方法がある。今回は初回なのでGUIで実施。

「データセンター」→「クラスタ」→「クラスタを作成」押下し、「クラスタ名」を入力する。
ドキュメントに書かれている通り、クラスタ名は変更できないので注意。

クラスタネットワークは、ネットワークインタフェースが複数ある場合にどのネットワークを使用するかを選択する。要はクラスタを組む他のノードと疎通のあるネットワークを選択する。
見切れてる文言は「フェイルオーバ用に複数のリンクが使用され、最小値が最大の優先度を持ちます」で、「追加」を押下するとクラスタを組む際のネットワークを複数選択し、冗長構成も可能。


作成後はCLIでも状態を確認できる。
### クラスタ作成前 root@pve01:~# pvecm status Error: Corosync config '/etc/pve/corosync.conf' does not exist - is this node part of a cluster?
### クラスタ作成後
root@pve01:~# pvecm status
Cluster information
-------------------
Name: pve-cluster
Config Version: 1
Transport: knet
Secure auth: on
Quorum information
------------------
Date: Sun Feb 16 10:12:48 2025
Quorum provider: corosync_votequorum
Nodes: 1
Node ID: 0x00000001
Ring ID: 1.5
Quorate: Yes
Votequorum information
----------------------
Expected votes: 1
Highest expected: 1
Total votes: 1
Quorum: 1
Flags: Quorate
Membership information
----------------------
Nodeid Votes Name
0x00000001 1 192.168.0.4 (local)
クラスタへノードの追加
「クラスタの作成」は箱ができるだけ(作ったノード自身は含まれるが)なので、箱ができたらノードを追加する。
pve01側 (クラスタを作成した元のPVE)
まずはクラスタを作成した側のGUIで「Join情報」押下。
これで、クラスタに参加するための認証情報を確認でき「情報をコピー」押下でクリップボードへコピーされる。

pve02側 (クラスタへ参加する追加のPVE)

「データセンター」→「クラスタ」→「クラスタに参加」を押下、コピーした認証情報をペーストする。
すると追加の入力フィールドが表示されるので、接続先PVEのrootパスワードを入力する。
入力が完了したら「Join 'クラスタ名'」押下
接続に成功するとどちらのPVEノードでも、クラスタ画面でノード状態やVM一覧を確認できるようになる。
(証明書が再作成されるため、Webのセッションは一度切断されるので再ログインが必要)

CLIでの確認は以下の通り。
root@pve01:~# pvecm status
Cluster information
-------------------
Name: pve-cluster
Config Version: 2
Transport: knet
Secure auth: on
Quorum information
------------------
Date: Sun Feb 16 10:34:50 2025
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000001
Ring ID: 1.9
Quorate: Yes
Votequorum information
----------------------
Expected votes: 2
Highest expected: 2
Total votes: 2
Quorum: 2
Flags: Quorate
Membership information
----------------------
Nodeid Votes Name
0x00000001 1 192.168.0.4 (local)
0x00000002 1 192.168.0.5
ノード情報のみを見るには以下。
root@pve01:~# pvecm node
Membership information
----------------------
Nodeid Votes Name
1 1 pve01 (local)
2 1 pve02
クラスタの状態
SDNとストレージはどちらのノードのものかが一覧で表示されるが、VMは一覧では特に表記なし。サマリーで確認できる。

GUIでノード毎のVM一覧を確認する方法はぱっと見では見当たらなかったがUI上部かデータセンターの「検索」から。

データセンターで確認できる一覧に「ノード」が無い場合は、右端の「∨」から追加する。

CLIであれば、qm listの出力は実行しているノード上のVMのみになる。
VMのライブマイグレーション (VMwareでいうvMotion)
VMを無停止のまま、載っているノードをAからBへ移す機能。 VM一覧の右クリックメニュー、あるいは、VM情報を開いてる状態で画面右上にある「マイグレート」ボタンを押下。

ローカルディスクにあるVMのため時間はかかるかも、と警告は表示されるが、OKであればダイアログの「マイグレート」を押下する。
(ちなみに5GBストレージのVMで30秒ほど)

ストレージ構成の差分がある場合はマイグレーション時に指定

マイグレートのダイアログで、デフォルトのまま開始しようとするとストレージが存在しないエラーとなるが、「ターゲットストレージ」で対象ディスクを指定してマイグレーションできる。

ネットワークデバイスの差分がある場合はエラー

2025-02-16 10:42:44 starting migration of VM 716 to node 'pve02' (192.168.0.5) 2025-02-16 10:42:44 found generated disk 'local-lvm:vm-716-cloudinit' (in current VM config) 2025-02-16 10:42:44 found local disk 'local-lvm:vm-716-disk-0' (attached) 2025-02-16 10:42:44 copying local disk images 2025-02-16 10:42:45 Logical volume "vm-716-cloudinit" created. 2025-02-16 10:42:45 64+0 records in 2025-02-16 10:42:45 64+0 records out 2025-02-16 10:42:45 4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.557406 s, 7.5 MB/s 2025-02-16 10:42:45 63+2 records in 2025-02-16 10:42:45 63+2 records out 2025-02-16 10:42:45 4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.0569795 s, 73.6 MB/s 2025-02-16 10:42:45 successfully imported 'local-lvm:vm-716-cloudinit' 2025-02-16 10:42:45 volume 'local-lvm:vm-716-cloudinit' is 'local-lvm:vm-716-cloudinit' on the target 2025-02-16 10:42:45 starting VM 716 on remote node 'pve02' 2025-02-16 10:42:48 [pve02] bridge 'vmbr1' does not exist 2025-02-16 10:42:48 [pve02] kvm: -netdev type=tap,id=net1,ifname=tap716i1,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown: network script /var/lib/qemu-server/pve-bridge failed with status 512 2025-02-16 10:42:49 [pve02] start failed: QEMU exited with code 1 2025-02-16 10:42:49 ERROR: online migrate failure - remote command failed with exit code 255 2025-02-16 10:42:49 aborting phase 2 - cleanup resources
見ての通り「bridge 'vmbr1' does not exist」とメッセージが出ている。
これは、VMにセットされているNICが、マイグレーション先のノードに存在しないため失敗している。
つまり、VMの「ハードウェア」で定義しているネットワークデバイスと同じものが、マイグレーション先のノードでも使える必要がある、ということ。
ノードのネットワーク定義に差異があり、かつ、差のあるネットワークデバイスを割り当てているVMはマイグレーション不可。
※ デバイス名は同じだがネットワークアドレスなどの中の定義が異なるパターンは未確認

その他備忘録
PVEノードのパッケージインストール状態や、/etc/hostsといった設定ファイル類は同期されたりはしない。
PVE自体でDNSサーバーなど稼働してる場合は、クラスタ機能とは完全に独立してるので注意。
年末に衝動的に購入したデスクトップ用途のPC