Proxmox VE環境でとりあえずUPSでサーバ停止する場合についてのメモ
cephについてはもっと面倒なので今回は考慮しない
面倒な点
・HAを有効にした仮想マシンは停止しても再起動してくる
→ 仮想マシンをHA対象外にする必要がある
・仮想マシンを一時的にHA対象外にする、という設定はない
→ 恒久的な設定変更として 仮想マシンを HA対象外にする必要がある
&再起動したあと 仮想マシンを HA対象内にする必要もある
・PVEサーバ上で仮想マシンを動作している状態でメンテナンスモード有効にすると仮想マシンの操作が何もできなくなる
→ 動いてる仮想マシンをほかのサーバに移動する操作を自動でやってくれない
・HA対象仮想マシンの設定は /etc/pve/ha/resources.cfg にされるが変更するためのコマンド/APIはv8.3時点では用意されていない
→ テキストファイルを編集する必要がある
&/etc/pve 以下は PVEクラスタ内で共有されているファイルなので編集競合に注意
・起動時にすぐにPVEクラスタのマスターが決まるわけではない
→ 起動後、マスターが決まるまで待機する?(どうやってマスターが決まったかを判定するか?)
ひとまずな実装方針
停止時の流れとしては以下
1) PVEマスターで現在の /etc/pve/ha/resources.cfg を保存
2) PVEマスターで /etc/pve/ha/resources.cfg を書き換え
3) 稼働している仮想マシン/コンテナを停止
4) PVEサーバをメンテナンスモードに切り替える?
5) シャットダウン実行
起動時の流れとしては以下
1) 起動開始
2) 全PVEサーバで PVEクラスタが稼働するまで処理待機
3) PVEマスターで バックアップしてあった /etc/pve/ha/resources.cfg を戻す
4) PVEサーバをメンテナンスモードから解除?
5) resources.cfgの記述に従って仮想マシン/コンテナが起動?
UPSSの出してるシャットダウンボックス UPSS-SDB04 でproxmox検証結果出てるけど、どんな実装にしてんだろ?
未確認の実装例
とりあえず、まだ未検証の実装サンプル
停止時に実行する処理
停止処理について
HAのリソースに仮想マシンが登録されていないと ha-manager statusの結果は「quorum OK」のみとなる。このスクリプトではha-manager statusの際に「master ホスト名 (ステータス)」という出力がある場合=HA設定されている場合のみ設定ファイルの退避を行っている
HA設定されている場合、resources.cfgのステータスがstoppedに書き換えられると、仮想マシンが停止される
#!/bin/bash
# 仮想マシンの状態を確認する関数
check_vms_status() {
# 実行中の仮想マシンIDを取得
running_vms=$(qm list | grep running | awk '{print $1}')
if [ -z "$running_vms" ]; then
echo "すべての仮想マシンが停止しています。"
return 0 # すべて停止している場合
else
echo "以下の仮想マシンが実行中です: $running_vms"
return 1 # 実行中の仮想マシンがある場合
fi
}
# PVEマスター名を取得
mastername=$(ha-manager status | grep 'master' | awk '{print $2}')
# マスターでのみ実行する処理
if [ W$mastername == W`hostname` ];
then
# resources.cfg のバックアップ作成
cp /etc/pve/ha/resources.cfg /etc/pve/ha/resources.cfg.upstmp
# 書き換えによりHA対象仮想マシンは停止が実行される
sed -i 's/started/stopped/' /etc/pve/ha/resources.cfg
# HAに含まれない仮想マシンに対する停止
for hostname in `pvesh ls /nodes/|awk '{ print $2 }'`
do
for vmid in `pvesh ls /nodes/$hostname/qemu/|awk '{ print $2 }'`
do
pvesh create /nodes/$hostname/qemu/$vmid/status/shutdown
done
done
else
# マスタサーバ以外は処理を遅延
sleep 10
fi
# 仮想マシンが停止しているかを確認する
check_vms_status
status=$?
while [ $status -ne 0 ]
do
echo "仮想マシンがまだ実行中です。再確認します..."
sleep 5
check_vms_status
status=$?
done
# すべての仮想マシンが停止している場合、メンテナンスモードに移行
echo "Proxmoxサーバをメンテナンスモードにします..."
ha-manager crm-command node-maintenance enable `hostname`