フェールオーバー クラスタの上に高可用性の仮想マシンを作り、ライブ マイグレーション、ノード障害時のフェールオーバー、iSCSI の経路障害の動作を確認する手順です。
この記事の前提
参照した公式ドキュメント
- Create a virtual machine in Hyper-V(Microsoft Learn)
- Add-ClusterVirtualMachineRole(Microsoft Learn)
- Move-ClusterVirtualMachineRole(Microsoft Learn)
- Supported Linux and FreeBSD virtual machines for Hyper-V on Windows Server and Windows(Microsoft Learn)
構成
| 項目 | 内容 |
|---|---|
| クラスタ | HVDOC-CL(DOC-HV1/DOC-HV2/DOC-HV3)。クラスタの作成手順で作成済み |
| 仮想マシンの保存先 | CSV(C:\ClusterStorage\Volume1) |
| 仮想マシン | rocky-hv01(Rocky Linux 9.8、第 2 世代、2 vCPU、メモリ 2 GB、ディスク 20 GB、IP アドレス 192.168.1.127) |
| インストール メディア | Rocky-9.8-x86_64-minimal.iso を C:\ClusterStorage\Volume1\ISO にコピー済み |
ISO を CSV に置くと、仮想マシンがどのノードに移動しても DVD ドライブの ISO を参照できます。ノードのローカル ディスクに置くと、ライブ マイグレーションができなくなることがあります。
高可用性の仮想マシンの作成
クラスタの仮想マシンは、フェールオーバー クラスター マネージャーから作ります。Hyper-V マネージャーで作った仮想マシンは、クラスタに登録するまで高可用性になりません。
(1) ツリーの [Roles] を選び、[Actions] の [Virtual Machines] → [New Virtual Machine] をクリックします。

(2) 仮想マシンを作るノードを選んで [OK] をクリックします。ここでは DOC-HV1 を選びました。新しい仮想マシン ウィザードが開くので、最初のページで [Next] をクリックします。

(3) 名前を入力し、[Store the virtual machine in a different location] をオンにして、[Location] に CSV のパスを入力して [Next] をクリックします。

| 項目 | 設定値 |
|---|---|
| Name | rocky-hv01 |
| Store the virtual machine in a different location | オン |
| Location | C:\ClusterStorage\Volume1\(このフォルダーの下に、仮想マシン名のフォルダーが作られます) |
(4) [Generation 2] を選んで [Next] をクリックします。

(5) [Startup memory] に 2048 を入力して [Next] をクリックします。

| 項目 | 説明 | 設定値 |
|---|---|---|
| Startup memory | 起動時に割り当てるメモリ(MB) | 2048 |
| Use Dynamic Memory for this virtual machine | 使用量に応じてメモリを増減します | オフ |
(6) [Connection] で、仮想マシンをつなぐ仮想スイッチを選んで [Next] をクリックします。管理 LAN(192.168.1.0/24)につながる VMSwitch を選びました。

仮想スイッチは、すべてのノードで同じ名前にしておきます。名前が違うと、ライブ マイグレーションやフェールオーバーで移動できません。
(7) [Create a virtual hard disk] を選び、[Size] に 20 を入力して [Next] をクリックします。保存先は手順 (3) の場所の下(C:\ClusterStorage\Volume1\rocky-hv01\Virtual Hard Disks\)になります。

(8) [Install an operating system from a bootable CD/DVD-ROM] → [Image file (.iso)] を選び、ISO のパスを入力して [Next] をクリックします。

(9) 設定を確認して [Finish] をクリックします。

(10) 仮想マシンが作られると、高可用性ウィザードが自動で実行され、仮想マシンがクラスタの役割として登録されます。[Success] を確認して [Finish] をクリックします。

