---
title: Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
tags:  #jjug_ccc  
author: [Yahoo!デベロッパーネットワーク](https://convert.docswell.com/user/ydnjp)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/3EKG1LGMJD.jpg?width=480
description: JJUG CCC 2018 Springの登壇資料です。
published: May 28, 18
canonical: https://convert.docswell.com/s/ydnjp/573M6K-2018-05-28%20-152958
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/3EKG1LGMJD.jpg)

Spring Boot on Kubernetes
Yahoo!ズバトク事例
2018/05/26
ヤフー株式会社
玉利 拓郎
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 2

![Page Image](https://bcdn.docswell.com/page/L73NQ3N275.jpg)

自己紹介
玉利 拓郎
ヤフー株式会社 2009入社
Yahoo!ウォレット
Yahoo!ショッピング
Yahoo!ズバトク
Yahoo!マネー
↑タマリン
@yotama
言語
Java 1.4 -&gt; PHP 5.3 -&gt; Java 8
Tamari Takuro
Kotlinに浮気したい Rustも気になる
Photo by Jeroen Kransen - Gouden leeuwaapje(2008) / CC BY-SA 2.0
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/87DW94W6JG.jpg)

今日話すこと
• Yahoo!ズバトクでSpring Bootを
どうやってKubernetesに載せたか
• Kubernetesに合わせた開発フロー
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/VJP9ZMXZE8.jpg)

今日話さないこと
• Kubernetesサイドの話
• Kubernetes自体の運用など
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/2EVMW9LMEQ.jpg)

アジェンダ
• なぜKubernetesに移行したか
• Kubernetesに載せるために必要なこと
• その他導入したアーキテクチャ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/57GGDZXX7L.jpg)

Yahoo!ズバトクとは
“毎日ワクワク！おトクが当たる＆もらえる”
くじやキャンペーンを掲載するためのプラットフォーム
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4EQX1L857P.jpg)

なぜ
Kubernetesに
移行したか
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/KJ46RD2V71.jpg)

高まる需要
• 販促サービスとしての需要が高まる
• キャンペーン数は日に日に増加
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/LE1VQZM47G.jpg)

アクセス数の特性
• 特定の時間にアクセス数が急激に増える
•
•
•
•
キャンペーンの開始
人気キャンペーンの開催
PUSH通知
etc…
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GEWLM93Z72.jpg)

大型キャンペーンでは厳戒態勢で望む必要
2000 req/s
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/47ZMQ9VLE3.jpg)

増える要望
• 様々なキャンペーンに対応するため、
機能追加要望が増大
→ 開発が追いつかない
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/YJ6N6K5MJV.jpg)

移行前のシステム構成
別サービス
API
ほぼ全ての機能が
ココに載ってる
etc
Web × n
MySQL
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GJ556PYQJ4.jpg)

移行前のシステム構成
別サービス
1テーブルに数億レコード
API
etc
Web × n
DBも一極集中
MySQL
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/9E2NM6GW7R.jpg)

現行システムではそろそろ限界
• リリース時間 大
• DB負荷 大
• スケールコスト 大
• 結合試験のコスト 大
• 改修コスト 大
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/D7YPX9V97M.jpg)

運用コストを下げ、開発速度を高めたい
• リリース時間の削減
• システムのスケーラビリティの確保
• テスト工数の削減
• 改修コストの削減
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/VEN51LMDJ8.jpg)

Kubernetes
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/Y79Y54N8E3.jpg)

Kubernetes(k8s)とは
• コンテナのオーケストレーションプラット
フォーム
• コンテナ化されたアプリケーションの展開、
スケーリング、運用自動化を行う
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/G786YQKZJD.jpg)

Kubernetesでできること
• フェイルオーバー
• スケーリング
• スケジューリング
• ロードバランス
• サービスディスカバリ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/L7L94XZ1ER.jpg)

Kubernetesでできること
• 異常があると自動的にコンテナ再起動
• 自由にコンテナ(Pod)数を変更
• リクエストの負荷分散
• サービスへのルーティング
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/4EMZKLV57W.jpg)

k8sでいくつかの課題を解決できそう
• リリース時間 → コンテナ管理で短縮
• スケールコスト → k8sの機能で一発
• 改修コスト
• マイクロサービス化で修正箇所を集約
• (k8sならばサービスを追加するコストが低い)
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/PER6XK2ZJ9.jpg)

