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も選択できるようになります
今回はこのような構成で作成しました
1NICサーバであればLink 0だけでも問題ありません
Link 1は冗長化する為の予備ネットワークとなります
クラスタへノードを参加させる
pve01にクラスタを作成したのでpve02とpve03を参加させます
クラスタ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のサマリー
左メニューを展開すると各ノードに登録されているストレージが表示されます
VMを登録すればVMもここにリストされます
一部ノードをシャットダウンした場合
クラスタの一部ノードをシャットダウンした場合の画面を確認します
まずはpve03をシャットダウンし2ノード状態にした場合
左メニューでpve03のダウンを確認、ノードもオフラインカウントが増えています
更にpve01をシャットダウンしpve02のみが稼働している状態にします
この場合はWEBGUIもpve02に接続しています
1台だとクラスタ状態は×判定になります
とはいえpve02自体は動作しているのでpve02上のVMは使用できます
あくまでクラスタが必要な機能が利用できない状態です
pve03の復帰を検知すると自動でクラスタ状態が戻りました
クラスタ作成元のpve01がダウンしていても問題ありません
最後に
ESXiと違って無料でHAクラスタ・ライブマイグレーション機能が利用可能
しかもvCenter Server Applianceのように別途メモリ等を確保する必要がないので
リソースを無駄なくVMで使用できるのは素晴らしいポイントです
コメント
これは良記事!
同じような構成で試してみたことがありますが、cephクラスタの対障害性の検証してて挫折しました。
もしcephを使っているなら、是非記事にしてもらいたいです
ちょうど次の記事からCeph関連の検証を予定してましたので
期待に応えられるよう早めに記事にまとめたいと思います
励みになるコメントありがとうございました