しばやん雑記

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

Google Container Engine (GKE) に Visual Studio を使って ASP.NET Core アプリケーションをデプロイする

この間は 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 インスタンス立ち上げました。

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

Container Engine の大きなメリットとしては、Kubernetes のアップデートを Google 側に任せることが出来ることだと思いました。他ではまだ見た覚えがありません。

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

コンテナクラスタの管理なんて正直やってられないので、任せることが出来て最高です。

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 のプレビューまで、全てのイメージが用意されていました。

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

テンプレートで生成される ASP.NET Core アプリケーションは 1.0 ベースなので、そこだけは注意です。バージョンがばらばらになると実行時にエラーになって動作しなくなります。

アプリケーションをデプロイ

Dockerfile の準備が出来たら Publish を前回と同じように選んで、デプロイ先を Container Engine にすると、クラスタの選択などの必要な設定を行うダイアログが表示されます。

Deployment name はそのまま Kubernetes 上の Deployment の名前になります。今回はアプリケーションとして公開したいので Expose a service を選んでおきます。

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

Make service public にもチェックを入れておきます。レプリカ数などは適当に設定しました。

これで Publish を実行すると Container Engine へデプロイが行われますが、実行には kubectl が必要なので、インストールされていない場合にはエラーが出ます。

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

gcloud components install kubectl を実行すればインストールされるので、エラーになった場合は先にインストールを行っておきます。インストール自体はすんなり終わります。

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

kubectl のインストール後に再度 Publish を実行すると、しばらくした後にブラウザが立ち上がって実行中の ASP.NET Core アプリケーションが表示されます。

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

クラスターを作成してしまえば、後は 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 にてダッシュボードが表示できます。

ダッシュボードからはデプロイメント、レプリカセット、ポッドが立ち上がってるのが確認できます。

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

ここで Visual Studio から再度 Publish を実行してみます。Deployment name を変更しないようにして、サービスの公開設定などもそのままにして Publish を実行します。

既に存在する Deployment なのでアップデートするか聞かれます。もちろん Update を行います。

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

アップデートを行ってから数秒後には、Kubernetes のダッシュボードには新しいレプリカセットが作成されて、古いポッドは削除されていることが確認できます。

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

コンテナーなのでアプリケーションのアップデートは一瞬で完了します。

実際に使う場合には Visual Studio からのデプロイではなく、外部の CI SaaS を使うと思いますが開発環境などでカジュアルにアプリケーションのデプロイを行いたい場合などに便利そうです。

複数の ASP.NET Core アプリケーションを一度にデプロイできると更に良さそうですが、Docker Compose 的な機能は Cloud Tools には用意されていないみたいでした。