Proxmox VE 6.1でクラスタをセットアップ

Proxmox VE 6.1でクラスタをセットアップしたメモ

最初に

使用バージョンはProxmox VE 6.1-5
今回は3台を用意(全てバージョンは6.1-5)

3台ともにNICは2つ搭載しているので別セグメントで運用

192.168.0.xがProxmox管理用ネットワーク
192.168.1.xが予備ネットワーク

各サーバの状況は
pve01が192.168.0.11/192.168.1.11
pve02が192.168.0.12/192.168.1.12
pve03が192.168.0.13/192.168.1.13

表記についてはWEBGUI内で「クラスタ」と表示されているので
記事内ではクラスターではなくクラスタに合わせてます

クラスタ作成前に注意するポイント

クラスタは2台~32台まで対応
(HAなど一部機能は3台以上が必要)

Proxmoxのクラスタを利用する主なメリット
・WEBGUIが一元化できる(各サーバのWEBGUIに個別にアクセスしなくて済む)
・マイグレーションに対応できる(共有ストレージがあればライブマイグレーションも可能)
・CephやHA・FWなどクラスタのみで利用できる機能が使えるようになる

クラスタ機能における面倒なポイント
・クラスタに関する大半の操作がCUI操作必須

マイグレーションも普通に使えますし各機能の動作自体は問題ないのですが
クラスタ自体の操作についてはセットアップのみWEBGUI対応していて
マスターノード変更やノード端末の入替、ノードの削除など
運用開始後のクラスタ構成情報を変更する場合はCUI以外選択肢がありません

いつかは対応するとは思いますが少なくとも6.1-5時点でのWEBGUIは
クラスタ作成・クラスタ参加・クラスタ状況監視のみ可能

特に面倒なのがノード削除・クラスタ削除の操作で
ノード削除に関しては一度切り離した端末は再登録は不可
再登録したいならノードのProxmoxを再インストール推奨
クラスタ自体の削除も公式ではProxmoxの再インストール推奨です

一応フォーラムにてCUI手順がいろいろ紹介されているので
CUI操作で対応できると思いますが
少なくとも公式wikiにはノード削除時のコマンドしか掲載されておらず
非公式情報から探すことになるため
どのCUI操作が現バージョンの情報なのかを確認する必要があります

クラスタ作成前にセカンダリNICを設定

前回までの記事でインストールと初期設定が終わっていて
Proxmox管理用ネットワークに使用するNICのみ設定済でしたが
セカンダリNICがまだ設定していなかったので設定していきます

クラスタ機能を利用する分にはNICは1つでも大丈夫ですが
クラスタ参加時にセカンダリNICを設定できるのでクラスタ構築前に設定します

WEBGUIのシステム -> ネットワークから空きNICを編集します
IPv4/CIDRに入力し自動的に開始にチェックを入れるだけでOK

設定反映と自動的に開始するか確認も兼ねてサーバ再起動を実行
復帰後にNIC状況確認

3台ともにセカンダリNICを設定できれば各サーバでpingを実行し疎通確認を実施

