銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Red Hat Container Development Kit を使って、.NET Core on Linux containerを無料で体験する

先日の記事に続いて、Red Hat Developer Programを利用しての無料体験の宣伝です。

developers.redhat.com

.NET Core on RHEL (Red Hat Enterprise Linux Server)はRHELサーバー上でも動くのですが、Container Platform製品であるOpenShift上での利用もおすすめです。Gitリポジトリを指定するだけでContainerを作成して配置、ルーティングまでやってくれるところや、コンテナのスケーリング、死活監視など、.NET Coreアプリを配置する際にいろいろ面倒なところをやってくれます。

developers.redhat.com

ただ、無償でお試しするにはハードルがあり、現状の選択肢としては、OpenShift Onlineの無償枠(Activateされるまで時間かかることも)、Azure上でのTest Drive(短時間のみ)、upstream projectであるOpenShift origin(CentOSで動くが、製品版とは厳密には異なる)などいろいろ条件があります。

そこで今回は、ローカルのWindows/Mac/Linux上でシングルインスタンスで動く、Container Development Kitを紹介して、Windowsユーザー向けに.NET Coreアプリを配置するまでを説明してみようと思います。インストール手順はドキュメントを詳細してもらうことにして、いくつか注意点をまとめていきます。

developers.redhat.com

インストール手順のページを見るとわかりますが、まずはRed Hat Development Suite for Windowsをインストールします。インストーラーを起動するとまずインストール先を指定します。

f:id:tanaka733:20171020153722p:plain

このあとインストールするコンポーネントやHypervisorの選択などを行って、前提条件のチェックを行うのですが、このチェック時間がかかる上にスクリーンショットを撮ろうとしたり、Windowのフォーカスを切り替えたりすると最初からやりなおしになるので注意してください。

Development SuiteがインストールされたらCDKのインストールに移ります。Hyper-Vの場合、externalな仮想ネットワークスイッチを作って、その名前を環境変数に渡してから、インストールします。cmdとPowerShellのエスケープの違いに注意と書いています。

f:id:tanaka733:20171020150541p:plain

インストールされると、Hyper-Vにminishiftという名前の仮想マシンが作成されているはずです。

f:id:tanaka733:20171020151335p:plain

ここまで来たら、minishift startで起動します。正しく起動したときはこんな感じのログになるはずです。

f:id:tanaka733:20171020151451p:plain

うまくいかない場合は、Hyper-Vに対する操作が失敗していることが多いと思いますので、ログやHyper-V側の状態を確認してみてください。さて、表示されたURLにアクセスするとOpenShiftのWeb Consoleが表示されます。

f:id:tanaka733:20171020151611p:plain

空文字以外の任意のパスワードでログインできる状態になっているので、ユーザー名developerでログインします。

f:id:tanaka733:20171020151730p:plain

さて、Add To Projectでさっそく.NET Coreのプロジェクトを追加したいのですが、残念ながらデフォルトでは追加されていませんでした。

f:id:tanaka733:20171020151819p:plain

以前書いた記事に沿ってimagestreamとtemplateを追加してください。-n openshiftをづけることでopenshift名前空間にインポートすることができ、その場合は全てのプロジェクトから参照できます。

Chapter 2. .NET Core 2.0 on Red Hat OpenShift Container Platform - Red Hat Customer Portal

~~~ $ oc create --namespace openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/dotnet_imagestreams.json

$ oc create --namespace openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-example.json $ oc create --namespace openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-runtime-example.json $ oc create --namespace openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-pgsql-persistent.json ~~~

f:id:tanaka733:20171020152018p:plain

再度、先程のAdd To Projectの画面に戻ると.NET が追加されています。

f:id:tanaka733:20171020152102p:plain

.NET を選択して、Exampleを選択します。ここからがOpenShiftのs2iと呼ばれる機能をつかって行くのですが、containerで動かしますが、面倒なDockerfileを用意する必要はありません*1。gitリポジトリを指定すると、そこからclonseしてビルドして、成果物を配置して必要なポートを開放したコンテナを自動でビルドしてくれます。ということで必要なのは、ASP.NET Coreプロジェクトをpushしたgitリポジトリです。また、基本的には、ASP.NET CoreプロジェクトにOpenShift用の特別な設定を入れる必要はありません。リスニングするポートもOpenShiftが環境変数に渡しているので、ASP.NET Coreプロジェクトもそれに倣っていればOKです。また、自分で用意しなくても、Try it outのリンクをクリックすると用意されているexampleプロジェクト用のパラメーターを入れてくれます。

ただ、minishiftを使う場合1つ自前で設定しないといけないパラメーターがあります。アプリケーションにアクセスするためのhostnameです。手元のブラウザからコンテナ上のブラウザでアクセスするには、指定したドメインがOpenShift(minishift)のrouterのIPアドレスに解決される必要があります。

f:id:tanaka733:20171020152805p:plain

hostsファイルに書いてもいいのですが、もっと簡単には、nip.io といった好きなホスト名からprivat アドレスも解決してくれるようなサービスを使うと便利でしょう。解決すべきIPは、今アクセスしているOpenShiftのWeb Consoleのアドレスと同じです。この状態では、portが8443であればWeb Consoleにアクセスし、portが80もしくは443なら、routerにアクセスし、アプリケーションへリクエストを振り分けてくれます。

NIP.IO - wildcard DNS for any IP Address

というわけでhostnameを入力してアプリケーションを作成して、プロジェクトの画面に戻るとこんな表示になっているはずです。ビルドとデプロイの様子が確認できます。

f:id:tanaka733:20171020153406p:plain

デプロイ完了後に、先程入力してホスト名にアクセスするとアプリケーションが表示されます。

f:id:tanaka733:20171020153451p:plain

以上で、.NET Core on Linux containerがWindows上でお手軽に試せました。minishiftは単一ホストのOpenShiftにかなり近く、他にも様々な機能が利用できるので今後紹介していきたいと思います。

*1:Dockerfileを用意してビルドする方法も用意されています