メイドさんが大好きなフリーランスのプログラマーさんが 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かかりました。