My Note Pad

エンジニアリングや日々の雑感を書いていきます

SpringBootをKubernetes上で動かしてみる

これは2018年02月26日にQiitaに投稿した記事を移行したものです

about

SoftwareDesign 2018/3号を読んでいてKubernetesに少し興味を持ったので試してみました。 色々ハマりどころがあるかと思いましたが、環境構築〜デプロイ、スケールまで割りとすんなりと進めることができました。

環境

インストール

VirtualBox

$ brew cask install virtualbox

Hish Sierraだとインストール中に止まってしまうことがあります。 その場合はシステム環境設定 > セキュリティとプライバシーOracleがブロックされたみたいなものが表示されているので「許可」するとインストールできます。 (スクリーンショット撮り忘れ)

minikube

$ brew cask install minikube

動作確認

minikubeの起動

$ minikube start
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

VirtualBox上でminikubeが作成されて起動していることが確認できます

スクリーンショット 2018-02-24 17.28.48.png

デプロイメントの作成

# deployment
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
deployment "hello-minikube" created

$ kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed

$ kubectl get pod
NAME                              READY     STATUS    RESTARTS   AGE
hello-minikube-7844bdb9c6-88hl4   1/1       Running   0          2m

この状態でダッシュボードを確認してみると

# ダッシュボードの起動
$ minikube dashboard

デプロイメントとポッドが作成される。 スクリーンショット 2018-02-24 17.35.13.png

# URLの確認
$ minikube service hello-minikube --url

$ curl $(minikube service hello-minikube --url)
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
・
・
・
# サービスの削除
$ kubectl delete service hello-minikube
service "hello-minikube" deleted

# デプロイメントの削除
$ kubectl delete deployment hello-minikube
deployment "hello-minikube" deleted

# minikube終了
$ minikube stop
Stopping local Kubernetes cluster...
Machine stopped.

Spring BootのDocker環境を用意する

今回は公式チュートリアルの完成版を利用します。 https://spring.io/guides/gs/spring-boot-docker/

スターターをclone

$ git clone https://github.com/spring-guides/gs-spring-boot-docker.git
# 完成版を使う
$ cd gs-spring-boot-docker/complete
$ ./gradlew build docker
・
・
・
:processTestResources NO-SOURCE
:testClasses
:test
:check
:build
:dockerClean UP-TO-DATE
:dockerPrepare
:docker

BUILD SUCCESSFUL

Total time: 1 mins 37.278 secs

動かしてみる

$ docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
springio/gs-spring-boot-docker   latest              d486fdb38288        4 minutes ago       116MB

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

docker上でSpringBootが起動しました。

スクリーンショット 2018-02-24 21.11.02.png

kubernetes上で動かす

環境変数の設定

$ minikube start
$ eval $(minikube docker-env)
# この状態では一時的にローカルPCからdockerへの接続などができなくなりますが、ターミナルを再起動すれば設定が消えて元にもどります。

サービスの設定ファイルを以下の内容で作成する。

apiVersion: v1
kind: Service
metadata:
  name: hellojavakubernetes
  labels:
    app: hellojavakubernetes
    tier: backend
spec:
  type: NodePort
  ports:
    # the port that this service should serve on
  - port: 8080
  selector:
    app: hellojavakubernetes
    tier: backend

サービスの登録

$ kubectl create -f kubernetes-service.yaml

hellojavakubernetesサービスが登録されました。

スクリーンショット 2018-02-24 21.43.07.png

デプロイメント設定ファイルを以下の内容で作成する。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hellojavakubernetes
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hellojavakubernetes
        tier: backend
    spec:
      containers:
      - name: hellojavakubernetes
        image: springio/gs-spring-boot-docker
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 8080

デプロイしてみる。

$ kubectl create -f kubernetes-deployment.yaml
deployment "hellojavakubernetes" created

$ kubectl get deployment
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hellojavakubernetes   1         1         1            1           3m

hellojavakubernetesというデプロイメントが作成され、ポッドも作成されています。

スクリーンショット 2018-02-24 21.54.37.png

URLを調べる。

$ minikube service hellojavakubernetes --url
http://192.168.99.100:31830

表示されたURLにアクセスする スクリーンショット 2018-02-24 22.04.06.png

正しく表示されました。 ここまで詰まることなく進めることができました。

アプリケーションのスケーリング

せっかくなのでスケーリングしてみます。

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hellojavakubernetes   1         1         1            1           17h

# replicasを指定する
$ kubectl scale --replicas=2 -f kubernetes-deployment.yaml 
deployment "hellojavakubernetes" scaled

# deploymentsの数が2に増えました。
$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hellojavakubernetes   2         2         2            2           17h

ポッドの数が2つに増えていることがわかります。

スクリーンショット 2018-02-25 15.48.27.png

続いて設定ファイルから変更してみます。 上の方で作成したkubernetes-deployment.yamlreplicas3に変更します。

# 設定の適用
$ kubectl apply -f kubernetes-deployment.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment "hellojavakubernetes" configured

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hellojavakubernetes   3         3         3            3           17h

こちらも無事スケールできました。

後始末

終了する

$ kubectl delete service,deployment hellojavakubernetes
$ minikube stop
$ minikube delete

本番で運用するにはまだまだ調べることが多そうですがKubernetes自体はかなり完成されているなという印象でした。

参考ページ

[minikube] https://github.com/kubernetes/minikube

[Spring Boot with Docker] https://spring.io/guides/gs/spring-boot-docker/

[getting started] https://www.bluefyre.io/getting-started-springboot-kubernetes/