世界のやまさ

SEKAI NO YAMASA

Azure Container Service 上の Kubernetes に Spring Bootをデプロイ

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

blog.shibayan.jp

Azure Container Service は Marathon と DC/OS、Docker Swarm、または Kubernetes を使えます。

f:id:nnasaki:20170504215826p:plain

Azure クラウドでの Docker コンテナーのホスト | Microsoft Docs より

しばやんが Kubernetes を使用していたので、違うのにしようかなと思いましたが、 Kubernetes を使用することにしました。

Azure Container Service を作成する

Orchestrator を Kubernetes で選びます。

f:id:nnasaki:20170504220005p:plain

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

f:id:nnasaki:20170504220413p:plain

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

f:id:nnasaki:20170504221052p:plain

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

f:id:nnasaki:20170504221241p:plain

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

f:id:nnasaki:20170504221636p:plain

東日本は私のサブスクリプションではどうやらダメみたいなので、東南アジアの Standard_D2 で作り直します。

再デプロイをポチッと押して、変更します。

f:id:nnasaki:20170504221858p:plain

f:id:nnasaki:20170504222717p:plain

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

f:id:nnasaki:20170504222153p:plain

前は失敗すると、また一から作り直しだったんですが便利になりました。

東南アジアになってしまったのが不本意ですが、無事作成出来ました。

f:id:nnasaki:20170504223929p:plain

Kubernetes へ接続する

しばやんのところに書いてある通り、次のドキュメントの手順通り行います。環境は macOS Sierra です。

docs.microsoft.com

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 を入れた後です。

f:id:nnasaki:20170507102336p:plain

Spring Boot アプリケーションを kubernetes にデプロイする

SPRING INITIALIZR にて、WebとActuatorをいれたサンプルを作ります。

f:id:nnasaki:20170507131326p:plain

作成されたものに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にも置きました。

github.com

続いて、コンテナイメージを docker Hub にも置いておきます。

https://hub.docker.com/r/nnasaki/spring-boot-sample/

kubernetes のUIを開いて、コンテナイメージを選択します。外部サービスを追加するのをお忘れ無く。

f:id:nnasaki:20170507132213p:plain

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

f:id:nnasaki:20170507132608p:plain

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

f:id:nnasaki:20170507132714p:plain

まとめ

作るまでにちょっと手間取りましたが、一度作ってしまえば便利だと思います。今回はシンプルなアプリケーションでしたが、もう少し複雑なアプリケーションでも試してみたいと思います。また、CIを組み合わせてKubernetesにデプロイすることも可能ですし、Kubernetesを使用していれば[Google Container Engine(GKE)(https://cloud.google.com/container-engine/)にも移行・併用も楽に出来ると思います。GKE は5ノードまで無料なようなので気軽に試せそう*1

*1:5/8追記 Compute Engine のインスタンス料金は、クラスタが削除されるまで、ノード数に応じて課金されます。とのことで、完全に無料ではありませんでした。自分がちょっとチュートリアルを試したところ$0.42かかりました。