PowerShell で作成する場合は、次のコマンドです(DOC-HV1 で実行)。
New-VM -Name rocky-hv01 -Generation 2 -MemoryStartupBytes 2GB -Path C:\ClusterStorage\Volume1 -NewVHDPath C:\ClusterStorage\Volume1\rocky-hv01\rocky-hv01.vhdx -NewVHDSizeBytes 20GB -SwitchName VMSwitch
Add-VMDvdDrive -VMName rocky-hv01 -Path C:\ClusterStorage\Volume1\ISO\Rocky-9.8-x86_64-minimal.iso
Set-VMFirmware -VMName rocky-hv01 -SecureBootTemplate MicrosoftUEFICertificateAuthority -FirstBootDevice (Get-VMDvdDrive -VMName rocky-hv01)
Add-ClusterVirtualMachineRole -VMName rocky-hv01
Linux 用のセキュア ブートの設定
第 2 世代の仮想マシンは、既定のセキュア ブートのテンプレートが [Microsoft Windows] で、このままでは Linux のインストーラーが起動しません。
(1) [Roles] で rocky-hv01 を右クリックして [Settings] をクリックします。

(2) [Security] を選び、[Template] を [Microsoft UEFI Certificate Authority] に変更して [OK] をクリックします。

| 項目 | 説明 | 設定値 |
|---|---|---|
| Enable Secure Boot | 署名されたブート ローダーだけを起動します | オン |
| Template | 信頼する証明書。Linux は Microsoft UEFI Certificate Authority を使います | Microsoft UEFI Certificate Authority |
OS のインストール
(1) rocky-hv01 を右クリックして [Start] をクリックし、もう一度右クリックして [Connect] をクリックします。仮想マシン接続(VMConnect)のウィンドウに、インストーラーのメニュー(GRUB)が表示されます。

(2) ここではキックスタートで自動インストールしました。[Install Rocky Linux Minimal 9.8] を選んで [e] キーを押し、linuxefi で始まる行の最後に inst.ks= を追加して、[Ctrl]+[X] で起動します。手動でインストールする場合は、そのまま [Enter] キーを押して、画面の指示に従います。

inst.ks=http://192.168.1.182:8080/rocky-hv01.cfg
GRUB のメニューは 60 秒で既定の項目(Test this media & install)が起動します。カーソル キーを押すと、カウントダウンが止まります。
(3) インストールが終わると再起動し、ログイン画面が表示されます。
(4) Hyper-V のゲスト サービス(KVP・VSS など)のデーモンを入れて、再起動します。KVP が動くと、フェールオーバー クラスター マネージャーの概要に、仮想マシンのコンピューター名や OS の名前(Computer Name・Operating System)が表示されるようになります。
dnf -y install hyperv-daemons
systemctl reboot
systemctl is-active hypervkvpd hypervvssd
hyperv-daemons は minimal の ISO には入っていないので、キックスタートの
%packagesに書くと、インストーラーが「missing packages」で止まります。インストール後にネットワーク経由で入れてください。インストール直後は依存するデバイスがまだないため、systemctl enable --nowは失敗します。再起動すると自動で起動します。
ライブ マイグレーション
稼働中の仮想マシンを、止めずに別のノードへ移します。
(1) rocky-hv01 を右クリックして [Move] → [Live Migration] → [Select Node] をクリックします。[Best Possible Node] を選ぶと、クラスタが移動先を自動で選びます。

(2) 移動先のノード(DOC-HV2)を選んで [OK] をクリックします。

(3) [Status] が [Live Migrating] になり、[Information] に進捗が表示されます。

(4) 完了すると [Owner Node] が DOC-HV2 に変わり、[Status] は [Running] のままです。

