1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Proxmox 2ノードクラスタのquorum問題を Oracle Cloud Always Free で月額0円で解決した話

1
Posted at

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 になるまでは以下を疑う:

  1. Oracle側 iptables に5403のACCEPTがREJECTより上にあるか
  2. Security ListのIngress Rulesに5403があるか
  3. VNICに紐付いてるNSGにも5403があるか
  4. 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

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?