先週の Ignite のタイミングで Azure Service Fabric for Windows Server がひっそりと GA していたので、自宅用に Intel NUC を買って Service Fabric Cluster を構築してみました。
Service Fabric で遊びたくてもローカルクラスターだと面倒なのと、Azure にクラスターを作成すると最低 5 インスタンス必要なので課金的な意味で大変です。
本来なら 4 コアの CPU が欲しかったですが、Skylake 世代だと NUC6i7KYK になってしまうので、妥協して Core i5 の 2 コアを選びました。その代わりにメモリは 32GB にして、SSD も NVMe なものを選びました。
とりあえず試したかったので Windows Server 2016 ではなく、Windows Server 2012 R2 を選びました。2016 が MSDN からダウンロード出来るようになれば入れなおします。
ちゃんと 32GB のメモリを認識しています。*1
仮想マシンを作成
ドキュメントによると最低でも 3 台の仮想マシンが必要とあったので、適当に Hyper-V を使って 3 インスタンス立ち上げました。CPU が弱いのでメモリだけは多く割り当てました。
マシン名はわかりやすいように適当な名前を付けておきました。本当なら IP を固定させたりしないといけないはずですが、お試しなので DHCP そのままです。
Service Fabric Cluster を作成
実際に Service Fabric Cluster を作る手順は、公式のドキュメントを見ながら手順通りに行うだけですが、日本語版は古い情報のままなので、基本的には英語版を見て作業した方が良いと思いました。
クラスターの設定ファイルはいくつか用意されていますが、今回は ClusterConfig.Unsecure.MultiMachine.json を使いました。作成前にファイルを開いて nodes に定義されている IP アドレスなどを修正しておきます。
{ "name": "SampleCluster", "clusterConfigurationVersion": "1.0.0", "apiVersion": "2015-01-01-alpha", "nodes": [ { "nodeName": "vm0", "iPAddress": "192.168.1.18", "nodeTypeRef": "NodeType0", "faultDomain": "fd:/dc1/r0", "upgradeDomain": "UD0" }, { "nodeName": "vm1", "iPAddress": "192.168.1.19", "nodeTypeRef": "NodeType0", "faultDomain": "fd:/dc1/r1", "upgradeDomain": "UD1" }, { "nodeName": "vm2", "iPAddress": "192.168.1.20", "nodeTypeRef": "NodeType0", "faultDomain": "fd:/dc1/r2", "upgradeDomain": "UD2" } ], ... 省略 ... }
ファイルの修正が終われば CreateServiceFabricCluster.ps1 を実行するだけで Service Fabric Cluster が作成されます。この時、私の環境ではポート 445 が開いていないと言われたので、ファイアーウォールの設定から NetLogon のルールを有効にしておきました。
.\CreateServiceFabricCluster.ps1 -ClusterConfigFilePath .\ClusterConfig.Unsecure.MultiMachine.json -AcceptEULA
Service Fabric Cluster の作成に成功すると、ポート 19080 で Service Fabric Explorer が見られるようになります。全てのノードで動いているみたいなので、IP はどれでも問題ないです。
これだけでアプリケーションのデプロイが出来るクラスターが完成します。かなりお手軽ですね。
Visual Studio からアプリケーションをデプロイ
Service Fabric アプリケーションをデプロイしてみようと思うので、適当にテンプレートを選んでアプリケーションを作成しました。ASP.NET Core が確認しやすいと思います。
デフォルトのクラスター設定だとアプリケーションエンドポイントとして使えるポートが 20001-20031 になっているので、ServiceManifest.xml を修正しておきます。
後は Visual Studio から公開を実行すると、Service Fabric へのデプロイダイアログが表示されるので、接続のエンドポイントとしてクラスターの IP アドレスとポート 19000 を指定するだけです。
ターゲットプロファイルは専用に作ってもいいと思いますが、ひとまず Cloud.xml を選んでいます。
Service Fabric Cluster へのデプロイは Azure に対して行うよりずっと高速でした。特にエラー無く完了すれば、Service Fabric Explorer からアプリケーションを確認できるようになっています。
ちゃんと 3 インスタンスにデプロイされて動作していることが確認できます。
実際にエンドポイントにブラウザでアクセスすると、デプロイを行った ASP.NET Core アプリケーションが動作していることが確認できます。
まだ ReliableCollection や Actor などは試していないですが、今のところクラスターに問題はなさそうなのでじっくり試していきたいと思います。
*1:とある界隈的には 4 かずあきという単位