zaki work log

作業ログやら生活ログやらなんやら

[Proxmox VE] 複数のPVEノードでクラスタを構築しゲストVMのマイグレーションを試す

年末に衝動的にデスクトップ用途の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.proxmox.com

ノードの準備

PVEのインストールは通常通りなので割愛。
pve01は運用中のもので、VMや仮想ネットワーク等いろいろ作成済みの状態。
一方pve02はインストール直後でVM等無しの状態。(ドキュメントによるとID重複を避けるためVMを持っているとNGとのこと)

クラスタの作成

まずは複数のノードを参加させる箱となるクラスタを作成。
GUICLIの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

zotac.co.jp