root@pve01:~# ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.011 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.007 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.006 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.006 ms
64 bytes from 192.168.1.11: icmp_seq=5 ttl=64 time=0.006 ms
^C
--- 192.168.1.11 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 84ms
rtt min/avg/max/mdev = 0.006/0.007/0.011/0.002 ms
root@pve01:~# ping 192.168.1.12
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=0.239 ms
64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.336 ms
64 bytes from 192.168.1.12: icmp_seq=3 ttl=64 time=0.319 ms
64 bytes from 192.168.1.12: icmp_seq=4 ttl=64 time=0.242 ms
64 bytes from 192.168.1.12: icmp_seq=5 ttl=64 time=0.314 ms
^C
--- 192.168.1.12 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 108ms
rtt min/avg/max/mdev = 0.239/0.290/0.336/0.041 ms
root@pve01:~# ping 192.168.1.13
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.
64 bytes from 192.168.1.13: icmp_seq=1 ttl=64 time=0.224 ms
64 bytes from 192.168.1.13: icmp_seq=2 ttl=64 time=0.301 ms
64 bytes from 192.168.1.13: icmp_seq=3 ttl=64 time=0.308 ms
64 bytes from 192.168.1.13: icmp_seq=4 ttl=64 time=0.319 ms
64 bytes from 192.168.1.13: icmp_seq=5 ttl=64 time=0.221 ms
^C
--- 192.168.1.13 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 100ms
rtt min/avg/max/mdev = 0.221/0.274/0.319/0.046 ms
root@pve01:~#
root@pve02:~# ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.242 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.320 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.318 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.331 ms
64 bytes from 192.168.1.11: icmp_seq=5 ttl=64 time=0.318 ms
^C
--- 192.168.1.11 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 97ms
rtt min/avg/max/mdev = 0.242/0.305/0.331/0.039 ms
root@pve02:~# ping 192.168.1.12
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=0.010 ms
64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.006 ms
64 bytes from 192.168.1.12: icmp_seq=3 ttl=64 time=0.015 ms
64 bytes from 192.168.1.12: icmp_seq=4 ttl=64 time=0.010 ms
64 bytes from 192.168.1.12: icmp_seq=5 ttl=64 time=0.006 ms
^C
--- 192.168.1.12 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 103ms
rtt min/avg/max/mdev = 0.006/0.009/0.015/0.004 ms
root@pve02:~# ping 192.168.1.13
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.
64 bytes from 192.168.1.13: icmp_seq=1 ttl=64 time=0.457 ms
64 bytes from 192.168.1.13: icmp_seq=2 ttl=64 time=0.290 ms
64 bytes from 192.168.1.13: icmp_seq=3 ttl=64 time=0.304 ms
64 bytes from 192.168.1.13: icmp_seq=4 ttl=64 time=0.295 ms
64 bytes from 192.168.1.13: icmp_seq=5 ttl=64 time=0.297 ms
^C
--- 192.168.1.13 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 79ms
rtt min/avg/max/mdev = 0.290/0.328/0.457/0.067 ms
root@pve02:~#
root@pve03:~# ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.226 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.319 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.306 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.304 ms
64 bytes from 192.168.1.11: icmp_seq=5 ttl=64 time=0.311 ms
^C
--- 192.168.1.11 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 82ms
rtt min/avg/max/mdev = 0.226/0.293/0.319/0.035 ms
root@pve03:~# ping 192.168.1.12
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=0.164 ms
64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.303 ms
64 bytes from 192.168.1.12: icmp_seq=3 ttl=64 time=0.288 ms
64 bytes from 192.168.1.12: icmp_seq=4 ttl=64 time=0.291 ms
64 bytes from 192.168.1.12: icmp_seq=5 ttl=64 time=0.288 ms
^C
--- 192.168.1.12 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 79ms
rtt min/avg/max/mdev = 0.164/0.266/0.303/0.055 ms
root@pve03:~# ping 192.168.1.13
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.
64 bytes from 192.168.1.13: icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from 192.168.1.13: icmp_seq=2 ttl=64 time=0.009 ms
64 bytes from 192.168.1.13: icmp_seq=3 ttl=64 time=0.014 ms
64 bytes from 192.168.1.13: icmp_seq=4 ttl=64 time=0.010 ms
64 bytes from 192.168.1.13: icmp_seq=5 ttl=64 time=0.013 ms
^C
--- 192.168.1.13 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 103ms
rtt min/avg/max/mdev = 0.009/0.012/0.018/0.005 ms
root@pve03:~#

クラスタ作成前の状態

クラスタ構成を作成する前の状態がこちら

スタンドアロンノード – クラスタ未定義なのが確認できます

クラスタ作成

まずはpve01でクラスタ自体を作成します
ここからは3台のWEBGUIを同時に開いておくと楽です

左メニューのデータセンターを選択してからクラスタメニューへ移動
「クラスタを作成」ボタンを選択

