SpringBootをKubernetes上で動かしてみる
これは2018年02月26日にQiitaに投稿した記事を移行したものです
about
SoftwareDesign 2018/3号を読んでいてKubernetesに少し興味を持ったので試してみました。 色々ハマりどころがあるかと思いましたが、環境構築〜デプロイ、スケールまで割りとすんなりと進めることができました。
環境
- macOS High Sierra 10.13.3
- Kubernetes v1.8.0
- minikube v0.24.1
- VirtualBox v5.2.6 r120293
インストール
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が作成されて起動していることが確認できます
デプロイメントの作成
# 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
デプロイメントとポッドが作成される。
# 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が起動しました。
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
サービスが登録されました。
デプロイメント設定ファイルを以下の内容で作成する。
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
というデプロイメントが作成され、ポッドも作成されています。
URLを調べる。
$ minikube service hellojavakubernetes --url http://192.168.99.100:31830
表示されたURLにアクセスする
正しく表示されました。 ここまで詰まることなく進めることができました。
アプリケーションのスケーリング
せっかくなのでスケーリングしてみます。
$ 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つに増えていることがわかります。
続いて設定ファイルから変更してみます。
上の方で作成したkubernetes-deployment.yaml
のreplicas
を3
に変更します。
# 設定の適用 $ 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/