システム移行することに
•
•
•
•
IaaS → CaaS(Kubernetes)
PHP → Java
モノリシック → マイクロサービス
Jenkins → Concourse CI
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/P7XM6LD1JX.jpg)

アプリケーションアーキテクチャの変更
• モノリシック → マイクロサービス
• スケーラビリティの向上
• DB負荷の分散
• 改修リスクの削減
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/37KG1LXMED.jpg)

マイクロサービスアーキテクチャ
くじWEB
景品
履歴
くじ
MQ
メール
DBはサービス毎に分割
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
後処理は非同期
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/LJ3NQ352J5.jpg)

DDDで機能分割
• ドメイン駆動設計の
思想を基に、
サービスを分割
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/8JDW94D6EG.jpg)

ネットワーク構成
最終的には
40サービスほどに
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/VEP9ZM6Z78.jpg)

k8sに載せるために
必要なこと
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/27VMW93M7Q.jpg)

k8sへ載せるのに必要なもの
• k8sの基礎知識
• コンテナ
• Dockerイメージの作成
• アプリケーション
• クラウドネイティブ化
• Liveness probe / Readiness probe
• Graceful Shutdown
• k8s
• manifestファイル
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/5JGGDZ3XJL.jpg)

k8sを活かすのに必要なもの
• 開発フロー
• CI/CD
• 自動テスト
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/47QX1L55JP.jpg)

k8sの基礎知識
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/KE46RD9VJ1.jpg)

Kubernetesの特徴
• コンテナ中心のインフラ
• 宣言的設定
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/L71VQZK4JG.jpg)

宣言的設定
• 「望ましい状態」を記述した設定ファイル
(manifest)で定義
Copyright © 2017
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: campaign
name: campaign
spec:
selector:
matchLabels:
app: campaign
template:
metadata:
labels:
app: campaign
spec:
containers:
- image: docker-registry.xxxx.yahoo.co.jp:xxxx/zubatoku/zubatoku-campaign:latest
name: campaign
Yahoo JapanimagePullPolicy:
Corporation. All Rights
Reserved.
Always
YAMLで設定を書く
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/G7WLM9DZJ2.jpg)

Kubernetesのリソース構成イメージ
transaction
Ingress
Service
Service
Deployment
Deployment
Pod
Pod
Pod
Pod
Pod
Pod
namespace
1サービスのセット
それぞれのリソースをYAMLで定義する
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
cluster
※飽くまでイメージです
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/4JZMQ9GL73.jpg)

Pod
• デプロイの最小単位
• Dockerコンテナを内包
• 複数コンテナも可
Docker
コンテナ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Pod
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/YE6N6KYMEV.jpg)

Deployment
• ローリングアップデートや
ロールバックを管理する
• ReplicaSetを通して、Pod
を生成・管理する
Deployment
ReplicaSet
Pod
Pod
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Pod
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/GE556PGQE4.jpg)

Deploymentの定義
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
35


# Page. 36

![Page Image](https://bcdn.docswell.com/page/972NM6YWJR.jpg)

Service
VIP: 10.0.0.12
app=lot-web
Service
Pod
Pod
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
• 仮想IPとポート
• ラベルセレクタによる
Podのグルーピング
Pod
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/DJYPX9G9JM.jpg)

Ingress
Ingress
toku.yahoo.co.jp
/entry
/lot
Lot Service
• L7負荷分散
• バーチャルホスト
• パスによる振り分け
Entry Service
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/V7N51LGDE8.jpg)

Ingressの定義
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
rules:
- host: myservice.yahoo.co.jp
http:
paths:
- path: /lot
backend:
serviceName: lot
servicePort: 80
- path: /entry
backend:
serviceName: entry
servicePort: 80
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
38


# Page. 39