クラスタ名は自由に入力できますが後で変更できないので確定した名前をつけます
Link0がメインのNICで通常はProxmox管理用ネットワークを選択
詳細設定にチェックするとLink 1も選択できるようになります

Linkはプルダウンで選択可能

今回はこのような構成で作成しました
1NICサーバであればLink 0だけでも問題ありません
Link 1は冗長化する為の予備ネットワークとなります

TASK OKで終了していれば問題ないので右上の×で閉じる

クラスタ画面にもちゃんと反映されます

サマリー画面もクラスタ状態になります

クラスタへノードを参加させる

pve01にクラスタを作成したのでpve02とpve03を参加させます

まずはpve01のクラスタ画面で「Join情報」を選択

クラスタJoin情報が表示されたらJoin情報に記載されている文字列をコピーします

次に参加させるノード(今回はpve02)のWEBGUIへ移動し「クラスタに参加」を選択

クラスタJoin画面が表示されたら先ほどコピーした文字列を「情報」に貼り付けます
(エンコードされたクラスタ情報をここに貼り付けと記載されている部分)

エンコードされたクラスタ情報を貼り付けると
PeerアドレスとFingerprintが自動で入力されます

残りのフィールドを埋めていきます
パスワードには接続先となるpve01のrootパスワードを入力
Link 0とLink 1はクラスタ作成と同じセグメントのNICを選択します

「Join」ボタンを選択してノードを参加させます
クラスタに参加の処理でログが出ず裏にも接続エラーが表示されますが
参加ノード側(pve02)のWEBGUIは慌てずそのままにします

pve01のWEBGUIを確認してpve02が登録されているのを確認します
ここで反映していれば問題ありません

pve02のWEBGUIはF5更新か再ログインで更新すればOK

サマリー画面もノードが追加されておりCPUやメモリも合算されました

pve03も同様の作業を行うと完了

3台クラスタの状況確認

pve01・pve02・pve03のクラスタが構成できたので確認していきます

まずはサマリー画面
CPUは8コア+8コア+4コアで20個
メモリは64GB+64GB+32GBで156.47GB
ストレージはまだProxmoxインストール先のSSDしか登録していないので141.71GB
ストレージの使用分は現時点ではOS3台分となります

クラスタを組めばpve01のWEBGUI上だけで全ノードのWEBGUIと同様の操作が可能です
pve01のサマリー

pve02のサマリー

pve03のサマリー

クラスタ画面

左メニューを展開すると各ノードに登録されているストレージが表示されます
VMを登録すればVMもここにリストされます

一部ノードをシャットダウンした場合

クラスタの一部ノードをシャットダウンした場合の画面を確認します

まずはpve03をシャットダウンし2ノード状態にした場合
左メニューでpve03のダウンを確認、ノードもオフラインカウントが増えています

更にpve01をシャットダウンしpve02のみが稼働している状態にします
この場合はWEBGUIもpve02に接続しています

1台だとクラスタ状態は×判定になります
とはいえpve02自体は動作しているのでpve02上のVMは使用できます
あくまでクラスタが必要な機能が利用できない状態です

pve03を起動させて2台構成に戻します

pve03の復帰を検知すると自動でクラスタ状態が戻りました
クラスタ作成元のpve01がダウンしていても問題ありません

最後に

ESXiと違って無料でHAクラスタ・ライブマイグレーション機能が利用可能
しかもvCenter Server Applianceのように別途メモリ等を確保する必要がないので
リソースを無駄なくVMで使用できるのは素晴らしいポイントです

コメント

  1. kota より:

    これは良記事!
    同じような構成で試してみたことがありますが、cephクラスタの対障害性の検証してて挫折しました。
    もしcephを使っているなら、是非記事にしてもらいたいです

  2. ネス より:

    ちょうど次の記事からCeph関連の検証を予定してましたので
    期待に応えられるよう早めに記事にまとめたいと思います
    励みになるコメントありがとうございました