Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ADC2016: Axion meets HashiCorp
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
AGAWA Koji
August 09, 2016
Technology
840
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ADC2016: Axion meets HashiCorp
社内イベント向けの資料
AGAWA Koji
August 09, 2016
More Decks by AGAWA Koji
See All by AGAWA Koji
Software Architecture in an AI-Driven World
atty303
79
47k
PipeCDプラグインへの期待 / Anticipating PipeCD Plugins
atty303
0
120
EmscriptenでC/C++アプリをWASM化してブラウザで動かしてみた
atty303
0
660
良いソフトウェアとコードレビュー / Good software and code review
atty303
38
18k
Scala + Caliban で作るGraphQL バックエンド / Making GraphQL Backend with Scala + Caliban
atty303
0
600
Scala.jsとAndroidでドメイン層を共有しよう / Scala.js and Android
atty303
0
810
もう一つのビルドツール mill で作る Docker イメージ / Build docker image with mill the yet another build tool
atty303
2
2.6k
Case of Ad Delivery System is Implemented by Scala and DDD
atty303
4
3.7k
ログのメトリックを取ってみる話
atty303
0
1k
Other Decks in Technology
See All in Technology
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
0
160
AIソロプレナー時代に2ヶ月で20人増員した事業創造会社の開発組織の話
miyatakoji
0
600
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
380
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
4k
How Timee Delivers Day 1 Production Ready LLM Features
tomoyks
0
130
Agentic Web
dynamis
1
200
なぜ Platform Engineering の土台に Kubernetes を選ぶのか
r4ynode
2
580
AIっぽい文章を採点して人間らしく直すアプリを作ってみた
yama3133
2
130
200個のGitHubリポジトリを横断調査したかった
icck
0
110
爆速でマルチプロダクトを立ち上げる時 事業・CTO目線で大事にしたい事
miyatakoji
0
100
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
790
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
780
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
200
Rails Girls Zürich Keynote
gr2m
96
14k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
How to make the Groovebox
asonas
2
2.2k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
420
The agentic SEO stack - context over prompts
schlessera
0
810
Transcript
Axion meets HashiCorp @atty303 / AdTech Core Development Group ©
2016 CyberAgent, Inc. 1
ࣗݾհ Ѩ ߞ࢘ 4 2016-02 ʙ ج൫։ൃάϧʔϓ © 2016 CyberAgent,
Inc. 2
Agenda 4 Consul : Service Discovery 4 Nomad : Container
Scheduling 4 Terraform : Infrastructure as a Code © 2016 CyberAgent, Inc. 3
Axion Overview © 2016 CyberAgent, Inc. 4
What's Axion ? 4 ͚ࣾ(ϚΠΫϩ)αʔϏε 4 σʔλϕʔεͷΑ͏ͳͷ 4 ൺֱతߴ͍ࢀরස (10k
ops/s ~) 4 εϥΠυͷ IP ݻ༗໊ࢺͳͲμϛʔͰ͢ © 2016 CyberAgent, Inc. 5
Axion ։ൃʹ͓͚Δ ٕज़తઓ © 2016 CyberAgent, Inc. 6
Docker ͱ ͖߹͏! (AWS/GCP ʹཔΒͣ) © 2016 CyberAgent, Inc. 7
Docker - Technology Radar 4 Technology Radar 2016-04 1 Ͱ
ADOPT(࠾ ༻ͤΑ) 4 ADOPT = ͜ͷτϨϯυ ʹࠓ͙͢Δ͖ 1 https://www.thoughtworks.com/radar/tools/ docker © 2016 CyberAgent, Inc. 8
Docker ͱ͖߹͏ͨΊʹ… Nomad ΫϥελʹΞϓϦΛσϓϩΠͯ͠ɺ σϓϩΠͨ͠ΞϓϦͷΤϯυϙΠϯτཧʹ Consul ͕ඞཁͰɺ͜ΕΒͷڥߏஙΛ Terraform ʹΒͤΑ͏ɻ ©
2016 CyberAgent, Inc. 9
Consul Service Discovery © 2016 CyberAgent, Inc. 10
What's Consul ? 4 Service ͷཧͱݕࡧ 4 Key-Value Storage 4
ߴ͍Մ༻ੑΛඋ͑ͨࢄγεςϜ © 2016 CyberAgent, Inc. 11
Technology Radar 4 Technology Radar 2016-04 2 Ͱ ADOPT(࠾ ༻ͤΑ)
4 ADOPT = ͜ͷτϨϯυ ʹࠓ͙͢Δ͖ 2 https://www.thoughtworks.com/radar/tools/ consul © 2016 CyberAgent, Inc. 12
Service Discovery ωοτϫʔΫΛ௨ͯ͠ػೳΛఏڙ͢Δ Service Λ ൃݟ͢Δػߏ 4 Service ͷྫ: api,
mysql, kafka 4 Service ͷϝϯόʔ IP:PORT ͷϦετ 4 ϔϧενΣοΫͰϝϯόʔͷࢮ׆ࢹ 4 HTTP ͱ DNS Ͱ͍߹Θ͕ͤͰ͖Δ © 2016 CyberAgent, Inc. 13
DNS Ͱ A Ϩίʔυ͍߹Θͤ $ dig @127.0.0.1 -p 8600 kafka.service.consul
;; QUESTION SECTION: ;kafka.service.consul. IN A ;; ANSWER SECTION: kafka.service.consul. 0 IN A 192.168.0.21 kafka.service.consul. 0 IN A 192.168.0.20 kafka.service.consul. 0 IN A 192.168.0.19 © 2016 CyberAgent, Inc. 14
DNS Ͱ A Ϩίʔυ͍߹Θͤ 4 Consul agent Λ DNS αʔόʹࢦఆ͍ͯ͠߹
Θͤ 4 *.service.consul Λղܾ͢ΔͱαʔϏεͷϝ ϯόʔ͕ฦͬͯ͘Δ 4 ϦετͷฒͼϥϯμϜ (DNS ϥϯυϩϏϯ) 4 ϔϧενΣοΫΛ௨ͬͨੜ͖͍ͯΔϝϯόʔͩ ؚ͚͕·ΕΔ © 2016 CyberAgent, Inc. 15
DNS Ͱ SRV Ϩίʔυ͍߹Θͤ $ dig @127.0.0.1 -p 8600 axion-api-admin.service.consul
SRV ;; QUESTION SECTION: ;axion-api-admin.service.consul. IN SRV ;; ANSWER SECTION: axion-api-admin.service.consul. 0 IN SRV 1 1 42319 acd-stg-axion-dock-y002.node.openstack-stg.consul. axion-api-admin.service.consul. 0 IN SRV 1 1 38475 acd-stg-axion-dock-y001.node.openstack-stg.consul. ;; ADDITIONAL SECTION: acd-stg-axion-dock-y002.node.openstack-stg.consul. 0 IN A 192.168.0.26 acd-stg-axion-dock-y001.node.openstack-stg.consul. 0 IN A 192.168.0.27 © 2016 CyberAgent, Inc. 16
DNS Ͱ SRV Ϩίʔυ͍߹Θͤ 4 SRV ϨίʔυͰ͋Εϙʔτ·Ͱ͔Δ 4 ϙʔτΛಈతׂΓͯ͢Δͱ͖ʹ༗༻ 4
ͨͩ͠ར༻ଆͰ SRV ͷϨκϧό͕ඞཁ 4 طʹ SRV ΛಡΉ࣮͕ͳ͚Ε HTTP API ΛಡΉ࣮Λॻ͍ͨ΄͏ָ͕͔ͱ © 2016 CyberAgent, Inc. 17
HTTP Ͱͷ͍߹Θͤ $ curl -s http://localhost:8500/v1/catalog/service/kafka | jq . [
{ "Node": "acd-stg-axion-kafka-y001.local", "Address": "192.168.0.19", "ServiceID": "kafka", "ServiceName": "kafka", "ServiceTags": [], "ServiceAddress": "", "ServicePort": 9092, "ServiceEnableTagOverride": false, "CreateIndex": 55508, "ModifyIndex": 151479 }, ... ] © 2016 CyberAgent, Inc. 18
HTTP Ͱͷ͍߹Θͤ 4 ී௨ʹ JSON Ͱฦͬͯ͘Δ 4 DNS ͱҧͬͯࢮΜͰΔϝϯόʔΛΔ͜ͱ͕ Ͱ͖Δ
© 2016 CyberAgent, Inc. 19
HTTP Blocking Query 4 HTTP API Ͱఏڙ͞Ε͍ͯΔσʔλͷมߋΛ ࢹͰ͖Δ 4 DNS
HTTP ΛϙʔϦϯάͤͣʹଈ࠲ʹϝϯ όʔมߋΛݕͰ͖Δ 4 ͍ΘΏΔ Server Push (HTTP Long Polling) 4 Non-Blocking ͳ HTTP Client Ͱ͏͜ͱ © 2016 CyberAgent, Inc. 20
αʔϏεͷొ 4 ઃఆϑΝΠϧͰ੩తʹొ 4 ϗετʹΠϯετʔϧ͞Ε͍ͯΔϛυϧ ΣΞͳͲ 4 HTTP API Ͱಈతʹొ
4 ಈతʹσϓϩΠ͢ΔΞϓϦέʔγϣϯͳͲ 4 Docker registrator Nomad ͱ౷߹ © 2016 CyberAgent, Inc. 21
ྫ͑ Kafka Λొ͢Δ { "service": { "name": "kafka-broker", "port": 9092,
"checks": [ { "id": "kakfa-broker", "tcp": "localhost:9092", "interval": "5s", "timeout": "1s" } ] } } 4 Kafka ͕ಈ͍͍ͯΔϗετͰ Consul ͷઃఆϑΝΠϧʹهड़ 4 tcp/9200 ΛϔϧενΣοΫ © 2016 CyberAgent, Inc. 22
Docker ͱͷ࿈ܞ (registrator 3) docker run --name=registrator -d --net=host --restart=unless-stopped
--log-driver=journald \ -v /var/run/docker.sock:/tmp/docker.sock \ gliderlabs/registrator:v6 \ -tags registrator -resync 3600 \ -ip $(curl -s http://169.254.169.254/2009-04-04/meta-data/local-ipv4) \ consul://localhost:8500 4 Docker ίϯςφΛࣗಈతʹ Consul Service ͱͯ͠ొͯ͘͠ΕΔπʔϧ 3 https://github.com/gliderlabs/registrator © 2016 CyberAgent, Inc. 23
Docker registrator docker run --name=cadvisor -d \ --restart=unless-stopped --log-driver=journald \
--dns=192.168.168.1 --privileged=true \ -p 9101:8080 \ -e "SERVICE_NAME=cadvisor" \ -e "SERVICE_CHECK_HTTP=/" \ -e "SERVICE_CHECK_INTERVAL=30s" \ google/cadvisor:v0.22.0 4 ڥม SERVICE_* ʹ Service ͷఆٛΛॻ͍ͯίϯςφΛىಈ 4 registrator ͕ίϯςφىಈΛݕग़ͯ͠ Consul ొ 4 ίϯςφ͕ࢭ·ͬͨͱ͖ Consul ͔Βআ © 2016 CyberAgent, Inc. 24
Key-Value Storage $ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1 true
$ curl http://localhost:8500/v1/kv/web/key1 [ { "CreateIndex":97, "ModifyIndex":97, "Key":"web/key1", "Flags":0, "Value":"dGVzdA==" } ] © 2016 CyberAgent, Inc. 25
Key-Value Storage 4 ֊Խ͞ΕͨΩʔͷ GET/PUT/DELETE 4 Blocking Query Ͱ watch
Ͱ͖Δ͠ɺ CAS ͋Δ 4 εέʔϥϏϦςΟແ͍ͷͰҙ 4 ϗετΞϓϦͷઃఆͳͲࢀরසͷ͍ σʔλͷΈ֨ೲ © 2016 CyberAgent, Inc. 26
consul-template 4 Service KVS ͷมߋΛݕͯ͠ςϯϓϨʔ τϑΝΠϧΛߋ৽ɺίϚϯυΛ࣮ߦͯ͘͠ΕΔ πʔϧ 4 Consul
ʹରԠ͍ͯ͠ͳ͍πʔϧ/ϛυϧΣΞ ͱ Consul ͷΪϟοϓΛຒΊΔ © 2016 CyberAgent, Inc. 27
consul-template ͱ HAProxy ͷྫ global daemon maxconn {{key "service/haproxy/maxconn"}} listen
mysql-slave bind *:3306{{range service "mysql-slave"}} server {{.Node}} {{.Address}}:{{.Port}}{{end}} 4 haproxy.conf ͷςϯϓϨʔτΛ४උ $ consul-template -consul localhost:8500 -template \ haproxy.ctmpl:/etc/haproxy/haproxy.conf:systemctl reload haproxy 4 consul-template Λىಈ͓ͯ͘͠ © 2016 CyberAgent, Inc. 28
consul-template ͱ HAProxy ͷྫ global daemon maxconn 128 listen mysql-slave
bind *:3306 server dbslave01 10.0.0.1:3306 server dbslave02 10.0.0.2:3306 4 Service ͷมߋΛݕͯ͠ HAProxy ͷઃఆϑΝΠ ϧΛߋ৽ͯ͠Ϧϩʔυͯ͘͠ΕΔ © 2016 CyberAgent, Inc. 29
Consul ͷΞʔΩςΫνϟ 4 Server(Master) ઐ༻ϗετΛ 3 or 5 4
ଞͷશͯͷϗετͰ Agent(Client) Λ࣮ߦ © 2016 CyberAgent, Inc. 30
Axion ͱ Consul © 2016 CyberAgent, Inc. 31
Consul ͱ dnsmasq # /etc/resolv.conf nameserver 127.0.0.1 # /etc/dnsmasq.conf server=/consul/127.0.0.1#8600
4 શͯͷϗετͰ Consul ͱ dnsmasq Λ࣮ߦ 4 Consul ͷଘࡏΛҙࣝ͠ͳͯ͘ *.consul Λ ໊લղܾͰ͖Δ © 2016 CyberAgent, Inc. 32
Service 4 શͯͷωοτϫʔΫαʔϏεΛ Consul ʹొ © 2016 CyberAgent, Inc. 33
ϛυϧΣΞͷଓ 4 ΞϓϦ͔ΒͷϛυϧΣΞͷଓͰ Consul ͷ DNS Λࢀর // Aerospike new
com.aerospike.client.async.AsyncClient( policy, "aerospike.service.consul", 3000) // Kafka Consumer kafka.consumer.bootstrap.servers = "kafka.service.consul:9092" // ࣮ࡍ Configurable Ͱ͢ © 2016 CyberAgent, Inc. 34
ΫϥελϦϯάͱ Consul 4 Kafka, Aerospike, Cassandra, Redis Cluster ͷ Α͏ͳΫϥελΛΉϛυϧΣΞͰଓઌͱͯ͠
ࢦఆ͢Δͷ ΫϥελʔͷίϯλΫτϙΠϯτ 4 ΫϥΠΞϯτੜ͖͍ͯΔϊʔυʹଓͰ͖Εɺ ͔ͦ͜ΒΫϥελʔϝϯόʔΛऔಘ͢Δ 4 Consul ͷ DNS ੜ͖͍ͯΔϝϯόʔ͚ͩฦ͢ͷ ͰɺՄ༻ੑͷͨΊʹෳϗετΛྻڍ͢Δඞཁ͕ແ ͘ͳΔ © 2016 CyberAgent, Inc. 35
axion-client 4 Axion ͷ API αʔόʹଓ͢ΔΫϥΠΞϯτϥΠϒϥϦ 4 τϥϯεϙʔτʹ Scala ͷ
RPC ϥΠϒϥϦͰ͋Δ finagle Λ ར༻ 4 finagle ͕ΫϥΠΞϯταΠυͷϩʔυόϥϯαʔΛ͍࣋ͬͯ ΔͨΊɺͦͷϝϯόʔΛ Consul ͷαʔϏεͱಉظ͢Δίʔυ Λ࣮ͯ͠ར༻ 4 Finagle Resolver ͷॻ͖ํ finagle-consul 4 Λࢀߟʹ Blocking Query Λར༻࣮ͯ͠ 4 https://github.com/kachayev/finagle-consul © 2016 CyberAgent, Inc. 36
axcsync 4 Consul ͷ Service ͱ BIG-IP ͷ Pool Member
Λಉظ 4 consul-template + axc 5 + python εΫϦϓ τͰ࣮ 5 https://adtech.cyberagent.io/techblog/archives/59 © 2016 CyberAgent, Inc. 37
Prometheus 4 Pull ܕͷࢹγεςϜ Prometheus Λ͍ͬͯΔ 4 ࢹରΛऔಘ͢Δͷʹ Consul Service
Λར༻ (૬ੑൈ܈ !) scrape_configs: - job_name: 'consul' consul_sd_configs: - server: '192.168.168.1:8500' services: - prometheus-pushgateway - prometheus-node-exporter - prometheus-consul-exporter - prometheus-burrow - cadvisor - axion-api-admin © 2016 CyberAgent, Inc. 38
Consul Λ࠾༻ͨ͠ཧ༝ Docker ίϯςφͷಈతஔ͢Δ߹ɺαʔϏε ͷஔΛܾΊଧͪͰ͖ͳ͍ͷͰ Service Discovery ػߏ͕ඞਢʹͳΔ 4 ZooKeeper
ʹͳ͍ DNS ͱ HTTP ʹΑΔ؆ ୯ͳΞΫηε 4 etcd ʹͳ͍ Service ͷϔϧενΣοΫ 4 HashiCorp ͱ͍͏ϒϥϯυ © 2016 CyberAgent, Inc. 39
Consul ·ͱΊ 4 Service Discovery ͕͋Δ͜ͱΛલఏʹγες ϜΛΉ͜ͱͰίϯϙʔωϯτͷґଘؔΛ៉ ྷʹදݱͰ͖Δ 4 αʔϏεͷಈతͳมԽͷରԠ͕ඇৗʹߦ͍
͍͢ 4 Docker ʹؔͳ͘༗༻ © 2016 CyberAgent, Inc. 40
Consul ·ͱΊ 4 Consul ϋϚΓͲ͜Ζ͕ͳ͘ૉʹ͑ͨ ! 4 ඞཁ࠷খݶͷγϯϓϧͳػೳηοτͰ͋Γͳ͕ ΒԠ༻ੑ͕ߴ͍ 4
ಋೖͷϦεΫ͕ແ͍Α͏ʹࢥ͑Δ 4 Kubernetes ͳͲ SD Λ͍࣋ͬͯΔͷΛ͏ ߹ඞཁͳ͍͔ © 2016 CyberAgent, Inc. 41
Nomad Container Scheduling © 2016 CyberAgent, Inc. 42
What's Nomad ? 4 Docker Ϋϥελͷཧπʔϧ 4 AWS ECS, Kubernetes,
Docker Swarm, Mesos ͱಉׂ͡ 4 Ϋϥελʹίϯςφ(ΞϓϦ)Λεέδϡʔϧ (σϓϩΠ)͢Δ 4 Consul ͱͷΠϯςάϨʔγϣϯ © 2016 CyberAgent, Inc. 43
Technology Radar 4 Technology Radar 2016-04 6 Ͱ ASSESS(ௐࠪͤΑ) 4
ASSESS = ࠓ͙͢࠾༻͖͢ͱ ݴΘͳ͍͕ɺ͓ͯ͘͠ ͖ 4 ͪͳΈʹ Kubernetes TRIAL(ࢼߦͤΑ) 4 TRIAL = ϦεΫͷ͍ϓϩδΣ ΫτͰ࠾༻ͯ͠ΈΔ͜ͱΛਪ ͢Δ 6 https://assets.thoughtworks.com/assets/ technology-radar-apr-2016-en.pdf © 2016 CyberAgent, Inc. 44
Nomad ͷΞʔΩςΫνϟ 4 Server ઐ༻ϗετΛ 3 or 5 4
Docker Ϋϥελʹ͢ΔϗετͰ Client Λ࣮ߦ © 2016 CyberAgent, Inc. 45
Job ఆٛ job "axion-api" { type = "service" # or
"batch" or "system" group "api" { count = 2 task "api" { driver = "docker" config { image = "internal-repository/axion-api:$TAG" port_map { thrift = 8000 } } } } } © 2016 CyberAgent, Inc. 46
ϦιʔεׂΓͯ task "api" { resources { cpu = 8000 #
MHz memory = 4096 # MB disk = 20000 # MB network { mbits = 100 # MBits port "thrift" { static = 8888 } } } } © 2016 CyberAgent, Inc. 47
Consul Service ొ task "api" { service { name =
"axion-api-thrift" port = "thrift" check { type = "tcp" interval = "2s" timeout = "1s" } } } © 2016 CyberAgent, Inc. 48
Job ͷ࣮ߦ $ nomad run axion-api.nomad ==> Monitoring evaluation "50f80881"
Evaluation triggered by job "axion-api" Allocation "73526b78" created: node "0cc2a12f", group "api" Evaluation status changed: "pending" -> "complete" ==> Evaluation "50f80881" finished with status "complete" © 2016 CyberAgent, Inc. 49
Job ͷঢ়ଶ $ nomad status axion-api ID = axion-api Name
= axion-api Type = service Priority = 50 Datacenters = openstack-stg Status = running Periodic = false ==> Evaluations ID Priority Triggered By Status 3bc903ef 50 rolling-update complete 3b772796 50 job-register complete ==> Allocations ID Eval ID Node ID Task Group Desired Status 45f2e143 3bc903ef 7a6b1272 api run running 546a9c55 3b772796 8959a37c api run running © 2016 CyberAgent, Inc. 50
ஔ(Alloc)ͷঢ়ଶ $ nomad alloc-status 45f2e143 ID = 45f2e143 Eval ID
= 3bc903ef Name = axion-api.api[1] Node ID = 7a6b1272 Job ID = axion-api Client Status = running ==> Task Resources Task: "api" CPU Memory MB Disk MB IOPS Addresses 8000 4096 20000 0 admin: 10.4.85.27:40660 thrift: 10.4.85.27:9999 ==> Task "api" is "running" Recent Events: Time Type Description 07/07/16 16:38:49 JST Started Task started by client 07/07/16 16:38:45 JST Received Task received by client © 2016 CyberAgent, Inc. 51
ϩάͷ֬ೝ $ nomad fs ls 45f2e143 alloc/logs Mode Size Modfied
Time Name -rw-r--r-- 3.5 kB 07/07/16 16:38:52 JST api.stderr.0 -rw-r--r-- 4.6 kB 08/07/16 09:14:31 JST api.stdout.0 # nomad fs cat 45f2e143 alloc/logs/api.stdout.0 © 2016 CyberAgent, Inc. 52
શ Job ͷ֬ೝ $ nomad status ID Type Priority Status
axion-api service 50 running axion-another-service service 50 running axion-foo-batch batch 50 running axion-foo-batch/periodic-1467924600 batch 50 dead axion-foo-batch/periodic-1467928200 batch 50 dead axion-foo-batch/periodic-1467931800 batch 50 dead axion-foo-batch/periodic-1467935400 batch 50 dead © 2016 CyberAgent, Inc. 53
Axion ͱ Nomad © 2016 CyberAgent, Inc. 54
λεΫͷஔ 4 Nomad Ϋϥελ 1 ͚ͭͩ 4 ͲͷϊʔυʹλεΫ͕ஔ͞ΕΔ͔͔Βͳ ͍ 4
ύϑΥʔϚϯεʹහײͳ api ϊʔυΛ༗͠ ͍ͨ 4 ֤छ worker όονదʹۭ͍͍ͯΔϊ ʔυͰಈ͍ͯ͘ΕΕ͍͍ © 2016 CyberAgent, Inc. 55
Job constraint constraint { attribute = "${meta.role}" value = "api"
} 4 Nomad ͷϊʔυʹઃఆͰ͖Δ meta มΛ ͱʹλεΫஔΛ੍ݶ © 2016 CyberAgent, Inc. 56
Nomad ͷ meta ઃఆ 4 Consul ͷ KVS ͰϊʔυʹରԠ͢ΔΩʔʹΛઃఆ͢Δͱ consul-template
͕Ԡ ͯ͠ Nomad ͷઃఆΛม͑Δ © 2016 CyberAgent, Inc. 57
Nomad Λͬͨ Axion ͷσϓϩΠϑϩʔ © 2016 CyberAgent, Inc. 58
1). Bot ʹϦϦʔε४උΛґཔ © 2016 CyberAgent, Inc. 59
2). ϦϦʔε PR ͕࡞͞ΕΔ 4 master -> deployment/release ͷϚʔδ ©
2016 CyberAgent, Inc. 60
master ʹϚʔδ͞Εͨ PR Λऩूͯ͠Ϧετ Խ © 2016 CyberAgent, Inc. 61
֤ PR ͷ ## Release Notes ηΫγϣϯΛ ू © 2016
CyberAgent, Inc. 62
3). PR ϚʔδͰ CircleCI ͕Ϗϧυ deployment: release: branch: deployment/release commands:
- tar zcf deploy.tar.gz deploy/* - slack-post.sh @beckyy: deploy acd-axion #$CIRCLE_BUILD_NUM using deploy.tar.gz with deploy/deploy.sh stg general: artifacts: - deploy.tar.gz 4 ϦϙδτϦͷ deploy εΫϦϓτͳͲΛ artifact ͱͯ͠อଘ 4 Bot ͷσϓϩΠίϚϯυΛ Slack ϙετ © 2016 CyberAgent, Inc. 63
4). Bot ͕ stg σϓϩΠΛ࣮ߦ 4 CircleCI ͔Β deploy artifact
Λऔಘͯ͠ίϚϯυΛ࣮ߦ © 2016 CyberAgent, Inc. 64
5). ୲͕ prd σϓϩΠΛࢦࣔ 4 stg Ͱͷ֬ೝͱϦϦʔεͷ߹ҙΛͱ͔ͬͯΒ࣮ ߦ © 2016
CyberAgent, Inc. 65
deploy.sh # Copy job spec to deploy server scp -pq
*.nomad centos@deploy:/home/centos/axion/$ENV/nomad # Run new job spec on deploy server cat <<EOF | ssh -qT centos@deploy cd /home/centos/axion/$ENV nomad run nomad/axion-api.nomad EOF © 2016 CyberAgent, Inc. 66
Nomad Λ࠾༻ͨ͠ཧ༝ 4 Kubernetes ͱ໎ͬͨ 4 Nomad / Kubernetes ͱʹ΄΅͕ࣝແ͍
ঢ়ଶ 4 طʹ Consul Λ͏͜ͱܾΊ͍ͯͨ 4 ߏ͕γϯϓϧͰػೳগͳ͍͜ͱ͔Βֶशί ετͷͦ͏ͳ Nomad Λબ © 2016 CyberAgent, Inc. 67
Nomad Ͱࠔͬͨͱ͜Ζ 4 Web UI (μογϡϘʔυ)͕ͳ͍ 4 Docker ͷ Volume
Λαϙʔτ͍ͯ͠ͳ͍ 4 Rolling Upadte ͱϔϧενΣοΫ͕౷߹͞Ε ͍ͯͳ͍ 2015-09 ͷϦϦʔε͔Β·ͩ 1 ܦ͍ͬͯͳ͍ͷ Ͱํͳ͍໘… © 2016 CyberAgent, Inc. 68
Nomad ·ͱΊ 4 খ͞ͳࣄΛ࣮֬ʹ͜ͳͯ͘͠ΕΔϠπͰ͋ Δ 4 ΞϓϦͷஔ͚ͩɺͳͲͱখ͘͞ར༻͢Δʹ ྑ͍ 4 ͓ͯͳ͠ײͳ͍
4 ے͍͍ͷͰࠓޙͷख़ʹظ © 2016 CyberAgent, Inc. 69
Terraform Infrastructure as a Code © 2016 CyberAgent, Inc. 70
What's Terraform ? 4 Πϯϑϥͷ࡞ɾมߋɾόʔδϣϯཧͷͨΊ ͷπʔϧ 4 ΠϯϑϥͷߏཁૉΛશͯίʔυͰهड़ 4 ༷ʑͳϦιʔεͷཧʹରԠ
4 AWS CloudFormation OpenStack Heat ʹ૬͢Δπʔϧ © 2016 CyberAgent, Inc. 71
Technology Radar 4 Technology Rader 2015-01 7 Ͱ ASSESS (ௐࠪͤΑ)
7 https://www.thoughtworks.com/radar/tools/terraform © 2016 CyberAgent, Inc. 72
Resource Providers Atlas / AWS / Azure (Service Management) /
Azure (Resource Manager) Chef / CenturyLinkCloud / CloudFlare / CloudStack / Cobbler / Consul Datadog / DigitalOcean / DNSMadeEasy / DNSimple / Docker / Dyn GitHub / Fastly / Google Cloud / Heroku / InfluxDB / Librato Mailgun / MySQL / OpenStack / Packet / PostgreSQL / PowerDNS Rundeck / StatusCake / SoftLayer / Template / Terraform / TLS Triton / UltraDNS / VMware vCloud Director / VMware vSphere © 2016 CyberAgent, Inc. 73
ఆٛϑΝΠϧ resource "openstack_compute_instance_v2" "dock" { region = "${var.region}" name =
"${format("acd-${var.env}-axion-dock-y%03d", count.index + 1)}" count = "10" image_name = "centos-7.2.1511" flavor_name = "s2.medium" security_groups = ["default"] network { name = "${var.network_name}" access_network = true } user_data = "${template_cloudinit_config.dock_cloudinit.rendered}" lifecycle { ignore_changes = ["user_data"] } } © 2016 CyberAgent, Inc. 74
terraform plan $ terraform plan + module.axion.openstack_compute_instance_v2.dock.1 access_ip_v4: "" =>
"<computed>" flavor_name: "" => "s2.medium" image_name: "" => "centos-7.2.1511" name: "" => "acd-stg-axion-dock-y001" security_groups.#: "" => "1" security_groups.3814588639: "" => "default" user_data: "" => "4a068b7a5a43f31d9bd280a20a04823bbf4082d8" © 2016 CyberAgent, Inc. 75
terraform apply $ terraform apply -parallelism=1 module.axion.openstack_compute_instance_v2.dock.1: Creating... access_ip_v4: ""
=> "<computed>" flavor_name: "" => "s2.medium" image_name: "" => "centos-7.2.1511" name: "" => "acd-stg-axion-dock-y001" security_groups.#: "" => "1" security_groups.3814588639: "" => "default" user_data: "" => "b0f6c60d289b151ef07f89fe543ee6edb46f0f1a" module.axion.openstack_compute_instance_v2.dock.1: Still creating... (10s elapsed) module.axion.openstack_compute_instance_v2.dock.1: Still creating... (20s elapsed) module.axion.openstack_compute_instance_v2.dock.1: Still creating... (30s elapsed) module.axion.openstack_compute_instance_v2.dock.1: Creation complete Apply complete! Resources: 1 added, 0 changed, 0 destroyed. © 2016 CyberAgent, Inc. 76
Axion ͱ Terraform © 2016 CyberAgent, Inc. 77
ཧରʹ͍ͯ͠ΔϦιʔε 4 openstack_compute_instance_v2 4 openstack_compute_servergroup_v2 ηΩϡϦςΟάϧʔϓωοτϫʔΫ Terraform ͷཧର֎ͱ͠ɺCIA ͕༻ҙͨ͠ ͷΛ
ID ໊લͰࢀর͢ΔΑ͏ʹ͍ͯ͠ΔɻΑͬ ͯɺεΫϥον͔Β Terraform ͚ͩͰߏஙͰ͖ ΔΘ͚Ͱͳ͍ɻ © 2016 CyberAgent, Inc. 78
Terraform ઃఆͷϨΠΞτ |-- modules | `-- axion | |-- main.tf
| ڞ௨Ϧιʔεఆٛ | |-- dock.tf | dock ϩʔϧఆٛ | |-- council.tf | council ϩʔϧఆٛ | `-- variables.tf | Ϟδϡʔϧมఆٛ |-- dev | |-- .envrc | OpenStack ڥม (not in repository) | `-- main.tf | dev ڥઃఆ |-- stg | |-- .envrc | `-- main.tf | stg ڥઃఆ `-- prd |-- .envrc `-- main.tf | prd ڥઃఆ ࢀߟ: https://atlas.hashicorp.com/help/intro/use-cases/multiple- environments © 2016 CyberAgent, Inc. 79
Terraform ͷ࣮ߦڥ $ cd ~/axion/terraform $ ls dev modules prd
stg 4 ཧαʔόʹ Terraform ϦϙδτϦΛνΣο ΫΞτ 4 ߋ৽࣌ʹ pull ͨ͠Γ͢Δͷखಈ… ! © 2016 CyberAgent, Inc. 80
Terraform ͷ࣮ߦ $ cd stg direnv: loading .envrc direnv: export
+OS_PROJECT_NAME +OS_REGION_NAME +OS_TENANT_ID $ terraform plan 4 ૢ࡞ରͷڥͷσΟϨΫτϦʹೖΔͱ direnv ʹΑͬͯ OpenStack ڥม͕ઃఆ ͞ΕΔ 4 terraform ίϚϯυΛ࣮ߦखಈ… ! © 2016 CyberAgent, Inc. 81
OpenStack ڥม $ cat .envrc export OS_AUTH_URL="http://openstack.local/v2.0/" export OS_TENANT_ID=**** export
OS_TENANT_NAME=**** export OS_PROJECT_NAME=**** export OS_USERNAME=**** export OS_PASSWORD=**** export OS_REGION_NAME=**** 4 OpenStack ͷ API Λୟ͘πʔϧΛ͏ͱ͖ʹඞཁͳڥม 4 OpenStack ͷ Dashboard ͔ΒςϯϓϨʔτΛμϯϩʔυ Մೳ © 2016 CyberAgent, Inc. 82
.tfstate ʹ͍ͭͯ $ cd dev; ls -1 main.tf terraform.tfstate <--
͜Ε terraform.tfstate.backup 4 ࠷ޙʹ apply ͨ͠ͱ͖ͷΠϯϑϥͷঢ়ଶΛه 4 ద༻͖͢มߋͷࠩΛܭࢉ͢ΔͨΊʹ ඞਢ 4 refresh Ͱ࣮Πϯϑϥ͔Β͋Δఔ࠶ߏஙͰ͖Δ ͕ɺखಈͰϦιʔεঢ়ଶͷ߹ੑΛऔΔඞཁ͕͋Δ 4 Terraform Λӡ༻͢Δ্ͰͷΈͲ͜Ζ © 2016 CyberAgent, Inc. 83
.tfstate ͷཧ 4 ͻͱ·ͣ terraform ͷ࣮ߦΛཧαʔόʹݶ ఆͯ͠ɺͦͷ··ϩʔΧϧσΟεΫʹஔ͍͍ͯ Δ 4 Πϯϑϥͷมߋස͕͍ͷͰʮӡ༻Ͱ
Χόʔʯ 4 ֎෦ετϨʔδ(s3, artifactory ͳͲ)ʹஔ ͢Δ͜ͱՄೳ © 2016 CyberAgent, Inc. 84
Axion ͷॳظߏங 4 ݸਓڥΛαϯυϘοΫεʹઃఆΛॻ͘ 4 ͻͨ͢Β apply and destroy !
4 ͋Δఔݻ·ͬͨΒຊ൪Ϧʔδϣϯ༻ʹมͩ ͚มߋͯ͠ద༻ 4 dev ڥͰ࠷ऴௐ 4 stg / prd ͷߏங apply ͢Δ͚ͩͰྃ © 2016 CyberAgent, Inc. 85
Axion ͷ cloud-init 4 Πϯελϯε໊͔Β hostname ઃఆ 4 ෦ DNS
ͷϨίʔυొ 4 LDAP ϩάΠϯͷηοτΞοϓ 4 chef-client ࣮ߦ 4 CIA ཧͷجຊ Cookbook ͷ࣮ߦ 4 ϛυϧΣΞͷΠϯετʔϧ 4 ϩʔϧݻ༗ͷηοτΞοϓ 4 ϛυϧΣΞ Docker ίϯςφͷىಈ cloud-init ͚ͩͰηοτΞοϓ͕݁͢ΔΑ͏ʹ͍ͯ͠Δ © 2016 CyberAgent, Inc. 86
Terraform ӡ༻ͷཧ 4 ΞϓϦͱಉ͘͡ GitHub Ͱมߋ͔ΒσϓϩΠ ·ͰͷαΠΫϧΛճ͍ͨ͠ 4 PR ʹ
plan ͷ݁ՌΛࣗಈతʹϙετͯ͠มߋ ΛϨϏϡʔ 4 Ϛʔδ͢Δͱ CI ͕ͬͯมߋΛద༻ © 2016 CyberAgent, Inc. 87
Terraform ·ͱΊ 4 ࠓ·ͰΠϯελϯεͷ෦ Chef ͳͲͰߏཧͰ͖͍ͯͨ ͕ɺΠϯελϯεͦͷͷγΣϧεΫϦϓτΛୟ͍ͯ࡞͠ ͍ͯͨ 4 Adhoc
ͳૢ࡞ + ࡞ۀϩά 4 ࣗಈԽͱ͍͏จ຺Ͱ͞΄ͲखؒมΘΒͳ͍͔͠Εͳ͍ 4 ΠϯϑϥΛίʔυͱͯ͠දݱ͢ΔϝϦοτ 4 ࠶ݱੑͷ୲อ 4 ҉ͷഉআ 4 ཤྺͷཧ (git log) © 2016 CyberAgent, Inc. 88
Terraform ·ͱΊ 4 Terraform ͦͷͷಛʹͳ͘ѻ͑ͨ ! 4 Πϯελϯε෦Λ cloud-init Ͱߏங͢Δ
ͱ͜Ζେมͩͬͨ… " 4 มߋద༻લʹ plan Λ֬ೝͰ͖Δͷྑ͍ 4 ੲͷ CloudFormation dry-run ͕Ͱ͖ ͳͯ͘ා͔ͬͨ © 2016 CyberAgent, Inc. 89
Terraform ·ͱΊ 4 ॳظߏஙޙͷӡ༻͕ઙ͍ͷͰࠓޙͭΒ͍͜ͱ͕͋ Δ͔͠Εͳ͍ ! 4 ϓϩάϥϛϯάͱಉ͘͡ɺಡΈ͍͢ίʔυΛॻ ͘৺ֻ͚͕ඞཁ 4
Axion cloud-init ·ΘΓ͕͔ͳΓԚͳ͍… 4 શͳ Container ϕʔεͷੈքͰ͋ΕΠϯελ ϯεཧͱͯ͠ͷ Terraform ෆཁʹͳΓͦ͏ © 2016 CyberAgent, Inc. 90
Axion Πϯϑϥͷ શମ૾ © 2016 CyberAgent, Inc. 91
© 2016 CyberAgent, Inc. 92
ΦϨΑ͏͘ ͷ΅Γ͡Ίͨ ͔Γ͔ͩΒͳ ͜ͷͯ͠ͳ͘ԕ͍ Docker ࡔΛΑ… © 2016 CyberAgent, Inc.
93