Hyper-V（Windwos Server 2022）でフェールオーバークラスターを構築する

## 概要
これまでVMwareを愛用していたが、初めてHyper-Vも触ってみることにした。手元の環境でクラスター構築を試してみることでVMwareとの違いを理解できるようにしたい。
まずは [MS Learn | HYPER-V テクノロジの概要](https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/hyper-v-technology-overview?source=recommendations) をひととおり読んだところ、vSphereクラスタに相当するものはHyper-Vでは「フェールオーバークラスター」と呼ばれるもののようだったのでこれを構築してみることにする。手順は基本的に公式ドキュメント  [MS Learn | フェールオーバー クラスターを作成する](https://learn.microsoft.com/ja-jp/windows-server/failover-clustering/create-failover-cluster) に沿って行った。

## 環境
- 物理：NUC 7i5BNH
- Hyper-Vホスト：Windows Server 2022
- ADサーバー：Windows Server 2022
- iSCSIサーバー：Rocky Linux9.3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/93313bdb-6988-494a-8623-d4d513d8b3ec.png)

## ①Windows Server 2022 インストール
[Windows Server をダウンロードしてインストールする](https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-server-2022)

Hyper-Vホスト用2台、ADサーバ用1台、計3台の Windows Server 2022 を用意
- 評価版をダウンロード
https://www.microsoft.com/ja-jp/evalcenter/download-windows-server-2022
- インストールするOSは、Datacenter Evaluation（デスクトップエクスペリエンス）を選択
- インストール完了後、ホスト名、IPアドレスを設定

## ②ADサーバー
前提条件として、クラスター ノードとして追加するすべてのサーバーが同じ Active Directory ドメインに参加していることが必要と書かれている。

ありがたいことにActive Directory環境構築について公開してくれている記事がたくさんあり、いろいろ読んだ結果ほぼこの記事を参考にさせていただいた。
https://zenn.dev/yud/articles/f47dddc3321fa8

- 「役割と機能の追加」から Active Directoryドメインサービス を役割追加してインストール
- インストール完了後に「このサーバをドメインコントローラに昇格する」をクリック
    - ルートドメイン名：cluster.lab
    - フォレストの機能レベル： Windows Server 2016（デフォルト）
    - NetBIOS ドメイン名：cluster（自動的にルートドメイン名から作成される）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/ad4f590a-6c18-b01f-68c4-0d6050388361.png)

## ③iSCSI Target
```
//事前にiscsi用ディスクを作成してマウントしておく
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/snip/
/dev/sdb1            210G  1.5G  209G   1% /iscsi

//targetcliパッケージをインストール＆起動
$ sudo dnf install -y targetcli
$ sudo systemctl start target
$ sudo systemctl enable target

//targetcliシェルを起動
$ sudo targetcli

//iscsiディスクイメージを作成
> cd backstores/fileio
> create disk0 /iscsi/disk0.img 1G
> create disk1 /iscsi/disk1.img 100G
> create disk2 /iscsi/disk2.img 100G

//icsiターゲットを作成
> cd /iscsi
> create iqn.2024-04.lab.cluster:target

//LUNを作成
> cd iqn.2024-04.lab.cluster:target/tpg1/luns
> create /backstores/fileio/disk0
> create /backstores/fileio/disk1
> create /backstores/fileio/disk2

//ACLを設定
> cd ../acls
> create iqn.2024-04.lab.cluster:hv-host01
> create iqn.2024-04.lab.cluster:hv-host02
```


## ④Hyper-Vホスト
この記事を参考にさせていただいた。
[Hyper-V Mastery: A Step-by-Step Guide for Beginners to Elevate Your IT Skills and Boost Your Career](https://www.bdrsuite.com/blog/hyper-v-mastery-a-step-by-step-guide-for-beginners/)

1. iscsiターゲットへ接続
https://www.server-world.info/query?os=Windows_Server_2022&p=iscsi&f=3#google_vignette
1. ドメインに参加
https://learn.microsoft.com/ja-jp/windows-server/identity/ad-fs/deployment/join-a-computer-to-a-domain
1. Hyper-Vの役割をインストール
https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/get-started/install-the-hyper-v-role-on-windows-server
1. フェールオーバークラスターを作成
https://learn.microsoft.com/ja-jp/windows-server/failover-clustering/create-failover-cluster

iscsiターゲット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/162842a6-85b0-40d1-47d0-6a4652289a96.png)

フェールオーバークラスター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/065a90bb-b5fa-039d-1442-c00ad8513409.png)

