開発者向けの基盤をつくる
Building A Platform for Internal Developers
Slide 2
Slide 2 text
Taichi Nakashima
@deeeet / @tcnksm
Slide 3
Slide 3 text
2013年
Software Engineer
at Service Development Team
Tech Lead
at Microservices Platform Team
2018年
Rakuten, Inc.
2017年
Software Engineer
at SRE Team
Mercari, Inc.
2015年
Software Engineer
at Internal PaaS Team
Slide 4
Slide 4 text
https://www.amazon.co.jp/dp/4297107279
改訂2版出ます at 2019/8/1
@tenntennさんが私の章を引き継いてくれました !
Slide 5
Slide 5 text
Agenda
● Why Microservices Platform?
● How we build Platform? (Philosophy)
● What we are building?
Listing
Shipping
Notification
Purchase
Login
Search
DB
Monolith
Review
Backend team
Timeline Search
Slide 16
Slide 16 text
Listing
Shipping
Notification
Purchase
Login
Search
DB
Monolith
Review
Backend team
Timeline Search
Slide 17
Slide 17 text
Listing
Shipping
Notification
Purchase
Login
Search
DB
Monolith
Review
Backend team
Timeline Search
Slide 18
Slide 18 text
Listing
Shipping
Notification
Purchase
Login
Search
DB
Monolith
Review
Backend team
Timeline Search
人が増えても一日にリリースできる回数に限界がきて
いた...
Slide 19
Slide 19 text
Listing
Shipping
Notification
Purchase
Login
Search
DB
Monolith
Review
Listing
DB
User
DB
Item
DB
Shipping
DB
Timeline
DB
Microservices
Backend team
Timeline Search
Slide 20
Slide 20 text
Listing
Shipping
Notification
Purchase
Login
Search
DB
Monolith
Review
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Backend team
Timeline Search
Slide 21
Slide 21 text
Listing
Shipping
Notification
Purchase
Login
Search
DB
Monolith
Review
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Backend team
Timeline Search
各チームが独立してリリースを行えれば 1日にリリー
スできる数は飛躍的に増える = より速く機能を提供で
きる!
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Slide 33
Slide 33 text
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
Slide 34
Slide 34 text
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
Slide 35
Slide 35 text
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
Slide 36
Slide 36 text
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
出品はできなくても
Timelineは閲覧できる
Slide 37
Slide 37 text
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
Flexible Scale
サービスごとに独立してス
ケールすることができリソース
を最適化できる
Slide 38
Slide 38 text
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
Flexible Scale
サービスごとに独立してス
ケールすることができリソース
を最適化できる
Slide 39
Slide 39 text
Item
Item
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
Flexible Scale
サービスごとに独立してス
ケールすることができリソース
を最適化できる
Slide 40
Slide 40 text
Listing
DB
Listing team
User
DB
User team
Item
DB
Item team
Shipping
DB
Shipping team
Timeline
DB
Timeline team
Microservices
Resilient
1つのサービスが死んでも一
部のサービスを継続して動か
せる
Flexible Scale
サービスごとに独立してス
ケールすることができリソース
を最適化できる
Simplicity
小さなコンテキストで開発する
ことにより新機能の追加が容
易になる
Develop
Monolith
Test Deploy Operate
Software Lifecycle
Slide 45
Slide 45 text
Develop
Monolith
Test Deploy Operate
QA team SRE team
Monolith Team Responsibility
Backend Team
Slide 46
Slide 46 text
Service A Team
QA team SRE team
Develop
Service A
Test Deploy Operate
Service B Team
Develop
Service B
Service C Team
Develop
Service C
Microservices Bad Team Responsibility
Slide 47
Slide 47 text
Service A Team
Develop
Service A
Test Deploy Operate
Service B Team
Develop
Service B
Service C Team
Develop
Service C
Test Deploy Operate
Test Deploy Operate
Microservices Ideal Team Responsibility
Slide 48
Slide 48 text
Service A Team
Backend Engineers
Frontend Engineers
SREs
QA
Service B Team
Backend Engineers
QA
SREs
Service C Team
Backend Engineers
Cross Functional Teams
重要なサービスであれば
Responsibilityごとに専門のRole
が存在する (e.g., Embedded SRE)
サービスによってはBackend
Engineerのみで開発から運用ま
でのResponsibilityを担う必要が
ある
Slide 49
Slide 49 text
Develop Test Deploy Operate
Prepare QA environment
Setup CI
Run integration testing
Run load testing
Provision infrastructure
Setup automated delivery
Prepare application configuration
Prepare monitoring
Prepare observability
Prepare on-calling shift
Too many things to do
Slide 50
Slide 50 text
No content
Slide 51
Slide 51 text
Develop Test Deploy Operate
Platform
Platform Team
Slide 52
Slide 52 text
Backend Team
Microservicesの
開発と運用に注力する
基盤やDevOpsツールの
開発と運用に注力する
Microservicesのデザイン
のレビューや移行戦略に注
力する
Architect Team Platform Team
Slide 53
Slide 53 text
Number of microservices + teams
Number of tools
Platform
No Platform
各チームが自分たちで Toolsetsを作ると似たような
ツールが大量に作られコスト的にも無駄になる
基盤チームが専属的にツールの開発と
運用を担うことでツールの乱立を抑え,
基盤の改善のLeverageが効く
Slide 54
Slide 54 text
Agenda
● Why Microservices Platform?
● How we build Platform? (Philosophy)
● What we are building?
Productivity =
Output
Input
Product, Service, Function
GMV
Customer satisfactions
Engineering efforts
Develop time
Test time
Deploy time
Operate time
...
Slide 60
Slide 60 text
https://itrevolution.com/book/accelerate/
Delivery lead time
企画から実際に機能やサービスをリリースするまでにかかった
か?
Deployment frequency
どれくらいの頻度でコードをリリースしているか
?
Time to restore service
インシデントが発生してから普及までどれだけの時間がかかった
か?
Change rate fail
どれくらいの頻度で変更が失敗したか
?どれくらいの頻度で
Rollbackしたか?
etcd
API server
Scheduler Controller
Manager
kubelet
Master
Node
kubelet
Node
Container B
Slide 86
Slide 86 text
etcd
API server
Scheduler Controller
Manager
kubelet
Master
Node
kubelet
Node
Container B
Declarative configuration
Container Aを3 CPUsと1G Memで
3つ起動する
Slide 87
Slide 87 text
etcd
API server
Scheduler Controller
Manager
kubelet
Master
Node
kubelet
Node
Container B
Declarative configuration
Container Aを3 CPUsと1G Memで
3つ起動する
Scheduling
リソースの余裕のある
Nodeを探して
Containerを配置する
Container A
Container A
Container A
Slide 88
Slide 88 text
etcd
API server
Scheduler Controller
Manager
kubelet
Master
Node
kubelet
Node
Container B
Declarative configuration
Container Aを3 CPUsと1G Memで
3つ起動する
Scheduling
リソースの余裕のある
Nodeを探して
Containerを配置する
Container A
Container A
Container A
Slide 89
Slide 89 text
etcd
API server
Scheduler Controller
Manager
kubelet
Master
Node
kubelet
Node
Container B
Declarative configuration
Container Aを3 CPUsと1G Memで
3つ起動する
Scheduling
リソースの余裕のある
Nodeを探して
Containerを配置する
Container A
Container A
Container A
Self healing
Containerが死んだときに
自動で復旧する
Slide 90
Slide 90 text
etcd
API server
Scheduler Controller
Manager
kubelet
Master
Node
kubelet
Node
Container B
Declarative configuration
Container Aを3 CPUsと1G Memで
3つ起動する
Scheduling
リソースの余裕のある
Nodeを探して
Containerを配置する
Container A
Container A
Container A
Self healing
Containerが死んだときに
自動で復旧する
Load balancing
クラスタ内の他のContainerへの接続す
る方法を提供する
Slide 91
Slide 91 text
etcd
API server
Scheduler Controller
Manager
kubelet
Container A
Master
Node
kubelet
Node
Container A
Container A
Container B
Controller
Kubernetesでは大量の独立した
Controllerが動いておりそれぞれが
Reconciliation loopを実行している.
Slide 92
Slide 92 text
No content
Slide 93
Slide 93 text
Desired state
Container Aを3つ動かしたい
Slide 94
Slide 94 text
Desired state
Container Aを3つ動かしたい
Current state
Container Aは2つ動いている
Slide 95
Slide 95 text
Desired state
Container Aを3つ動かしたい
Current state
Container Aは2つ動いている
Action
Container Aを1つ起動する
Develop Test Deploy Operate
Prepare QA environment
Setup CI
Run integration testing
Run load testing
Provision infrastructure
Setup automated delivery
Prepare application configuration
Prepare monitoring
Prepare observability
Prepare on-calling shift
Too many things to do
Slide 118
Slide 118 text
Namespace: Service A
Kubernetes
GCP Project: Service A
Service A Team
Spanner
Container A
Container A
Container A
Kubernetes setup
専用のnamespaceを準備する
GCP Setup
専用のProjectを準備してDatabaseなど
をセットアップする
Slide 119
Slide 119 text
How to provision Infra?
Microservicesを作るたびにインフラのセットアップを Platformに依頼するとス
ピードが落ちる.開発者が自分たちでインフラを管理できる必要がある.どのよ
うに実現しているか?
Slide 120
Slide 120 text
No content
Slide 121
Slide 121 text
GitHub PR Workflow
Slide 122
Slide 122 text
PR Plan & Apply
microservices-terraform CircleCI
Service A Team
Service A Team
Service A Team
PR
PR
Slide 123
Slide 123 text
PR Plan & Apply
Platform Team
microservices-terraform CircleCI
Service A Team
Setup
Service A Team
Service A Team
PR
PR
Automation
Terraformの実行やStateの管理を行
う.Lintにより機械的なReviewやPolicy
のチェックを行う
Slide 124
Slide 124 text
Develop Test Deploy Operate
Toolsets
Slide 125
Slide 125 text
References
● Kubernetes manifests management and operation in Mercari
○ https://speakerdeck.com/b4b4r07/kubernetes-manifests-management-and-operation-in-mercari
● Continuous Delivery for Microservices with Spinnaker at Mercari
○ https://speakerdeck.com/tcnksm/continuous-delivery-for-microservices-with-spinnaker-at-mercari
● Securing microservices continuous delivery using grafeas and kritis
○ https://www.slideshare.net/VishalBanthia1/securing-microservices-continuous-delivery-using-grafeas-and
-kritis
● How we monitor microservices at Mercari microservices platform team
○ https://speakerdeck.com/spesnova/how-we-monitor-microservices-at-mercari-microservices-platform-tea
m