![Page Image](https://bcdn.docswell.com/page/YJ9Y54W873.jpg)

Ingress
Ingress
toku.yahoo.co.jp
nginx
/campaing01/lot
lot Service
• Ingressは前方一致でしか
振り分けられない
• ズバトクではnginxで振り分
けを実施
/campaign01/entry
entry Service
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
39


# Page. 40

![Page Image](https://bcdn.docswell.com/page/GJ86YQNZED.jpg)

その他の構成要素
• ConfigMap
• アプリケーション用の設定値を保持
• Secret
• 秘密情報を保持
• Job / CronJob
• バッチ処理等のジョブ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
40


# Page. 41

![Page Image](https://bcdn.docswell.com/page/LJL94XP17R.jpg)

アプリケーション編
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
41


# Page. 42

![Page Image](https://bcdn.docswell.com/page/47MZKL45JW.jpg)

アプリケーション周りで必要なこと
• コンテナ
• Dockerイメージの作成
• アプリケーション
•
•
•
•
クラウドネイティブ化
Liveness probe / Readiness probe
Graceful Shutdown
ログ出力
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
42


# Page. 43

![Page Image](https://bcdn.docswell.com/page/P7R6XKWZE9.jpg)

Dockerとは
• コンテナの実行・管理ツール
• イメージで管理するので、
環境の一貫性がある
• 素早いアプリケーションの展開
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
43


# Page. 44

![Page Image](https://bcdn.docswell.com/page/PJXM6LP1EX.jpg)

Dockerfile
• DockerfileでImageを定義
FROM openjdk:8
ベースのイメージ
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT [&quot;java&quot;, &quot;-Djava.security.egd=file:/dev/./urandom&quot;, &quot;-jar&quot;, &quot;/app.jar&quot;]
プロセス起動用のコマンド
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
44


# Page. 45

![Page Image](https://bcdn.docswell.com/page/3JKG1LDM7D.jpg)

Dockerイメージの作成と実行
# Dockerイメージをビルド
$ docker build . -t hoge/myapp
# Dockerコンテナを実行
$ docker run -d --rm -it hoge/myapp:latest
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
45


# Page. 46

![Page Image](https://bcdn.docswell.com/page/LE3NQ3R2E5.jpg)

Dockerfile例
FROM docker-registry.xxxx.yahoo.co.jp:xxxx/xxxx/openjdk:8
RUN groupadd -r zubatoku &amp;&amp; useradd -r -g zubatoku zubatoku
COPY ./app.jar ./app.jar
COPY ./run.sh ./run.sh
EXPOSE 8080
USER zubatoku
ENV TZ=Asia/Tokyo ¥
JAVA_GC_OPTS=&quot;&quot; ¥
JAVA_HEAP_OPTS=&quot;&quot; ¥
JAVA_METASPACE_OPTS=&quot;&quot; ¥
JAVA_EXTRA_OPTS=&quot;&quot; ¥
JAVA_OPTS=&quot;&quot;
ズバトクでは
オプション指定簡略化のため
外部スクリプト化
ENTRYPOINT [&quot;./run.sh&quot;, &quot;app.jar&quot;]
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
46


# Page. 47

![Page Image](https://bcdn.docswell.com/page/8EDW94Y67G.jpg)

シェルスクリプト化する場合はexecをつける
exec java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar $1
PIDが1になるように、javaコマンドの前にexecをつける
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
47


# Page. 48

![Page Image](https://bcdn.docswell.com/page/V7P9ZM2ZJ8.jpg)

アプリケーションへの対応
• クラウドネイティブ化
• Liveness probe / Readiness probe
• Graceful Shutdown
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
48


# Page. 49

![Page Image](https://bcdn.docswell.com/page/2JVMW9DMJQ.jpg)

クラウドネイティブなアプリ
基本はTwelve-factor app
クラウドで動くアプリケー
ションが従うべき12のプラク
ティス
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
コードベース
依存関係
設定
バックエンドサービス
ビルド、リリース、実行
プロセス
ポートバインディング
並行性
廃棄容易性
開発/本番一致
ログ
管理プロセス
49


# Page. 50

![Page Image](https://bcdn.docswell.com/page/5EGGDZYXEL.jpg)

抜粋すると
• 設定
• → 設定値は環境変数に格納
• ポートバインディング
• → 組み込みサーバを使う
• 廃棄容易性
• 起動の高速化、グレースフルシャットダウン
• ログ
• 標準出力に出力し、集約する
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
50


# Page. 51

![Page Image](https://bcdn.docswell.com/page/4JQX1LM5EP.jpg)

設定の環境変数からの読み込み
• Spring Bootはプロパティを環境変数から
バインドできる
以下は等価
property
spring.datasource.url=jdbc:mysql://localhost:3306/test
環境変数
SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/test
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
51


# Page. 52

![Page Image](https://bcdn.docswell.com/page/K746RDVVE1.jpg)

k8sで環境変数に注入
env:
- name: SPRING_DATASOURCE_INITIALIZE
value: &quot;false&quot;
- name: APPLICATION_LOGGING_LEVEL
valueFrom:
configMapKeyRef:
name: campaign-config
key: application.logging.level
optional: true
- name: LOGGING_LEVEL_ROOT
valueFrom:
configMapKeyRef:
name: campaign-config
key: logging.level.root
optional: true
- name: SPRING_DATASOURCE_URL
valueFrom:
secretKeyRef:
name: campaign-env
Copyright
© 2017
Yahoo Japan Corporation. All Rights Reserved.
key:
datasource-url
k8s/deployment.yaml
env:
- name: 環境変数名
valueFrom: 値の取得元
(ConfigMap or Secret)
52


# Page. 53

![Page Image](https://bcdn.docswell.com/page/LJ1VQZ34EG.jpg)

ヘルスチェックエンドポイント
• k8sがpodの死活チェックをするためのエ
ンドポイントが2種類ある
• Liveness probe
• Readiness probe
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
53


# Page. 54

![Page Image](https://bcdn.docswell.com/page/GJWLM9PZE2.jpg)

Liveness probe / Readiness probe
Liveness probe
• アプリケーションが生きてるかどうかをチェック
• NGならばpodを再作成
Readiness probe
• 利用可能になっているかのチェック
• OKになったらサービスイン
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
54


# Page. 55

![Page Image](https://bcdn.docswell.com/page/4EZMQ9KLJ3.jpg)

ズバトクでの実装方法
Liveness probe
• Actuatorを使い、status 200を返すだけのエ
ンドポイント作成
Readiness probe
• Actuatorのhealthエンドポイントを流用
• DBのチェックなどもやってくれる
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
55


# Page. 56

![Page Image](https://bcdn.docswell.com/page/Y76N6KQM7V.jpg)

コード例
@Endpoint(id = &quot;liveness&quot;)
public class LivenessEndpoint {
@Endpoint(id = &quot;readiness&quot;)
public class ReadinessEndpoint {
private final HealthEndpoint healthEndpoint;
public ReadinessEndpoint(HealthEndpoint healthEndpoint) {
this.healthEndpoint = healthEndpoint;
}
@ReadOperation
public Health execute() {
return Health.up().build();
}
@ReadOperation
public Health execute() {
return this.healthEndpoint.health();
}
}
}
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
56


# Page. 57

![Page Image](https://bcdn.docswell.com/page/G7556PRQ74.jpg)

Liveness probe / Readiness probe
deployment.yamlに設定を記述
livenessProbe:
httpGet:
path: /liveness
port: 9990
initialDelaySeconds: 60
timeoutSeconds: 1
periodSeconds: 5
readinessProbe:
httpGet:
path: /readiness
port: 9990
initialDelaySeconds: 20
timeoutSeconds: 5
periodSeconds: 5
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
application.yml
management:
security:
enabled: false
port: 9990
endpoints:
health:
path: readiness
外部からアクセス出来ないように
actuatorのportを9990に
57


# Page. 58

![Page Image](https://bcdn.docswell.com/page/9J2NM6DWER.jpg)

LivenessとReadinessをわけたわけ
• Liveness probeは軽くすべき
• また、DB等の外部システムダウンした際
はPod再起動しても効果が薄い
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
58


# Page. 59

![Page Image](https://bcdn.docswell.com/page/DEYPX929EM.jpg)

Graceful Shutdown
• Podが終了する際に適切な終了処理を行う
• 処理中のリクエストの対応
• リソースの破棄
→実装しなかったら、処理中にエラーが発生
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
59


# Page. 60

![Page Image](https://bcdn.docswell.com/page/VJN51L8D78.jpg)

Graceful Shutdownの実装
• ActuatorのShutdown Endpointを拡張し、
処理中のリクエストがなくなるまでWait
lifecycle:
preStop:
httpGet:
path: /shutdown
port: 9990
deployment.yaml
※ActuatorのShutdownEndpointはGracefulではないので注意
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
60


# Page. 61

![Page Image](https://bcdn.docswell.com/page/YE9Y54K8J3.jpg)

Graceful Shutdownの実装
• 通常はアプリケーションサーバの機能を
使って実装
• Jettyではkeepalive等の扱いがうまくいか
なかったので、独自でservletのFilterを使
い処理中セッションをカウントするようにし
た
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
61


# Page. 62

![Page Image](https://bcdn.docswell.com/page/GE86YQRZ7D.jpg)

アプリケーションログについて
• ログは標準出力に出す
• Podが終了したらファイルは消滅
• マイクロサービスの場合は相関IDは必須
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
62


# Page. 63

![Page Image](https://bcdn.docswell.com/page/LEL94XK1JR.jpg)

相関ID
• Spring Cloud Sleuthを使用
• 依存を追加するだけでリクエストで一意な
IDをログに出力
• サービス数が多いのでこれがなければ運
用がつらくなる
time:2018-03-22T13:52:22.855+09:00
time:2018-03-22T13:52:23.123+09:00
level:INFO trace_id:8f01dc2dc4a7f7b6
level:INFO trace_id:8f01dc2dc4a7f7b6
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
span_id:8f01dc2dc4a7f7b6
span_id:8f01dc2dc4a7f7b6
63


# Page. 64

![Page Image](https://bcdn.docswell.com/page/4JMZKL25EW.jpg)

開発フロー編
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
64


# Page. 65

![Page Image](https://bcdn.docswell.com/page/PJR6XKMZ79.jpg)

k8sの仕組みを活かすためのフロー
• Git上でオペレーションが完結するフロー
→ GitOps
• Pull Requestでオペレーション
• 環境毎のPull Requestは自動生成
• CI/CDは必須
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
65


# Page. 66

![Page Image](https://bcdn.docswell.com/page/PEXM6LV17X.jpg)

開発フロー
7. マージ
5. パブリッシュ
4. テスト/ビルド
GitHub
Docker
registry
Concourse CI
6. プルリクエスト
1. clone
3. プルリクエスト
Deploy
・・・
2. 開発/テスト
develop
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
e2e
production
66


# Page. 67

![Page Image](https://bcdn.docswell.com/page/3EKG1LQMJD.jpg)

Concourseで複雑なパイプラインを実現
パイプラインの定義はYAMLで定義しGit管理
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
67


# Page. 68

![Page Image](https://bcdn.docswell.com/page/L73NQ3P275.jpg)

テストの自動化
• このフローで安心してリリースするために
は、テスト自動化は必須
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
68


# Page. 69

![Page Image](https://bcdn.docswell.com/page/87DW94L6JG.jpg)

テストの自動化
E2E
テスト
機能テスト
• 3種類のテストを実装
• ユニットテスト
• クラス単体
• 機能テスト
• サービス単体
• E2Eテスト
ユニットテスト
テストピラミッド
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
• 全サービス結合
69


# Page. 70

![Page Image](https://bcdn.docswell.com/page/VJP9ZM4ZE8.jpg)

E2Eテスト
• 全サービスを通してのテスト
• JUnit
• Selenium
@Test
public void 抽選_01_くじを引く() throws Exception {
ログインケース
.ログインする(xxxx);
抽選ケース
.Action_抽選画面を開く(CAMPAIGN_PATH)
.Verify_抽選_抽選画面を表示(xxxx)
.Verify_抽選_キャンペーン期間表示();
}
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
70


# Page. 71

![Page Image](https://bcdn.docswell.com/page/2EVMW9XMEQ.jpg)

リリース時間の変化
• これまで
• パッケージングからサービスアウトなどを含
むリリース完了まで数時間
• システム移行後
• 実働10分程度でデプロイ完了
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
71


# Page. 72

![Page Image](https://bcdn.docswell.com/page/57GGDZVX7L.jpg)

その他アーキテクチャ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
72


# Page. 73

![Page Image](https://bcdn.docswell.com/page/4EQX1L657P.jpg)

データベースのスケーリング
• k8sによってアプリケーションのスケーリン
グはできたが、DBのスケールもしたい
→ シャーディングの導入
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
73


# Page. 74

![Page Image](https://bcdn.docswell.com/page/KJ46RD4V71.jpg)

DBシャーディングについて
振り分け
Policy
ID等でノードを決定
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
• DBの水平分割
• EclipseLinkの機能を
使ってDBシャーディング
• アノテーションでシャー
ディングポリシーを指定
可能
74


# Page. 75

![Page Image](https://bcdn.docswell.com/page/LE1VQZ447G.jpg)

JPAのEntity実装
@Entity
@Data
@Table(name = ”sample&quot;)
PartitioningPolicyを設定するだけ
@IdClass(SamplePk.class)
@Partitioning(
name = ”sampleIdPartitioning&quot;,
partitioningClass = SampleIdPartitioningPolicy.class)
@Partitioned(”sampleIdPartitioning&quot;)
@AllArgsConstructor
@NoArgsConstructor
public class SampleJpaEntity {
@Id
Long sampleId;
@Id
Integer hogeId;
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
75


# Page. 76

![Page Image](https://bcdn.docswell.com/page/GEWLM9XZ72.jpg)

ID生成の問題
アプリやDBが分散することでDBサイドでの
ID発行(AUTO_INCREMENT)が扱いづらくなった
• →アプリサイドでの発行が必要
• →標準規格のUUIDは36byteもあり性能面の
不安
• f48b53b8-fe1e-4670-a19a-650fda31bced
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
76


# Page. 77

![Page Image](https://bcdn.docswell.com/page/47ZMQ96LE3.jpg)

UUIDは件数が増えると性能が低下
MySQLでのINSERT時間
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
77


# Page. 78

![Page Image](https://bcdn.docswell.com/page/YJ6N6K2MJV.jpg)

64bitの独自ID体系を採用
timestamp
machine id
sequence
41bit
12bit
10bit
63bit
timestamp(41bit) : 現在のunixtime(milliseconds)から、ある時点のunixtimeを引いた値
machine id(12bit) : 生成器ごとに割り当てられたID
sequence(10bit) : 生成器ごとに採番するsequence番号
BIGINTに収まりほぼインクリメンタルなので、MySQLで
効率的に扱える
Twitterのsnowflakeを参考に実装
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
78


# Page. 79

![Page Image](https://bcdn.docswell.com/page/GJ556P2QJ4.jpg)

一意になるようにMachine IDを管理
定期的にheartbeat
MachineID
サービス
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
machineId=1234
各サービス
79


# Page. 80

![Page Image](https://bcdn.docswell.com/page/LE3NQ3KZE5.jpg)

まとめ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
80


# Page. 81

![Page Image](https://bcdn.docswell.com/page/8EDW94347G.jpg)

k8sに載せるのに必要なこと
• コンテナ
• Dockerイメージの作成
• アプリケーション
•
•
•
•
クラウドネイティブ化
Liveness probe / Readiness probe
Graceful Shutdown
ログ出力
• 開発フローの対応
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
81


# Page. 82

![Page Image](https://bcdn.docswell.com/page/V7P9ZM4VJ8.jpg)

k8sに移行してみて
• リリース時間など、運用コストは大幅に削
減できた
• 数時間 → 10分
• 負荷についてもスケールできるように
• 2000 req/s ↑
• ログが集約され、調査コストも削減できた
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
82


# Page. 83

![Page Image](https://bcdn.docswell.com/page/2JVMW9XRJQ.jpg)

大変だったところ
• 利用技術のスイッチ
• パッケージングやCI/CD、利用言語も変更したため
• 社内PFとの連携
• IPベースのACLからの変更
• 考え方のスイッチ
• 従来のアーキテクチャからCloud Nativeなものへ
• まだ、k8sのポテンシャルを十分引き出せていない
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
83


# Page. 84

![Page Image](https://bcdn.docswell.com/page/5EGGDZV6EL.jpg)

これから
• コンテナデザインパターンの活用
• 共通機能を別コンテナに切り出し
• サイドカーパターンなど
• リリース方法の検討
• カナリアリリース
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
84


# Page. 85

![Page Image](https://bcdn.docswell.com/page/4JQX1L62EP.jpg)

情報技術で
人々のマネーライフの課題を解決する
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
85