## 動作確認
1. [Hyper-Vで仮想マシンを作成する](https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/get-started/create-a-virtual-machine-in-hyper-v?tabs=hyper-v-manager)

1. ライブマイグレーションの動作確認

このあとHA、DRS、Storage Live Migration、Snapshot、Resource Pool、RBAC、等についてもVMwareとの機能の違いを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/36b78e8f-95ea-c93d-865e-680257ddca23.png)

## 今回初めて知ったこと
#### Hyper-Vの構成
> Hyper-V は Windows Server にインストールされる役割であり、Windows クライアント オペレーティング システムで有効になる機能であるため、多くの人が誤って Hyper-V をタイプ 2 ハイパーバイザーと認識しています。
> 
> ただし、Windows Server および Windows クライアント オペレーティング システムで Hyper-V が有効になると、Microsoft はいくつかの「魔法」を実行します。Hyper-V は基盤となるオペレーティング システムとしてインスタンス化され、Windows よりも前に開始されます。Windows Server およびクライアント オペレーティング システムは、Hyper-V の管理オペレーティング システムになります。そのため、オペレーティング システムの「上」にインストールされるのではなく、Windows オペレーティング システムの「下」にインストールされ、ベアメタル パフォーマンスを実現できます。
[Hyper-V Mastery: A Step-by-Step Guide for Beginners to Elevate Your IT Skills and Boost Your Career](https://www.bdrsuite.com/blog/hyper-v-mastery-a-step-by-step-guide-for-beginners/)

MS公式でもこのように書かれている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/db2e44a8-dbe2-7c0f-d288-11ea4a8b54fc.png)

#### Windows Server Core
Windows Server はGUI画面から操作するのがなんとなく嫌だなと思っていたが、Windows Server Core というコマンドラインのみのインストールオプションが使用できる。
> [Windows Server の Server Core インストール オプションとは](https://learn.microsoft.com/ja-jp/windows-server/administration/server-core/what-is-server-core)
> Server Core のインストールでは、一般的に使用される特定のサーバー ロールのサポートに不可欠ではないサービスや他の機能が排除されます。 たとえば、Hyper-V サーバーにはグラフィカル ユーザー インターフェイス (GUI) は必要ありません。これは、Windows PowerShell を使用してコマンド ラインから、または Hyper-V マネージャーを使用してリモートから Hyper-V の事実上すべての側面を管理できるからです。

~~今回はDatacenter Evaluation（デスクトップエクスペリエンス）を使用したが、次回はデスクトップエクスペリエンス無しのWindows Server Coreエディションを使ってGUIではなくすべてPowerShellで構築することを試したい。~~ 

## 追記）Windows Server Coreエディションを用いてCLIで構築する
- 改めてiSCSIにLUNを2個追加
- GUIではなくCLIでフェールオーバークラスターを構築
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/534f1345-8e4f-bbb0-cb97-79767c846843.png)

### Hyper-Vホスト用のWindows Server 2022インストール
デスクトップ無しのWindows Server Coreを使用。同様の手順でhv-host05、hv-host06の2台分をVM作成した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/13e3227c-8313-6129-14b4-0be075482125.png)

### 初期設定
まず最初にネットワーク設定、ホスト名設定をコンソールから設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/6db64bc4-9984-862c-c959-73f16b6b5732.png)

### WinRM設定
以降の設定はWinRMでリモート操作できるようにする。今回はADサーバをWinRM接続元として使用した。
```
//信頼済みホストを登録
$RemoteIP = "192.168.11.71"
Set-Item WSMan:\localhost\Client\TrustedHosts -Value ${RemoteIP}

//WinRM接続
$LoginName = "Administrator"
Enter-PSSession -ComputerName ${HVHOST05_IP} -Credential ${LoginName}
```
### ADのドメインに参加
hv-host05、hv-host06それぞれで実施
```
//参照するDNSをAD DSへ変更
$InterfaceName1 = "Ethernet0"
$DNSServerAddress1 = "192.168.11.63"
Set-DnsClientServerAddress -InterfaceAlias ${InterfaceName1} -ServerAddresses ${DNSServerAddress1} -PassThru

//ドメイン参加
$Domain = "cluster.lab"
$Cred = Get-Credential
Add-Computer -DomainName ${Domain} -Credential ${Cred}

//再起動
Restart-Computer -Force
```

