メイドさんが大好きなフリーランスのプログラマーさんが Azure Container Service について記事を書いていたので、自分も使ってみました。
Azure Container Service は Marathon と DC/OS、Docker Swarm、または Kubernetes を使えます。

Azure クラウドでの Docker コンテナーのホスト | Microsoft Docs より
しばやんが Kubernetes を使用していたので、違うのにしようかなと思いましたが、 Kubernetes を使用することにしました。
Azure Container Service を作成する
Orchestrator を Kubernetes で選びます。

SSH public key と Service Principal の設定がちょっと難しいですが、[i] の部分にマウスカーソルを合わせるとヘルプが出てくるので、それに従って進めていけばなんとかなります。

Agent は5つで、CPU4コアでメモリ8Gとバランスが良い F4S を選んでみました。

検証に成功したのでOKを押してしばらく待ちます。

コーヒーでも入れてゆっくりしようかと思ったらエラーで失敗してしまいました。

東日本は私のサブスクリプションではどうやらダメみたいなので、東南アジアの Standard_D2 で作り直します。
再デプロイをポチッと押して、変更します。


Marketplace から購入したわけじゃないけど、チェックを入れて購入を押します。

前は失敗すると、また一から作り直しだったんですが便利になりました。
東南アジアになってしまったのが不本意ですが、無事作成出来ました。

Kubernetes へ接続する
しばやんのところに書いてある通り、次のドキュメントの手順通り行います。環境は macOS Sierra です。
kubectl をインストールします。az コマンドを使用します。install-location は各自の環境に合わせてください。
az acs kubernetes install-cli --install-location=/Users/nnasaki/bin/kubectl
次に認証情報をダウンロードしようとしたところでエラーになりました。
pink-poodle:~ nnasaki$ az acs kubernetes get-credentials --resource-group=k8s-southeastasia --name=containerservice-k8s-southeastasia
Authentication failed.
Traceback (most recent call last):
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/azure/cli/main.py", line 36, in main
cmd_result = APPLICATION.execute(args)
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/azure/cli/core/application.py", line 201, in execute
result = expanded_arg.func(params)
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/azure/cli/core/commands/__init__.py", line 417, in _execute_command
reraise(*sys.exc_info())
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/azure/cli/core/commands/__init__.py", line 399, in _execute_command
result = op(client, **kwargs) if client else op(**kwargs)
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/azure/cli/command_modules/acs/custom.py", line 690, in k8s_get_credentials
_k8s_get_credentials_internal(name, acs_info, path, ssh_key_file)
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/azure/cli/command_modules/acs/custom.py", line 711, in _k8s_get_credentials_internal
'.kube/config', path_candidate, key_filename=ssh_key_file)
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/azure/cli/command_modules/acs/acs_client.py", line 48, in SecureCopy
ssh.connect(host, username=user, pkey=pkey)
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/paramiko/client.py", line 381, in connect
look_for_keys, gss_auth, gss_kex, gss_deleg_creds, gss_host)
File "/Users/nnasaki/lib/azure-cli/lib/python2.7/site-packages/paramiko/client.py", line 622, in _auth
raise saved_exception
AuthenticationException: Authentication failed.
認証に失敗しています。scpで持ってくる方法を試しましたところうまくいきました。 azureuser@<master-dns-name> の azureuser を 作成時のユーザーに変えて、<master-dns-name> はコンテナのDNS名を入れます。
mkdir $HOME/.kube scp azureuser@<master-dns-name>:.kube/config $HOME/.kube/config
ポータルを表示する
次のコマンドを入力します。
kubectl proxy
次のURLでポータルに接続します。
http://127.0.0.1:8001/ui
画面は試しに nginx を入れた後です。

Spring Boot アプリケーションを kubernetes にデプロイする
SPRING INITIALIZR にて、WebとActuatorをいれたサンプルを作ります。

作成されたものにDockerfileを追加します。
FROM openjdk:8-jdk VOLUME /tmp ADD /build/libs/demo-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
成果物はGithubにも置きました。
続いて、コンテナイメージを docker Hub にも置いておきます。
https://hub.docker.com/r/nnasaki/spring-boot-sample/
kubernetes のUIを開いて、コンテナイメージを選択します。外部サービスを追加するのをお忘れ無く。

watch kubectl get svc をしてしばらく待ちます。 External-IP がpendingから振られたらアクセス出来るようになります。30秒ほどで有効になりました。

ブラウザでhttp://[ip]/healthアクセスすると無事表示されました。

まとめ
作るまでにちょっと手間取りましたが、一度作ってしまえば便利だと思います。今回はシンプルなアプリケーションでしたが、もう少し複雑なアプリケーションでも試してみたいと思います。また、CIを組み合わせてKubernetesにデプロイすることも可能ですし、Kubernetesを使用していれば[Google Container Engine(GKE)(https://cloud.google.com/container-engine/)にも移行・併用も楽に出来ると思います。GKE は5ノードまで無料なようなので気軽に試せそう*1。
*1:5/8追記 Compute Engine のインスタンス料金は、クラスタが削除されるまで、ノード数に応じて課金されます。とのことで、完全に無料ではありませんでした。自分がちょっとチュートリアルを試したところ$0.42かかりました。