PowerShell で実行する場合は、次のコマンドです。
Move-ClusterVirtualMachineRole -Name rocky-hv01 -Node DOC-HV2 -MigrationType Live
画面下の [Up Time] は、ライブ マイグレーションのたびに 0 から数え直されます。ゲスト OS は再起動していません(ゲストの
uptimeは続いています)。
この検証環境での結果です(移動中、別のマシンから 0.2 秒間隔で ping を送り続けました)。
| 項目 | 結果 |
|---|---|
| 所要時間 | 約 70 秒(開始 7:19:02 → 完了 7:20:12。Hyper-V-VMMS のイベント 20413/20415) |
| 停止時間(blackout time) | 1.5 秒(イベント 20415 の記録) |
| ping の欠落 | 1,500 回中 7 回(約 1.4 秒) |
| 使われたネットワーク | LiveMigration(10.20.85.0/24)。イベント 20418 の送信元 IP アドレスで確認 |
クラスタには、ノードの負荷の偏りを見て仮想マシンを自動でライブ マイグレーションする「仮想マシンの負荷分散」があり、既定で有効です(AutoBalancerMode=2、AutoBalancerLevel=1)。この検証でも、作成直後の仮想マシンが DOC-HV1 から DOC-HV3 へ自動で移動しました(イベント 1641 の Move reason が「LoadBalancer」)。意図しない移動を避けたいときは、
(Get-Cluster).AutoBalancerMode = 0で無効にできます。
ノード障害時のフェールオーバー
仮想マシンが動いているノード(DOC-HV2)の電源を強制的に切り、仮想マシンが別のノードで再起動されるかを確認しました。
(1) ノードが停止すると、ツリーの [Nodes] でそのノードが [Down] になります。仮想マシンは残りのノードで自動的に起動します。ここでは DOC-HV1 で起動し、[Up Time] が 0 から数え直されています(ライブ マイグレーションと違い、仮想マシンは再起動されます)。

(2) この検証環境での結果です。
| 設定 | ノードの停止を検知 | 仮想マシンがオンライン | ping が戻るまで |
|---|---|---|---|
| ResiliencyLevel=2(既定) | 約 1 秒 | 約 254 秒後 | 316 秒 |
| ResiliencyLevel=1 | 約 2 秒 | 約 8 秒後 | 70 秒 |
既定の設定では、応答しなくなったノードはすぐには「故障」と判定されず、まず [Isolated](分離)の状態になります。一時的なネットワークの断で仮想マシンを再起動しないように、最大 240 秒(ResiliencyDefaultPeriod)待ってからフェールオーバーします。この検証でも、イベント 1673(分離状態に入った)から 240 秒後にイベント 1682(フェールオーバーした)が記録されました。ping が戻るまでの残りの約 60 秒は、ゲスト OS の起動時間です。
電源断のような障害ですぐにフェールオーバーさせたい場合は、ResiliencyLevel を 1 にします(理由が通知された停止だけを分離状態として扱い、それ以外はすぐにフェールオーバーします)。待ち時間だけを短くする場合は、ResiliencyDefaultPeriod を変更します。
(Get-Cluster).ResiliencyLevel = 1
(Get-Cluster).ResiliencyDefaultPeriod = 60
Get-Cluster | Format-List ResiliencyLevel,ResiliencyDefaultPeriod
設定の意味と既定値は、マイクロソフトの Virtual Machine Compute Resiliency in Windows Server 2016(Microsoft Community Hub) で説明されています。この検証では試験の後に既定の 2 に戻しました。
iSCSI の経路障害
仮想マシンと CSV の両方を持っているノード(DOC-HV2)で、iSCSI-A の NIC のリンクを切りました。
| 確認したこと | 結果 |
|---|---|
MPIO の経路(mpclaim -s -d 0) | 2 本 → 1 本(iSCSI-B の経路だけが Active/Optimized) |
仮想マシンのディスク書き込み(200 MB、dd oflag=direct) | 正常に完了(171 MB/s) |
| CSV と仮想マシンの状態 | どちらも Online のまま |
| リンクを戻した後 | 60 秒以内に自動で 2 本の経路(どちらも Active/Optimized)に戻りました |
経路の確認に使ったコマンドです(ノードの PowerShell で実行)。
mpclaim -s -d 0
Get-NetAdapter -Name iSCSI-A,iSCSI-B