Proxmox を使ってある程度仕事に使えるプライベートクラウド環境を作成する
VMwareが色々変わったおかげ?で我が家も変わらずおえなくなった。VCPまで個人取得して愛してきたESXiともお別れである。単純にProxmoxを使った単独サーバを立てるくらいなら巷の情報で十分であるが、商用利用を想定した環境をイメージすると意外と情報が足りない。そこでせめてHAクラスタくらいは作ってみたいと思い調べた内容を書き記すことにした。
Proxmoxが動きそうな環境
評価用としての記載はこうある
最小ハードウェア(テストのみ)
CPU: 64ビット (Intel EMT64 または AMD64)
Intel VT/AMD-V 対応 CPU/マザーボード (KVM 完全仮想化サポート用)
最低1GBのRAM
ハードドライブ
1 つの NIC
今回の評価環境はこんな感じ
かなり古めのPCでもこの程度の要件は確保できると思う。
Proxmox1(物理PC1:メインの評価環境となるのでスペック高め)
CPU: 64ビット (Intel EMT64 または AMD64)
Intel VT/AMD-V 対応 CPU/マザーボード (KVM 完全仮想化サポート用)
32GBのRAM
USBメモリ 32GB(ProxmoxOSインストール用)
1 以上の NIC
Proxmox2(物理PC2:クラスタの評価としてゲストが動くスペック)
CPU: 64ビット (Intel EMT64 または AMD64)
Intel VT/AMD-V 対応 CPU/マザーボード (KVM 完全仮想化サポート用)
16GBのRAM
USBメモリ 32GB(ProxmoxOSインストール用)
1 以上の NIC
Proxmox3(仮想PC1:クラスタの3ノード対策としてProxmox1內のゲストとして作成)
CPU: 仮想2コア
2GBのRAM
vHDD 32GB(ProxmoxOSインストール用)
1 以上の NIC
Proxmox4(仮想PC2:クラスタの3ノード対策としてProxmox2內のゲストとして作成)
ノード対策としてはProxmox3まで作成しておけばOKだが、片系を完全停止させた場合に残る片系だけでクラスタを維持するために両系にダミーノードを作っておくと検証が楽になる。
CPU: 仮想2コア
2GBのRAM
vHDD 32GB(ProxmoxOSインストール用)
1 以上の NIC
NAS(仮想で準備してもいいし自作してもいい)
我が家ではNETGEARとQNAPが稼働している。適当にNFSとかiSCSIを使ってProxmoxに見せる領域を作成しておく。
ちなみに、僕はHDDレスでUSBメモリ(32GB)を用意して物理PCに対してProxmoxをインストールした。実際のインストール容量としては6GBくらいみたいだが、OSのアップデートや諸々作業領域は確保したいので32GBとした。もちろん、BIOSにて仮想化機能をONにすることを忘れないように。
ゲストマシンの作成領域はNASのNFSマウントにて対応する。これでもちゃんと最終目標であるHAクラスタが動作するので問題ない。iSCSIでマウントしても問題ないハズ。
ネットワーク情報
ホスト名(IP)
Proxmox1(IP:192.168.1.233/24)
┗管理GUI Proxmox1(https://192.168.1.233:8006/)
Proxmox2(IP:192.168.1.234/24)
┗管理GUI Proxmox2(https://192.168.1.234:8006/)
Proxmox3(IP:192.168.1.235/24)
┗管理GUI Proxmox3(https://192.168.1.235:8006/)
Proxmox4(IP:192.168.1.236/24)
┗管理GUI Proxmox4(https://192.168.1.236:8006/)
HAクラスタ(ノードとして参加したホスト管理IPにて接続可)
┣管理GUI-1 ProxmoxHA(https://192.168.1.233:8006/)
┣管理GUI-2 ProxmoxHA(https://192.168.1.234:8006/)
┣管理GUI-3 ProxmoxHA(https://192.168.1.235:8006/)
┗管理GUI-4 ProxmoxHA(https://192.168.1.236:8006/)
NAS (IP:192.168.1.222/24)
iSCSI (IP:192.168.1.220/24)
Gateway(192.168.1.254)
DNS (192.168.1.254)
Proxmoxを手に入れる
Proxmox VE 8.2 ISO Installer
Version 8.2-1
File Size 1.39 GB
Last Updated April 24, 2024
僕がインストールしたバージョンとしてはコレが最新版。どのみちインストール後にオンラインでアップデートさせる。細かな枝番はさほど気にしなくていい。オンラインアップデートできない人は可能な限り最新版を入手する。最新版でしか対応していない機能もあるので注意すること。
インストールメディアの作成
一般的にProxmoxのインストールと言うとUSBメモリにイメージとして焼いてHDD/SSDにインストールする情報が多いが、今回は昔ながらのDVDに焼いてインストール先としてUSBメモリを選択した。USB起動からのUSBインストール先でも良いが、気分的にややこしいのでやめた。
メディアの作成については巷にやり方があふれているので割愛する。
Proxmoxのインストール
上記で作成したインストールメディアを使用してパソコンを起動する。ことの時に注意しておきたいのが同一ネットワークに存在するDHCPサーバの存在。こやつが悪さするとIP取得に時間がかかってインストーラがなかなか起動してこない。サクッとすすめるならLANケーブルはいったん取り外してから起動すること。シンプルなネットワーク環境であれば問題ないのかもしれない。
基本的にはインストールウイザードに従って進める。
・インストール先:USBメモリ32GB
・環境:Japan
・パスワード:お好みで
・ネットワーク:IPv4の情報(デフォがIPv6で出てきてもIPv4に修正)
・再起動
・LANケーブル外した方は元にもどしてOK
【注意点】
Poxmoxのホストに使用するサーバ(PC等)のCPUが同一シリーズ(機能セット)であれば問題ないが異なる世代を持ち寄ってクラスタを作成する場合、仮想マシンを作成する際のCPU種別が問題となりマイグレートが失敗する(上位種別を設定した仮想マシンは→下位種別しか使えないホストへ移動できない、逆は問題なく移動できる。)場合がある。あとでCPUIDがなんたらとエラーを目にしたときはCPU種別を疑って下位互換に調整すること。
システム系のOSを構築する場合は常時起動させておきたい場合が多いので、その場合は「ブート時に起動」が「はい」となっていることを確認しておくこと。
Proxmoxへのログイン
・ログイン
ユーザ:root
パスワード:インストール時に設定したもの
レルム:Linux PAM Standard Authentication
言語:日本語 - 日本語※
↑※先に言語設定すること、上の入力枠がリセットされる。
【警告表示】
「有効なサブスクリプションがありません」とか言うポップアップ
メッセージが度々至るところで表示されるが無視して「OK」をクリック
する。有料サブスク会員になれば出てこないらしい。
リポジトリの設定
Proxmoxをオンラインアップデートするのに必要な情報をもらってくる先を設定する。
[データセンタ]-[ノード名]-[アップデート]-[リポジトリ]-[追加]
・リポジトリ:No-Subscription
[データセンタ]-[ノード名]-[アップデート]-[再表示]
・更新されたパッケージがリストアップされる
[データセンタ]-[ノード名]-[アップデート]-[_アップグレード]
・実行の確認
「Do you want to continue? [Y/n] もちろん Y で Enter を押す
※大文字「Y」であること
・アップグレードの内容にもよるが「Reboot」しろと書いてあれば
それに従う。
reboot と入力して Enter を押す。意外と再起動は早い。
仮にゲスト構築後に実施した場合はゲストは自動で一括シャット
ダウンとなる。
・「Your System is up-to-date」と出ていればそのまま使用可能。
・シェルで実施する場合
apt update
apt upgrade
reboot
ネットワーク設定
これは単純な評価環境だと必要ないけど、ネットワークを使い分けや冗長化したい場合は必要となる作業。商用利用環境では一般的な作業となる。
[データセンタ]-[ノード名]-[システム]-[ネットワーク]
ここに一般的には2個のネットワーク名が出てくる。
名前 種別 稼働中 自動起動 VLAN ポート
・enp#s## ネットデバイス はい いいえ いいえ
・vmbr0 Linux Bridge はい はい いいえ enp#s##
enpなんたらは物理NICのこと、vmbr0は物理NICを管理して仮想からみた接続先名と言ったところ。
【ヒント】
冗長化したネットワークを組む場合は以下のような構成例になる。ただし、自分が今WebGUIを使っているIPアドレスの紐づけがどうなるのか考えてから実行すること。途中でIPを切り替えて設定を継続するもよし、管理IPに紐づいているNICは可能なかぎり動かさないようにBondを構成するもありである。
【Bonding例】
物理NIC(enp1s0f0,enp1s0f1,enp4s0f0,enp4s0f0,enp0s0f0)
これを束ねるBondを作成すると、こんな感じの入れ子になる。
bond0 Linux Bond enp1s0f0,enp4s0f0 LACP
→vmbr0 Linux Bridge bond0 192.168.1.100 #VM用
bond1 Linux Bond enp1s0f1,enp4s0f1 LACP
→vmbr1 Linux Bridge bond1 192.168.100.100 #Storage用(NAS,iSCSI)
管理用とかは適当に。
vmbr2 Linux Bridge enp0s0f0 192.168.200.100 #管理用(WebGUI)
※ゲストが接続する [Linux Bridge(vmbr0)名]は全ノード共通にする必要があるのでクラスタを展開する場合は注意しておくこと。ここが違うとマイグレートに失敗します。
NASのマウント
ゲストOSを作成するスペースをNASから拝借する。またクラスタを構築するにあたって共有ストレージ化する意義は大きい。確かにCephなどを使ってProxmox同士のローカルディスクを冗長化する技術もあるが、今どきだと小さなNAS(NFS/iSCSI等)を準備しておく方が便利である。
[データセンタ]-[ストレージ]-[追加]-[NFS]
・ID:Proxmoxから見た時の表示名(NAS_Storage)
・サーバ:NASのIP(192.168.1.222)
・Export:マウント先名(/c/proxmox)
・内容:マウント先の使い方を選択(複数選択可、各機能の保存先リストとして認識される)
□→■ディスクイメージ
□→■ISOイメージ
□→■コンテナテンプレート
□→■VZDumpバックアップファイル
□→■コンテナ
□→■スニペット
[データセンタ]-[ストレージ]-[追加]-[iSCSI]
・ID:Proxmoxから見た時の表示名(qnap)
・Portal:iSCSIホストのIP(192.168.1.220)
・ターゲット:上でIP入れると自動的にリストが出てくるので選択
不要なストレージ設定の解除
最後に不要なストレージ(ローカル系とか)の整理・削除を実施
設定上は表示されないがOS上はマウントされているパスを解除した場合
■解除手順
cd /mnt/pve/
ls -la
対象のマウントポイントは nobody nogroup となっている
umount /mnt/pve/xxxxx
対象のマウントポイントは root root に変更されている
rm -R /mnt/pve/xxxxx
各ノードで削除すること
クラスタの作成
[データセンタ]-[クラスタ]-[クラスタを作成]
・クラスタ名:ProxmoxHA
・クラスタネットワーク:既存の管理IP(192.168.1.233)
・追加:必要に応じて追加(ブリッジポートIP)
クラスタに参加
[データセンタ]-[クラスタ]-[クラスタに参加]
・情報:初めにクラスタを作成した方からJoin情報をコピーして貼り付け
・Peerアドレス:初めにクラスタを作成したIPアドレス(192.168.1.233)
・パスワード:初めにクラスタを作成したノードのrootパスワード
・Fingerprint:既定値
・クラスタネットワーク:自身のIPアドレス(192.168.1.236)
・Join 'ProxmoxHA':クリック
【注意点】
クラスタに追加するノード側に既存でVMが存在する場合はエラーとなる
いったんバックアップしてから削除し、クラスタ構築後に元に戻す。クラスタを構成するとお互いに設定されているストレージ情報などが複製されるため時間がかかる。クラスタ化するときは複雑な構成を組む前が望ましい。
また「Join ’ProxmoxHA’」をクリックすると以下の状態からタスクが変化しなくなる。ただし、クラスタの管理(Peer)側では問題なく追加が完了しているので、追加するノード側のWebGUIはここで閉じて大丈夫です。どうやら管理機能がクラスタ側に統合されるので接続していたノード単体のWebGUIのURL機能が停止?するようです。仮に今まで通りノード単体のURL(https://192.168.1.236:8006)で開き直すと「データセンター(ProxmoxHA)」として管理されたWebGUIが開きます。これはすべてのノードURL共通の動きとして機能します。どのノードURLに接続してもクラスタの管理が可能です。
【運用のヒント】
クラスタ共通名でアクセスしたい場合はDNSやロードバランサーを使ってフロントを立てると良いかもしれません。
クラスタ作成時の処理内容
・クラスタへログイン
・APIバージョンの確認
・ノード追加のリクエスト
・クラスタセットアップ
・クラスタサービスの停止
・データベースのバックアップ
・クオーラムのチェック
・ノードファイルの生成
・SSH KEYの統合
・新しいノード証明書の生成およびPVEデーモンサービスの再起動
・クラスタへのノード追加完了
Proxmoxのデータ保管パス情報
※「NAS_Storage」にはNFSマウントした際に設定した[ID名]が入る。
役割毎にパス(ルール)が決まっている。
Proxmoxが扱うフォルダの既定値
/mnt/pve/NAS_Storage/dump/ #バックアップ
/mnt/pve/NAS_Storage/images/<VMID> #VM/CTイメージ
/mnt/pve/NAS_Storage/private/ #CT用
/mnt/pve/NAS_Storage/snippets/ #スニペット
/mnt/pve/NAS_Storage/tempsate/cache/ #VM/CTテンプレートイメージ
/mnt/pve/NAS_Storage/template/iso/ #ISO イメージ
WebGUIを使わずISOイメージを認識させる方法
既存環境で扱っている「ISO イメージ」をSCP等のコマンドでコピーや移動する場合は以下のパスに移動させる。
#scp root@192.168.1.100:~/WindowsOS.iso /mnt/pve/xxxxxx/template/iso/
アクセス権がないので付与
#chmod 777 /mnt/pve/xxxxxx/template/iso
以下のフォルダに保存したファイルは自動認識されるが、全角文字や追加フォルダ等は認識しない。
(例)
###OK### WebGUIからは半角英数でアクセス権が付与されたファイルは見える
/mnt/pve/xxxxxx/template/iso/image1.iso
###NG### WebGUIからは追加ホルダは認識できない
/mnt/pve/xxxxxx/template/iso/Windows/WindowsOS.iso
/mnt/pve/xxxxxx/template/iso/Linux/LinuxOS.iso
###NG### WebGUIから見ると全角文字は文字化け、削除も不可
/mnt/pve/xxxxxx/template/iso/イメージファイル.iso
ISOファイルをアップロード
[データセンタ]-[ノード名]-[xxxxxx]-[ISO イメージ]
※iso用の保存先が複数ある場合は「xxxxxx」を切り替える。「xxxxxx」作成時の内容(用途)として「ISOイメージ」が含まれている必要あり。
「アップロード」をクリックしてisoファイルを選択してアップロードする。
OSのインストール(例:Linux)
[データセンタ]-[ノード]-[右クリック]-[VMを作成]
【全般タブ】
ノード:(ノード名)
VM ID:(任意のユニークな番号)
名前:(インベントリ-ゲスト名)
リソースプール:(任意のプール名)
ブート時に起動:□(配置されたホストの起動に合わせ自動起動)
開始/停止順:any
開始時の遅延:default
シャットダウンタイムアウト:default
タグ:任意
【OS】
CD/DVD イメージファイル(iso)を使用:●
ストレージ:NAS_Storage(ISOイメージ用設定したストレージ名)
ISOイメージ:ubuntu-24.04-live-server-amd64.iso(任意のISO名)
CD/DVD 物理ドライブを使用:〇
メディアを使用しない:〇
ゲストOS:
種別:Linux(任意)
バージョン:6.x-2.6 Kernel(任意)
【システム】
グラフィックカード:既定(任意)
マシン:既定(i440fx)
ファームウェア BIOS:既定(SeaBIOS)(任意)
SCSIコントローラ:VirtlO SCSI single(任意)
Qemuエージェント:□(任意)
TPM追加:□(任意)
【ディスク】
バス/デバイス:SCSI:0(任意)
SCSIコントローラ:VirtIO SCSI single
ストレージ:NAS_Storage(任意)
ディスクサイズ(GiB):200(任意)
形式:QEMU イメージ形式(任意)
キャッシュ:既定(キャッシュなし)(任意)
中止:□
IO thread:■
SSDエミュレーション:□
リードオンリ:□
バックアップ:■
複製をスキップ:□
非同期IO:既定(io_uring)
【CPU】
ソケット:1(任意)
コア:2(任意)
種別:x86-64-v2-AES(任意)
合計コア数:2
VCPUs:1
CPUの上限:無制限(任意)
CPUアフィニティ:すべてのコア
CPUユニット:100(任意)
NUMAを有効化:□
Extra CPU Flags:規定値
【メモリ】
メモリ(MiB):4096(任意)
最小メモリ量(MiB):4096(任意)
共有:既定(1000)
Ballooningデバイス:■
【ネットワーク】
ネットデバイス:□
ブリッジ:vmbr0(任意)
VLANタグ:no VLAN(任意)
ファイアウォール:■
モデル:VirtIO(準仮想化)
MACアドレス:auto
切断:□
MTU:1500(任意 )
Rateの制限値(MB/s):unlimited
Multiqueue:(空欄)
【確認】
作成後に起動:□(任意)
【起動】
[データセンタ]-[ノード]-[ゲスト名]-[右クリック]-[開始]
・起動方法はいつくかある。使い勝手の良い方法を使用する。
ゲストOSの移動(マイグレート)
[データセンタ]-[ノード]-[ゲスト名]-[右クリック]-[マイグレート]
・移動条件などを確認して実行
CPUタイプなどが共通または下位グレード設定に合わせてある
ゲストの格納ストレージパスが同じである
DVD等のメディアパスが共有ストレージにある
ソースノード:移動元ノード(proxmox2)
ターゲットノード:移動先ノード(proxmox1)
モード:オンライン(ゲストが起動状態)
・ゲストメモリ6GBでの移動実績値(管理LAN1Gbps:1分17秒)
ゲストがオンラインの状態で移動するとゲストが使用しているメモリ情報の複製状況が表示される。移動速度は実装メモリとネットワーク速度に影響され変動する。
HAグループの設定(優先ノードを作る)
[データセンタ]-[HA]-[グループ]-[作成]
・ID:グループ名
・restricted:□ #グループメンバー内での制限付き実行
・nofailback:■ #勝手にノードが回復しても元に戻さない
・コメント:(任意)
・ノード:グループに含めるノードに■チェックを入れ、プライオリティを設定(数字が大きい方が優先度高)
ゲストOSをHAグループへ登録
[データセンタ]-[HA]-[リソース]-[追加]
・VM:VMID(ゲスト名ではなくVMIDとなるので注意、選択時に確認可)
・グループ:必要に応じてプライオリティグループを設定(Prio1)
・Max.Restart:1 #ゲストの再起動再試行の最大回数
・Max.Relocated:1 #ゲストの再配置再試行の最大回数
・要求状態:started #状態: <無効 | 有効 | 無視 | 開始 | 停止>
・コメント:(全角は化けるので半角を使うこと)
フェールオーバー後にゲストの自動起動設定
[データセンタ]-[ノード]-[ゲスト]-[オプション]-[ブート時に起動]-[編集]
・ブート時に起動:■
※この設定はHA関係なくゲストのオプションとして設定される。
ホスト起動に紐づいて起動させたい場合に設定しておくと良い。
チェックを入れない場合はフェールオーバーしても再起動しない。
HAホスト障害テスト
①物理的に管理(ブリッジ)LANを抜いてリンクを切断する
②約2分程度でゲストのホスト障害として検知
③正常系のホストで再起動を開始(※「ブート時に起動」にチェック有り)
クラスタへのオマジナイ(ノード1台でもクラスタを機能させる方法)
クラスタ環境を構築した場合、気軽にホストを停止できなくなる。理由はクラスタの正常性を決める仕組みが関係する。クォーラムは既定数のノードが正常に稼働していることを前提にクラスタの正常性を保証するのだが、評価環境や本番での稼働ノード数が少ない中で停止させるとクラスタを維持するための必要な稼働中ノードを確保できないのだ。
この状態が発生するとエラーが出てゲストや場合によってはProxmox自身の※WebGUIシェルも起動しない。ブラウザからはノードの再起動やシャットダウンの操作くらいしか受け付けない。
※物理側のコンソールシェルは問題なく機能する。
これを回避するために以下のコマンドを実行する。
# pvecm status
Cluster information
Name: ProxmoxHA
Config Version: 4
Transport: knet
Secure auth: on
Quorum information
Date: Tue Aug 6 16:42:19 2024
Quorum provider: corosync_votequorum
Nodes: 1
Node ID: 0x00000002
Ring ID: 2.42af
Quorate: No
Votequorum information
Expected votes: 4
Highest expected: 4
Total votes: 1
Quorum: 3 Activity blocked
Flags:
Membership information
Nodeid Votes Name
0x00000002 1 192.168.1.234 (local)
#
「Quorum: 3 Activity blocked」クォーラムがブロックされてることを確認
正直、1台でも動けば起動して欲しい。皆さんも、そう思いません?
以下のコマンドを入力してみてください。
# pvecm expected 1
ここでもう一度クラスタの状態を確認してみます。
# pvecm status
Cluster information
Name: ProxmoxHA
Config Version: 4
Transport: knet
Secure auth: on
Quorum information
Date: Tue Aug 6 16:42:19 2024
Quorum provider: corosync_votequorum
Nodes: 1
Node ID: 0x00000002
Ring ID: 2.42af
Quorate: Yes
Votequorum information
Expected votes: 1
Highest expected: 1
Total votes: 1
Quorum: 1
Flags: Quorate
Membership information
Nodeid Votes Name
0x00000002 1 192.168.1.234 (local)
#
重要なのはここ
Votequorum information
Expected votes: 1
Highest expected: 1
Total votes: 1
Quorum: 1
Flags: Quorate
ノード1台の稼働でクォーラムが正常に機能している。WebGUIに戻ってクラスタを開いてみると唯一稼働中のノード上でゲストが起動または起動可能な状態、ノードのシェルも起動できるようになっていることが確認できる。
これで多少無茶な起動停止をやってもProxmoxで作った仮想環境は機能する。
一時的にクラスタを半数以下の台数で上記コマンドを実行すればOKなのだが・・・あとでわかったのが、あくまでも一時対応であること。このあと半数以上が起動すると元の設定に戻ってしまう。永続的に設定するには以下の設定を行う。
通常クラスタの投票システム上は半数以上の稼働が条件である。4ノード構成なら3ノード以上の稼働。3ノードなら2ノード以上の稼働。式で表すなら「クラスタを構成する全ノード数 * 50% + 1」となる。ここで問題なのが2ノードだったらどうなるのかと言うと「2×1/2+1=2」っと言うことで2ノードの場合停止すると式が成り立たない。この設定を覆すための設定として2ノードの時は「1」でも良いよっと書いておくらしい。
root@proxmox2:~# vi /etc/pve/corosync.conf
quorum {
provider: corosync_votequorum
}
↓↓↓ こちらの記述を追記 ↓↓↓
quorum {
provider: corosync_votequorum
two_node: 1
}
上記の対応でいけるか・・・っと思って試したが駄目だった。再起動してもクラスタに登録したゲストは起動してこなかった。そこで次に試したのがこの方法。
crontab に 「pvecm expected 1」を書いて起動時に自動実行してみる。
# crontab -e
…..
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
@reboot pvecm expected 1
これを全ノードで実行して記述しておいた。これで再起動を試してみると無事に物理ノード1台が停止した状態で残り物理ノード1台を再起動すると起動後に無事にHAクラスタに登録したゲストまで自動起動してきた。期待通りの動きである。