しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Service Fabric for Windows Server を動かすために Intel NUC を買ってみた

先週の 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 からダウンロード出来るようになれば入れなおします。

f:id:shiba-yan:20161002142812p:plain

ちゃんと 32GB のメモリを認識しています。*1

仮想マシンを作成

ドキュメントによると最低でも 3 台の仮想マシンが必要とあったので、適当に Hyper-V を使って 3 インスタンス立ち上げました。CPU が弱いのでメモリだけは多く割り当てました。

f:id:shiba-yan:20161002145220p:plain

マシン名はわかりやすいように適当な名前を付けておきました。本当なら 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 はどれでも問題ないです。

f:id:shiba-yan:20161002143600p:plain

これだけでアプリケーションのデプロイが出来るクラスターが完成します。かなりお手軽ですね。

Visual Studio からアプリケーションをデプロイ

Service Fabric アプリケーションをデプロイしてみようと思うので、適当にテンプレートを選んでアプリケーションを作成しました。ASP.NET Core が確認しやすいと思います。

デフォルトのクラスター設定だとアプリケーションエンドポイントとして使えるポートが 20001-20031 になっているので、ServiceManifest.xml を修正しておきます。

f:id:shiba-yan:20161002151734p:plain

後は Visual Studio から公開を実行すると、Service Fabric へのデプロイダイアログが表示されるので、接続のエンドポイントとしてクラスターの IP アドレスとポート 19000 を指定するだけです。

ターゲットプロファイルは専用に作ってもいいと思いますが、ひとまず Cloud.xml を選んでいます。

f:id:shiba-yan:20161002144208p:plain

Service Fabric Cluster へのデプロイは Azure に対して行うよりずっと高速でした。特にエラー無く完了すれば、Service Fabric Explorer からアプリケーションを確認できるようになっています。

f:id:shiba-yan:20161002152218p:plain

ちゃんと 3 インスタンスにデプロイされて動作していることが確認できます。

実際にエンドポイントにブラウザでアクセスすると、デプロイを行った ASP.NET Core アプリケーションが動作していることが確認できます。

f:id:shiba-yan:20161002145012p:plain

まだ ReliableCollection や Actor などは試していないですが、今のところクラスターに問題はなさそうなのでじっくり試していきたいと思います。

*1:とある界隈的には 4 かずあきという単位