GoogleCloudで汎用Database構築4 - kubernetes & SpringBoot  & intelliJ その2 -

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯
[前回の記事](http://qiita.com/tstakano-yj/items/45b209e1fcc1fb5269f2)の続きです。

 1. アプリケーション雛形作成　←　完了
 1. DockerImage作成
 1. imageの保存
 1. deploy

# DockerImage作成
アプリケーションの肉付けは後でやるとして、次はこれをDockerImageにしてみよう。

## Dockerfile
Dockerfileの作成に関しては[こちらのオフィシャル](https://spring.io/guides/gs/spring-boot-docker/)ページを参照

直下にDockerfileを作成
<img width="122" alt="スクリーンショット 2016-11-07 23.34.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/82012a65-9108-c5b8-f2ad-5ee932c10c65.png">

```docker:Dockerfile
FROM java:8

ENV WAR_FILE_NAME=storeagent-0.0.1-SNAPSHOT.war

VOLUME /tmp
ADD target/$WAR_FILE_NAME app.jar
RUN sh -c 'touch /app.jar'
RUN groupadd spring \
        && useradd -r -g spring spring

USER spring
EXPOSE 80 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
CMD ["start"]
```
画面系のものは8080でAPIを80で公開する予定なので、両方Exposeする。

# DockerImageのコンテナレジストリへの登録

## Cloud Shell
Cloud Shell、便利ですね。
javaのバージョンが、1.7になっていたので、1.8に切り替える。

```shell-session
sudo update-alternatives --config java
```

<img width="683" alt="スクリーンショット 2016-11-08 10.43.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/8b7a2515-053c-efe6-1829-78c0230db22a.png">

javacも同様

```shell-session
sudo update-alternatives --config javac
```

# build & push

packaging

```shell-session
mvn install
```

docker build

```shell-session
docker build -t asia.gcr.io/[projectid]/storeagent:0.1.0 .
```

push image

```shell-session
gcloud docker push asia.gcr.io/zeolite-1196/storeagent:0.1.0
```
コンテナレジストリに登録する。


<img width="817" alt="スクリーンショット 2016-11-08 11.46.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/48d51e14-ac29-4858-91e6-4df74e02a544.png">
コンテナレジストリに登録されていることを確認

# container作成

## create container

```shell-session
gcloud container clusters create "store-agent-asia"  --num-nodes 3 --zone "asia-east1-a" --machine-type "n1-standard-2"  --scopes "compute-rw","storage-ro","bigquery","logging-write","monitoring"
```
node3でasia-east1-aに作成

## credentials 取得

```shell-session
gcloud container clusters get-credentials store-agent-asia --zone asia-east1-a
```

## yamlの用意
<img width="271" alt="スクリーンショット 2016-11-08 14.12.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/120065f3-5626-b727-3400-76768d977928.png">
プロジェクト直下のkubernetesディレクトリに作成

### Controller

```yaml:store-agent-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: store-agent
  labels:
    app: store-agent
    role: store-agent-node
    tier: backend
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: store-agent
        role: store-agent-node
        tier: backend
    spec:
      containers:
      - name: store-agent
        image: asia.gcr.io/zeolite-1196/storeagent:0.1.0
        env:
        - name: WAR_FILE_NAME
          value: storeagent-0.0.1-SNAPSHOT.war
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort:  8080
        - containerPort:  80
```

### Service

```yaml:store-agent-service.yaml
kind: Service
apiVersion: v1
metadata:
  name: store-agent-service
  labels:
    app: store-agent
    role: store-agent-node
    tier: backend
spec:
  type: LoadBalancer
  ports:
  - port: 80
    name: webservice
    targetPort: 80
  - port: 8080
    name: console
    targetPort: 8080
  selector:
    app: store-agent
    role: store-agent-node
    tier: backend

```

## レプリケーションコントローラーとサービスの作成

```shell-session
kubectl create -f kubernetes/store-agent-controller.yaml
kubectl create -f kubernetes/store-agent-service.yaml 
```

確認する

```shell-session
# podリスト取得
kubectl get pods
```
<img width="517" alt="スクリーンショット 2016-11-08 14.16.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/4c5fd940-22f2-5967-dcba-02e8d126870d.png">



```shell-session
# serviceリスト取得
kubectl get services
```

<img width="651" alt="スクリーンショット 2016-11-08 14.16.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/62d4cfe8-d504-9dce-f282-243f8c51c7a8.png">

SpringBootアプリケーションが立ち上がっているかどうか確認する

```shell-session
kubectl logs store-agent-hpvda
```

<img width="1170" alt="スクリーンショット 2016-11-08 14.18.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/3aac3316-0a4e-89cd-3997-dbc85dba56ed.png">

起動を確認。

<img width="834" alt="スクリーンショット 2016-11-08 14.27.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/8c9a7298-260e-b4f9-c159-0dca02ffa6ab.png">

コンテナもちゃんと作成されてますね。

<img width="537" alt="スクリーンショット 2016-11-08 14.29.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/1af51353-88cb-2b62-1f53-00d36e232c75.png">

せっかくなのでこれもやってみる

localマシンで実行。もちろん[こちらのSDK](https://cloud.google.com/sdk/docs/)がinstallされていることが前提。

```shell-session
gcloud components install kubectl

kubectl proxy
```

<img width="308" alt="スクリーンショット 2016-11-08 14.37.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/25b80115-405e-3aaa-c865-9b5676ecb503.png">

アクセスするとリッチなダッシュボード

<img width="1554" alt="スクリーンショット 2016-11-08 14.39.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/fe05aa2c-a32a-2703-d7d3-86b96e3bf2a9.png">

以上。

# 次回
レプリケーションコントローラーの説明やserviceの説明は省きました。
また詳しくレポートする機会があれば載せます。

以上でSpringBootのアプリケーションの作成→Dockerイメージ化→kubernetes管理下におく
というところまで行きました。

次回は上記のアプリケーションにApache Camelを統合してみます。