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
正しく表示されました。
ここまで詰まることなく進めることができました。
アプリケーションのスケーリング
せっかくなのでスケーリングしてみます。
$ 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/