Kubernetes on Docker DesktopでSpring Bootアプリケーションを動かす

Kubernetes

Docker Community Edition for Mac/Windowsのstableでが使えるようになりました、ということでSpring Bootのアプリケーションをローカル環境のKubernetesで動かしてみます。

前提バージョン

今回の記事は以下のバージョンを前提にしています。

  • Docker Community Edition for Windows:18.06.0-ce
$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:05:28 2018
 OS/Arch:           windows/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:13:46 2018
  OS/Arch:          linux/amd64
  Experimental:     false
 Kubernetes:
  Version:          v1.10.3
  StackAPI:         v1beta2

Docker Community Editionのインストール

こちらのアップデートの案内の記事にダウンロード先のリンクがあります。

Kubernetes is Now Available In Docker Desktop Stable Channel - Docker Blog
Back in January we made Kubernetes available in our Edge release channels for Docker Desktop on macOS and on Windows. Today we’re excited to announce that Kuber...

Macの方はMac版をインストールしてください。また、インストール中にデフォルトのオーケストレータにKubernetesを使用するかSwarmを使用するか選択するところがありますのでKubernetesを選択しておきましょう。

ここで選択した設定は、ユーザのホームディレクトリ配下の.docker/config.jsonに設定されますので、あとで修正も可能だと思います(Kubernetesしか使うつもりがないので試してませんが)。

{
  "credsStore": "wincred",
  "auths": {
    "https://index.docker.io/v1/": {}
  },
  "stackOrchestrator": "kubernetes"
}

Spring BootアプリケーションのDockerイメージ作成

Springのリファレンスに作成方法が記載されています。

Spring Boot with Docker
this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring tea...

基本的なやり方は、dockerプラグインを使用してイメージをビルドする方法で、プロジェクトルート(デフォルトパス)にDockerファイルを配置してビルドするというもの。

Docker Gradle Pluginそのもの(Maven Pluginもありますが)についてはこちらを参照ですね。

palantir/gradle-docker
a Gradle plugin for orchestrating docker builds and pushes. - palantir/gradle-docker

この記事ではイメージの作成方法については割愛し、Docker HUBで公開されているサンプルイメージを使用してしまいます。

$ docker pull springio/gs-spring-boot-docker
Using default tag: latest
latest: Pulling from springio/gs-spring-boot-docker
88286f41530e: Pulling fs layer
8e194fc7b3fc: Pulling fs layer
bfed7f5c4dc0: Pulling fs layer
3269658dba07: Pulling fs layer
3269658dba07: Waiting
88286f41530e: Verifying Checksum
88286f41530e: Download complete
88286f41530e: Pull complete
8e194fc7b3fc: Verifying Checksum
8e194fc7b3fc: Download complete
8e194fc7b3fc: Pull complete
3269658dba07: Download complete
bfed7f5c4dc0: Verifying Checksum
bfed7f5c4dc0: Download complete
bfed7f5c4dc0: Pull complete
3269658dba07: Pull complete
Digest: sha256:879e37e16545d45391f30e5559dface8d90636ab330b546fa53d3ae79dfed545
Status: Downloaded newer image for springio/gs-spring-boot-docker:latest

イメージのダウンロードが出来たので確認します。

$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
・・・ 省略
springio/gs-spring-boot-docker             latest              3a7a85f42b64        12 months ago       181MB
・・・ 省略

Springのリファレンスに従ってちょっと起動してみます。

$ docker run -p 8080:8080 -t springio/gs-spring-boot-docker

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.4.RELEASE)

2018-08-04 09:39:33.849  INFO 6 --- [           main] hello.Application                        : Starting Application on 5df366458f7b with PID 6 (/app.jar started by root in /)
2018-08-04 09:39:33.856  INFO 6 --- [           main] hello.Application                        : No active profile set, falling back to default profiles: default

おなじみのアスキーアートが出ますね。それは置いておいてちょっと実行してみます。

$ curl http://localhost:8080
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    18  100    18    0     0    163      0 --:--:-- --:--:-- --:--:--   163
Hello Docker World

Hello Docker Worldだそうです。それだけのサンプルアプリってことですね。