### iSCSIターゲットに接続
hv-host05、hv-host06それぞれで実施
```
//iSCSIサービスを起動して、自動起動を有効にする
Start-Service -Name MSiSCSI
Set-Service -Name MSiSCSI -StartupType Automatic

//イニシエーター名を変更
$InitiatorNodeAddress = (Get-InitiatorPort).NodeAddress
Set-InitiatorPort -NodeAddress $InitiatorNodeAddress -NewNodeAddress iqn.2024-04.lab.cluster:hv-host05

//イニシエーター名が変更されたことを確認
Get-InitiatorPort

//iSCSIターゲットポータルを探索
$iscsi_target_ip = "192.168.11.65"
New-IscsiTargetPortal -TargetPortalAddress ${iscsi_target_ip}

//iSCSIターゲットに接続
$iscsi_initiator_ip = "192.168.11.71"
$TargetNodeAddress = (Get-IscsiTarget).NodeAddress
Connect-IscsiTarget -NodeAddress $TargetNodeAddress -TargetPortalAddress ${iscsi_target_ip} -InitiatorPortalAddress ${iscsi_initiator_ip} -IsPersistent $True -IsMultipathEnabled $True

//iSCSIターゲットに接続できたことを確認
Get-IscsiConnection
```

### iSCSIディスクをオンライン化＋GPTで初期化＋NTFSでフォーマット
オンライン化はそれぞれのホストで実施するが、初期化＋フォーマットはhv-host05のみで行う。
```
//iSCSIディスクを確認
Get-Disk | Format-Table -AutoSize -Wrap
Number Friendly Name       Serial Number                        HealthStatus OperationalStatus Total Size Partition Sty
                                                                                                          le
------ -------------       -------------                        ------------ ----------------- ---------- -------------
1      LIO-ORG disk0       5227045a-a551-4775-aed8-4118b740ce03 Healthy      Offline                 1 GB GPT
2      LIO-ORG disk1       206d181c-a544-449c-8f34-bf454a45f5bb Healthy      Offline               100 GB GPT
3      LIO-ORG disk2       70d55255-b124-4aac-84f9-b7e944f320b8 Healthy      Offline               100 GB GPT
4      LIO-ORG disk3       e9a712e5-9497-42a0-bccd-ef40bdb75026 Healthy      Offline                 1 GB RAW
5      LIO-ORG disk4       c55f0ac9-e14c-4b93-b108-d1609d52f4d9 Healthy      Offline               100 GB RAW
0      VMware Virtual disk 6000c29cac1c027b3f8b6b4a88afd231     Healthy      Online                 90 GB GPT

//ディスクをオンラインにする（今回はdisk3, disk4を対象）
Set-Disk -Number 4 -IsOffline $False
Set-Disk -Number 5 -IsOffline $False

//ディスクをGPTで初期化する（今回はdisk3, disk4を対象）
Initialize-Disk -Number 4 -PartitionStyle GPT
Initialize-Disk -Number 5 -PartitionStyle GPT

//ドライブレターは割当てず、パーティションを作成（今回はdisk3, disk4を対象）
New-Partition -DiskNumber 4 -UseMaximumSize
New-Partition -DiskNumber 5 -UseMaximumSize

//NTFSでフォーマット
$Partition4_2 = Get-Partition -DiskNumber 4 -PartitionNumber 2
Format-Volume -Partition ${Partition4_2} -FileSystem NTFS -Force
$Partition5_2 = Get-Partition -DiskNumber 5 -PartitionNumber 2
Format-Volume -Partition ${Partition5_2} -FileSystem NTFS -Force

//ボリュームの情報を確認
Get-Volume | Format-Table -AutoSize -Wrap
DriveLetter FriendlyName          FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining       Size
----------- ------------          -------------- --------- ------------ ----------------- -------------       ----
                                  NTFS           Fixed     Healthy      OK                    115.21 MB     599 MB
                                  NTFS           Fixed     Healthy      OK                     99.89 GB   99.98 GB
                                  FAT32          Fixed     Healthy      OK                     68.25 MB      96 MB
                                  NTFS           Fixed     Healthy      OK                    991.06 MB 1007.93 MB
C                                 NTFS           Fixed     Healthy      OK                     82.26 GB    89.3 GB
D           SSS_X64FREE_JA-JP_DV9 Unknown        CD-ROM    Healthy      OK                          0 B    4.85 GB
```

### Hyper-Vインストール・設定
hv-host05、hv-host06それぞれで実施
```
//Hyper-Vの役割をインストール
$ComputeName = $env:computername | Select-Object
Install-WindowsFeature -Name Hyper-V -ComputerName ${ComputeName} -IncludeManagementTools -Restart

//インストール後に再起動が行われるので、再起動後に改めてWinRMで接続して確認
$ComputeName = $env:computername | Select-Object
Get-WindowsFeature -ComputerName ${ComputeName}

//仮想スイッチ作成
$NetAdapterName = (Get-NetAdapter).Name
$VMSwitchName = "vsw"
New-VMSwitch -Name ${VMSwitchName}  -NetAdapterName ${NetAdapterName}

//仮想スイッチを管理 OS と共有
Set-VMSwitch -Name ${VMSwitchName} -AllowManagementOS $true
```

