Proxmox 2ノードクラスタのquorum問題を Oracle Cloud Always Free で月額0円で解決した話
- 自宅Proxmox 2ノードクラスタで頻発する
cluster not ready - no quorum? (500)を解決したい - QDevice(投票専用の第3の仲裁役)を導入すれば根本解決するが、常時稼働の物理マシンを追加するのは面倒
- Oracle Cloud Always Free の東京リージョンにQDeviceを置けば、月額0円・低レイテンシで安定運用できる
- 構築時にハマりやすいポイント(iptables、NSG、Security List の三重ファイアウォール)を整理
背景:2ノードクラスタの脆さ
Proxmox VE をホームラボで運用していると、ノード数は2台になりがち。
- Proxmox-A: Ryzen 5 5500 の自作機
- Proxmox-B: N150 搭載の Mini PC
この構成で片方をメンテのために落とす、あるいは電源トラブルで片方が落ちると、こんなエラーが出る。
cluster not ready - no quorum? (500)
VMの起動・停止、設定変更、あらゆる書き込みが弾かれる状態。
なぜこうなるか
Proxmoxは corosync + votequorum でクラスタメンバー間の合意形成をしている。過半数(quorum)が取れないと安全側に倒して書き込みを止める設計。
2ノード構成では合計2票。過半数=2。片方が落ちると1票しか集まらず、quorum喪失で全ノード書き込み停止。
応急処置:pvecm expected 1
pvecm expected 1
期待ノード数を1に下げて一時的にquorate扱いにできる。ただしsplit-brainリスクがあるので、もう片方が完全に死んでる確信がある時だけ。
恒久化する場合:two_node: 1
/etc/pve/corosync.conf の quorum セクションに以下を追加。
quorum {
provider: corosync_votequorum
two_node: 1
wait_for_all: 0
}
two_node: 1 は「2ノード構成では常に片方だけで quorate 扱い」という特別モード。wait_for_all: 0 で起動時に両ノード揃うのを待たない。
編集後は totem セクションの config_version を +1 する必要がある。
two_node: 1 の弱点
これは fencing 前提の設計。fencingなしで両ノード生きたままcorosync断(スイッチ障害等)が起きると、両側が自分をquorateと判断しsplit-brainが発生する。
同じVMが両ノードで同時起動→共有ストレージ破壊、みたいな事故につながる。ローカルディスク運用なら実害は少ないが、気持ちよくはない。
根本解決:QDevice の導入
QDevice は投票専用の「審判」。VMは動かさない、Proxmoxクラスタにも参加しない、ただ票を持つだけ。
構成
Proxmox-A: 1票
Proxmox-B: 1票
QDevice: 1票
------------------
合計: 3票
過半数: 2票
片方のノード + QDevice が生きてれば 2/3 で quorate 維持。VM操作も設定変更も普通にできる。
split-brainも防げる
例:スイッチ障害でA↔B間が切れた場合。
- A: 自分(1) + QDevice(1) = 2票 → quorate、稼働継続
- B: 自分(1)のみ = 1票 → non-quorate、書き込み停止
QDeviceに繋がった側だけが生き残るので、両側同時稼働の事故が起きない。
3台目に必要なもの
- 常時稼働
- 両Proxmoxノードとネットワーク疎通
- Debian/Ubuntu系で
corosync-qnetdが動くこと - スペックはほぼ何でもOK。RasPi Zero 2W でも足りる
なぜ Oracle Cloud か
RasPiを買い足すのは一つの正解。ただし:
- 買う手間、消費電力、置き場所
- 自宅の停電・回線障害で本体もQDeviceも同時に落ちる
Oracle Cloud Always Free なら:
- 月額 0円、期限なし
- AMD VM: 1/8 OCPU + 1GB RAM × 2台まで無料
- 東京リージョンあり(Sendaiから20ms程度)
- 自宅とは電力・回線が独立
-
corosync-qnetd程度なら1GB RAMで余裕
デメリット
- アカウント審査が厳しめ(クレカ登録必要、稀に弾かれる)
- Ephemeral IPは Terminate で消える(Reserved IPに切り替え可能)
- 「Always Free」でも極端な長期未使用インスタンスは削除される可能性あり
自宅回線障害時の挙動
自宅の上り回線が死ぬとQDeviceと切断されるが、両ノードは自宅内で互いに見えているため、ffsplit アルゴリズム下では quorate 維持できる(両ノード生存 + QDevice切断は通常quorate維持)。
片ノード停止 + 回線障害の複合ケースだけnon-quorateになるが、実用上ほぼ問題なし。
構築手順
1. Oracle Cloud インスタンス作成
Oracle Cloud にサインアップし、以下の構成でインスタンスを作成。
- ホームリージョン: Japan East (Tokyo) ← 後から変更不可
- Image: Canonical Ubuntu 24.04
-
Shape:
VM.Standard.E2.1.Micro(Always Free eligible) - Networking: VCN新規作成、Public Subnet、Public IPv4 自動割り当てON
-
SSH keys: Proxmox側の
/root/.ssh/id_rsa.pubを貼り付け
インスタンス作成時に「Automatically assign public IPv4 address」のチェックを忘れると後付けが必要になるので注意。
2. Oracle側で corosync-qnetd をインストール
ssh -i ~/.ssh/id_ed25519 ubuntu@<public_ip>
sudo apt update
sudo apt install -y corosync-qnetd
sudo systemctl enable --now corosync-qnetd
LISTEN確認:
sudo ss -tlnp | grep 5403
*:5403 で待ち受けていればOK。
3. 三重ファイアウォールの罠
これがOracle Cloud最大のハマりどころ。3層のファイアウォール全部通す必要がある。
3-1. OS側 iptables
Ubuntu on Oracleはデフォルトで22以外を全部塞いでいる。しかもREJECTルールが途中に挟まっているので位置に注意。
sudo iptables -L INPUT -n --line-numbers
こうなっているはず:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
5番目のREJECTが全部弾いてしまう。5403のACCEPTはREJECTより上に差し込む必要がある。
sudo iptables -I INPUT 5 -m state --state NEW -p tcp --dport 5403 -j ACCEPT
sudo netfilter-persistent save
-I INPUT 5 = 5番目に挿入(REJECTの前に押し込む)。
netfilter-persistent save を忘れると再起動で消えるので必ず。
3-2. VCN Security List
Oracle Cloudコンソール:
Networking > Virtual Cloud Networks > 該当VCN > Subnets > 該当Subnet > Security Lists > Add Ingress Rules
- Source Type: CIDR
- Source CIDR:
<自宅グローバルIP>/32(動作確認は0.0.0.0/0でもOK) - IP Protocol: TCP
- Destination Port Range:
5403
3-3. Network Security Group (NSG)
ここが一番の落とし穴。Quick Actionsで「Connect public subnet to internet」を使うと ig-quick-action-NSG が自動で作られてVNICに紐付けられている場合がある。
Compute > Instances > 該当インスタンス > Attached VNICs > VNIC名クリック > Network Security Groups 欄
ここに何か表示されていたら、そのNSGにも5403を追加する必要がある。
NSGを開いて Security Rules > Add Rules:
- Direction: Ingress
- Source Type: CIDR
- Source CIDR:
0.0.0.0/0 - IP Protocol: TCP
- Destination Port Range:
5403
Security ListとNSGは両方を通過する必要がある。片方だけ開けても通らない。
疎通テスト
Proxmoxから:
timeout 5 bash -c '</dev/tcp/<oracle_public_ip>/5403' && echo OK || echo FAIL
OK になるまでは以下を疑う:
- Oracle側 iptables に5403のACCEPTがREJECTより上にあるか
- Security ListのIngress Rulesに5403があるか
- VNICに紐付いてるNSGにも5403があるか
- Public IPが変わっていないか
4. Proxmox側で QDevice 登録
両ノードに corosync-qdevice パッケージをインストール。
apt install -y corosync-qdevice
pvecm qdevice setup はrootでssh接続しに来るので、Oracle側の /root/.ssh/authorized_keys にProxmox両ノードの /root/.ssh/id_rsa.pub を追記しておく。
Oracle Ubuntuのデフォルトでは /root/.ssh/authorized_keys に「rootではなくubuntuでログインしろ」という警告エントリが入っているが、下に自分の鍵を追記する形でOK(上書きしない)。
sudo chmod 600 /root/.ssh/authorized_keys
sudo chown root:root /root/.ssh/authorized_keys
Proxmoxからrootでssh接続テスト:
ssh root@<oracle_public_ip>
通ればsetup実行:
pvecm qdevice setup <oracle_public_ip>
5. 動作確認
pvecm status
期待される出力:
Expected votes: 3
Total votes: 3
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000001 1 A,V,NMW 192.168.0.101 (local)
0x00000002 1 A,V,NMW 192.168.0.120
0x00000000 1 Qdevice
- A = Alive
- V = Voting(NVから昇格していること)
- NMW = Not Master Wins(通常運用フラグ)
動作テスト
Proxmox-A(片方)をシャットダウンして、Proxmox-B から:
pvecm status
Nodes: 1
Total votes: 2 ← 自分(1) + Qdevice(1)
Quorum: 2
Quorate: Yes
Flags: Quorate Qdevice
片ノード停止でも quorate 維持。VM操作継続可能。
従来との比較
| 状況 | 旧構成 (two_node) | 新構成 (QDevice) |
|---|---|---|
| 両ノード生存 | Quorate | Quorate |
| 片ノード停止 | Quorate(fencingなしだと危険) | Quorate(安全) |
| ノード間切断 | 両側 Quorate → split-brain | Qdevice繋がった側のみ Quorate |
後片付け
Oracle側 root ssh 無効化
Setup完了後はrootログインを閉じる。
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sudo systemctl restart ssh
sudo passwd -l root
prohibit-password = 鍵ならOK、パスワード不可。/root/.ssh/authorized_keys に入れたProxmoxの公開鍵は残しておくと、将来の再setup時にも使える。
5403 のアクセス元を絞る
セキュリティ向上のため、NSGとSecurity Listの5403 Ruleの Source を 0.0.0.0/0 から <自宅IP>/32 に変更。
自宅IPが動的なら 0.0.0.0/0 のままでも実質OK(qnetd-qdevice間はTLS証明書認証)。
インスタンスの生存活動
Oracle Cloud Always Freeは「長期未使用」判定で削除される可能性がある。corosync-qnetdが常時通信しているので基本問題ないはずだが、心配なら軽く負荷をかけるcronを仕込んでおくと安心。
まとめ
- Proxmox 2ノードクラスタの
no quorumエラーは QDevice で根本解決できる - QDeviceは Oracle Cloud Always Free に置けば月額0円
- 東京リージョンならレイテンシも十分低い
- Oracle Cloudの三重ファイアウォール(iptables / Security List / NSG)を全部通すのが要点
- 特にNSGは見落としがち。VNIC詳細ページで確認すること
構築後は Total votes: 3 で安定稼働。片ノードを気軽に落とせるようになって、メンテナンスの精神的負担が激減した。
構成図
Proxmox-A (Ryzen 5500) ─┐
├─ corosync ring (LAN)
Proxmox-B (N150) ─┘
│
└─ TCP 5403 (TLS) ─→ Oracle Cloud (Tokyo, Always Free)
corosync-qnetd