docker-compose.ymlの作成

イメージを取得したところでdocker-compose.ymlを作成します。

version: '3.7'
services:
  app:
    image: springio/gs-spring-boot-docker
    container_name: 'app'
    ports:
    - "8080:8080"

コンテナ名とポートだけ指定します。先程の直接起動と同じですね。ちょっと起動してみます。起動する前に先程起動したイメージは停止しておいてください。

$ docker-compose up
Starting app ... done
Attaching to app
app    |
app    |   .   ____          _            __ _ _
app    |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
app    | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
app    |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
app    |   '  |____| .__|_| |_|_| |_\__, | / / / /
app    |  =========|_|==============|___/=/_/_/_/
app    |  :: Spring Boot ::        (v1.5.4.RELEASE)
app    |
app    | 2018-08-04 09:54:39.238  INFO 6 --- [           main] hello.Application                        : Starting Application on e0dcabab969a with PID 6 (/app.jar started by root in /)
app    | 2018-08-04 09:54:39.240  INFO 6 --- [           main] hello.Application                        : No active profile set, falling back to default profiles: default

同じ要領で起動しますね。

Kubernetesへのデプロイ

KubernetesがDockerに同梱されているためか、docker stackでデプロイが可能とのこと。

Deploy on Kubernetes
Deploying to Kubernetes on Docker for Windows

やってみます。

$ docker stack deploy --compose-file ./docker-compose.yml mystack
Ignoring deprecated options:

container_name: Setting the container name is not supported.

service "app": container_name is deprecated
Waiting for the stack to be stable and running...
app: Pending
app: Ready

Stack mystack is stable and running

container_name: Setting the container name is not supported.

そうですか、そうなんですか(゚Д゚)

それはさておき起動したみたいです。kubectlでポッドを確認してみます。

$ kubectl get pods
NAME                  READY     STATUS    RESTARTS   AGE
app-565668b5f-fl2lb   1/1       Running   0          3m

なんかいますね。ログを確認してみましょう。

$ kubectl logs app-565668b5f-fl2lb

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.4.RELEASE)

2018-08-04 09:59:38.473  INFO 7 --- [           main] hello.Application                        : Starting Application on app-565668b5f-fl2lb with PID 7 (/app.jar started by root in /)
2018-08-04 09:59:38.478  INFO 7 --- [           main] hello.Application                        : No active profile set, falling back to default profiles: default
・・・ 省略

出てますねいつものやつ。どうやらコレでKubernetesにデプロイ出来ているようです。

Kubernetesのコンフィグファイル(yaml)でもデプロイできるようです。
その場合はKubectl applyを使用します。

Kubernetes Dashboardで見てみる

ダッシュボードのUIが提供されているようなので導入してみましょう。

kubernetes/dashboard
General-purpose web UI for Kubernetes clusters. Contribute to kubernetes/dashboard development by creating an account on GitHub.

リファレンスに従ってKubectl applyすればOKです。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

kubectl proxyで起動です。

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

起動した状態で、http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/にアクセスすればダッシュボードが表示されます。

まさか日本語対応してるとは思わなかった(゚Д゚)

それは置いておいて先程のポッドを見てみましょう。

イメージ:springio/gs-spring-boot-dockerが起動しているのがわかりますね。また、ダッシュボードからこのポッドのログも確認出来ます。

まとめ

ということで、ローカル環境のKubernetesでSpring Bootのアプリケーションを動かして見るところまで、をやってみました。あくまでローカル環境でのお試し環境ということですが、色々触ってみる分には良いのではないでしょうか。Docker CEの安定版を入れるだけで環境が作れるのはなかなかお手軽なのではないかと。

GKE(Google Kubernetes Engine)、AKS(Azure Container Service)、EKS(Elastic Container Service for Kubernetes)とまぁお仕事で使うパブリッククラウドのマネージドサービスはあるわけですが、それはお仕事で機会がないとちと触れないかな、ということで。

コンテナ関係はほぼほぼド素人・・・というか初めて触った勢いなので少しずつ勉強して行こうと思います。

この記事に対するコメント