### フェールオーバークラスターを作成
インストールはそれぞれのホストで実施する。クラスタ検証テスト・作成はいずれかのホストで実施すればよい。
```
//インストール
Install-WindowsFeature Failover-Clustering -IncludeManagementTools

//クラスタ検証テストを実行　＃クラスタの検証テスト・クラスタ作成はWinRMで実行しようとすると、直接コンソールで実行せよというエラーが出るので仕方なくコンソールで実施した
Test-Cluster -Node "hv-host05", "hv-host06"

//クラスタ作成
$ClusterVipAddress = "192.168.11.73"
New-Cluster –Name MyCluster –Node "hv-host05", "hv-host06" –StaticAddress ${ClusterVipAddress}

//クラスターノードの確認
Get-ClusterNode
Name      State Type
----      ----- ----
hv-host05 Up    Node
hv-host06 Up    Node

//クラスターリソースの確認
Get-ClusterResource
Name                        State  OwnerGroup ResourceType
----                        -----  ---------- ------------
Virtual Machine Cluster WMI Online クラスター グループ Virtual Machine Cluster WMI
クラスター IP アドレス               Online クラスター グループ IP Address
クラスター ディスク 1                Online クラスター グループ Physical Disk
クラスター ディスク 2                Online 使用可能記憶域    Physical Disk
クラスター名                      Online クラスター グループ Network Name
```

### クラスターディスクを「クラスターの共有ボリューム（CSV）」として構成する
いずれかのホストで実施
```
//クラスター共有ボリューム（CSV）へ
Add-ClusterSharedVolume -Name "クラスター ディスク 2"

//確認
Get-ClusterResource | where {$_.ResourceType -eq "Physical Disk"} | fl *
OperationalStatus     : OK
HealthStatus          : Healthy
DriveType             : Fixed
FileSystemType        : CSVFS_NTFS
DedupMode             : NotAvailable
ObjectId              : {1}\\Mycluster\root/Microsoft/Windows/Storage/Providers_v2\WSP_Volume.ObjectId="{8d1593d6-2f75-
                        4bba-b483-4f72f42354b9}:VO:\\?\Volume{82a9ad71-2a98-4efb-b6a3-4e7c36d79786}\"
PassThroughClass      :
PassThroughIds        :
PassThroughNamespace  :
PassThroughServer     :
UniqueId              : \\?\Volume{82a9ad71-2a98-4efb-b6a3-4e7c36d79786}\
AllocationUnitSize    : 4096
DriveLetter           :
FileSystem            : CSVFS
FileSystemLabel       :
Path                  : \\?\Volume{82a9ad71-2a98-4efb-b6a3-4e7c36d79786}\
Size                  : 107356352512
SizeRemaining         : 107239075840
PSComputerName        :
CimClass              : ROOT/Microsoft/Windows/Storage:MSFT_Volume
CimInstanceProperties : {ObjectId, PassThroughClass, PassThroughIds, PassThroughNamespace...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties
```

フェールオーバークラスターはこれで作成完了

## Windows Admin Centerを使ってみる
Hyper-Vマネージャー、フェールオーバークラスタマネージャーは昔ながらの画面だったが、これから新たに使い始めるのならWindows Admin Centerのほうがモダンな画面で操作性も良さそうだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/e96b0ed0-34d6-4bac-d665-77eb44031347.png)

### Windows Admin Centerインストール
今回はWindows10 PCへインストールすることとした。[ダウンロードサイト](https://www.microsoft.com/ja-jp/windows-server/windows-admin-center) からダウンロードしてインストール。

### Windows Admin Center へサーバー追加
＋追加 >> サーバー　>>追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/aa8a03a3-8977-103b-c1bf-5649e7490c48.png)

サーバー名を入力、「この接続では別のアカウントを接続する」 >> ユーザー名/パスワードを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/5730ea0b-d0f0-40d1-6fdc-9ae389bad58d.png)

hv-host05、hv-host06の2台を追加できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/df96d026-15fa-9da6-5f07-73a72d9d2fe5.png)

各ホストの設定やパフォーマンスをモニタできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/7713c40a-ada9-b8c2-5e28-0795698e73a5.png)