この間は App Engine Flexible Environment を使って ASP.NET Core アプリケーションを実行してみましたが、今度は Container Engine を使ってアプリケーションを動かしてみることにします。
ちなみに Flexible Environment を使って動かす方法は以下になります。
Container Engine は Managed Kubernetes と言える代物なので、基本的な考え方はこれまで Azure Container Service 上で触ってきた Kubernetes と同じです。
コンテナクラスタを作成
当然ながら ASP.NET Core アプリケーションは動作するので、サクッと Container Engine のコンテナクラスタを作成します。設定内容はデフォルトのままで 3 インスタンス立ち上げました。
Container Engine の大きなメリットとしては、Kubernetes のアップデートを Google 側に任せることが出来ることだと思いました。他ではまだ見た覚えがありません。
コンテナクラスタの管理なんて正直やってられないので、任せることが出来て最高です。
ASP.NET Core アプリケーションを作成
Flexible Environment の時と同じように ASP.NET Core プロジェクトを作成すると、Visual Studio から直接 Container Engine にデプロイできるようになります。
異なる点として、Container Engine ではコンテナ側で EXPOSE したポート番号を考慮してくれないみたいなので、Dockerfile を書き換えて PORT 環境変数を使うようにします。
FROM gcr.io/google-appengine/aspnetcore:1.0 COPY . /app WORKDIR /app ENV ASPNETCORE_URLS=http://*:${PORT} ENTRYPOINT ["dotnet", "GoogleCloudAspNetCoreMvc3.dll"]
とりあえずのベースイメージとして aspnetcore:1.0 を指定していますが、結構細かく用意されているので好きなバージョンを選ぶことが出来ます。
見た感じでは 1.0 から 2.0 のプレビューまで、全てのイメージが用意されていました。
テンプレートで生成される ASP.NET Core アプリケーションは 1.0 ベースなので、そこだけは注意です。バージョンがばらばらになると実行時にエラーになって動作しなくなります。
アプリケーションをデプロイ
Dockerfile の準備が出来たら Publish を前回と同じように選んで、デプロイ先を Container Engine にすると、クラスタの選択などの必要な設定を行うダイアログが表示されます。
Deployment name はそのまま Kubernetes 上の Deployment の名前になります。今回はアプリケーションとして公開したいので Expose a service を選んでおきます。
Make service public にもチェックを入れておきます。レプリカ数などは適当に設定しました。
これで Publish を実行すると Container Engine へデプロイが行われますが、実行には kubectl が必要なので、インストールされていない場合にはエラーが出ます。
gcloud components install kubectl を実行すればインストールされるので、エラーになった場合は先にインストールを行っておきます。インストール自体はすんなり終わります。
kubectl のインストール後に再度 Publish を実行すると、しばらくした後にブラウザが立ち上がって実行中の ASP.NET Core アプリケーションが表示されます。
クラスターを作成してしまえば、後は Visual Studio で作業が完結するのが便利です。
Kubernetes ダッシュボードにアクセスする
Container Engine は Kubernetes が動いているので、ダッシュボードを表示することも勿論できます。そのためには認証情報をダウンロードする必要があるので、gcloud コマンドを使って取得します。
しかし Windows 環境では HOME 環境変数が無いと怒られてしまったので、とりあえず USERPROFILE と同じ値で HOME 環境変数を設定しておきます。
set HOME=%USERPROFILE% gcloud container clusters get-credentials CLUSTER_NAME --zone ZONE_NAME --project PROJECT_NAME kubectl proxy
認証情報のダウンロードが成功すれば 127.0.0.1:8001/ui にてダッシュボードが表示できます。
ダッシュボードからはデプロイメント、レプリカセット、ポッドが立ち上がってるのが確認できます。
ここで Visual Studio から再度 Publish を実行してみます。Deployment name を変更しないようにして、サービスの公開設定などもそのままにして Publish を実行します。
既に存在する Deployment なのでアップデートするか聞かれます。もちろん Update を行います。
アップデートを行ってから数秒後には、Kubernetes のダッシュボードには新しいレプリカセットが作成されて、古いポッドは削除されていることが確認できます。
コンテナーなのでアプリケーションのアップデートは一瞬で完了します。
実際に使う場合には Visual Studio からのデプロイではなく、外部の CI SaaS を使うと思いますが開発環境などでカジュアルにアプリケーションのデプロイを行いたい場合などに便利そうです。
複数の ASP.NET Core アプリケーションを一度にデプロイできると更に良さそうですが、Docker Compose 的な機能は Cloud Tools には用意されていないみたいでした。