概要
AzureでWindows Server Failover Clusterを組むにはAzure Loadbalancerが必要です。
背景
普通にFailover Clusterを組んだところ、クラスター化した役割にアクセスできない問題が起きたので調べました。


やりかた
事前準備
2ノードクラスターにするのでクォーラムを用意します。
Azureではストレージアカウントをクォーラムにする機能などがあって便利なのですが、手っ取り早いのは共有ディスクを使う方法です。
Azure Portalでマネージドディスクを作ります。
共有ディスクを有効にするにはStandard SSD以上でないといけないので、サイズに[Standard SSD]を指定します。データを保存する訳ではないので容量は”1GB”で十分です。

[詳細]タブで[共有ディスクを有効にする]で[はい]を選択します。
最大共有数はマウントできるVMの数なので、クラスターノード数に合わせて増減させてください。

作成したディスクをクラスターノードの仮想マシンにデータディスクとしてマウントします。
Failover Clusterの作成
クラスターノードのドメイン参加や役割の追加は適当に済ませてください。
フェイルオーバークラスターマネージャーを起動します。
[クラスターの作成]をクリックします。

ウィザードを適当に進めます。


[使用可能な記憶域をすべてクラスターに追加する]のチェックは外します。
このチェックを入れると、どのデータディスクがクォーラムディスクとして扱われるか指定できません。

クォーラム監視の構成
クラスターが作成できたらクォーラムの設定をします。
まずはクォーラムとして使うディスクをクラスター記憶域として追加します。
作成したクラスターを選択し、[記憶域]-[ディスク]をクリックします。
[ディスクの追加]をクリックします。

クォーラムとして使うディスクにチェックを入れて[OK]をクリックします。

[使用可能記憶域]としてディスクが表示されれば成功です。

クラスターを選択し、[他のアクション]-[クラスタークォーラム設定の構成]をクリックします。

[クォーラム監視を選択する]を選択します。

[ディスク監視を構成する]を選択します。

追加したクォーラムディスクを選択します。

残りは適当にウィザードに従って進めれば構成完了です。

役割の作成
今回はファイルサーバーのクラスター化された役割を作成します。
必要に応じて読み替えてください。
サーバーマネージャからファイルサーバーの役割を追加します。
Azureポータルからファイルサーバーで使う用の共有ディスクを作成してマウントします。
[役割の構成]からクラスター化された役割を追加します。
[ファイルサーバー]を選択します。

[汎用ファイルサーバー]を選択します。

クライアントアクセスポイント名を入力します。

ファイルサーバーで使用するディスクを選択します。

設定内容を確認して構成します。

ここまでで背景と同じ状況になります。
Azure LoadBalancerを作成する
オンプレのフェイルオーバークラスターとは違いAzureではLoadBalancerが必要です。
Azure PortalからAzure LoadBalancerを作成します。
クラスター用なので[種類]は[内部]です。

フロントエンドIPに[静的]でクラスターのクライアントアクセスポイントのIPアドレスを入力します。
(仮想ネットワークの範囲で任意に決めていい)

バックエンドプールにクラスターノードの仮想マシンのNICを選択する。

インバウンドの負荷分散規則を追加します。
[フロントエンドIPアドレス]と[バックエンドプール]に前手順で作成したそれぞれを選択します。
[ポート]と[バックエンドポート]にはクライアントがクラスター化された役割へアクセスする時のポートを入力します。今回はファイルサーバーなのでTCPの445(SMB)を入力しています。
[正常性プローブ]には[TCP]の”59999″を入力します。

残りはデフォルトのまま進めてもらえば大丈夫です。
クラスター側でLoad Balancerの設定をする
クラスターノードでPowerShellを起動し、次の操作を実行します。
どちらか片方のノードで実行すれば大丈夫です。
# クラスターネットワーク名を調べます
Get-ClusterNetwork
# "Cluster Network 1" などがクラスターネットワーク名
# クラスターIP名を調べます
Get-ClusterResource
# "IPアドレス 10.213.0.0"などがクラスターIP名
# 全角文字とスペースを含むのでコピーするのであれば範囲に気をつける。間違えそうであれば変数に入れて参照してもいい。
# クラスターIPリソースの設定をする
Get-ClusterResource <クラスターIP名> | Set-ClusterParameter -Multiple @{"Address"="<クラスター用IPアドレス>";"ProbePort"=59999;"SubnetMask"="255.255.255.255";"Network"="<クラスターネットワーク名>";"EnableDhcp"=0}
# サブネットマスクの255.255.255.255は間違いではないので修正しない

フェイルオーバークラスターマネージャーからクラスターIPリソースを確認し、次のようになっていれば成功です。

最後に役割を再起動します。
Windows Firewallの設定
Azure LoadBarancerからクラスターノードへの通信を許可します。
今回例だとTCPの59999と445です。
動作確認
クラスターノード以外のホストからクラスター化された役割にアクセスできるか
おまけ
次のようなことが起きていたらだいたいロードバランサーまわりで失敗しています。
- クラスターのアクティブノードからであれば役割にアクセスできる
- スタンバイノード、もしくは別のホストからは役割にアクセスできない
コメント