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
AGAWA Koji
August 09, 2016
Technology
830
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
やさしいA2A入門
minorun365
PRO
11
1.7k
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
8
4.5k
Microsoft Build Keynoteふりかえり
tomokusaba
0
120
Snowflakeと仲良くなる第一歩
coco_se
4
410
protovalidate-es を導入してみた
bengo4com
0
170
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
680
Reliability in the Age of AI: Engineering for AI Velocity
rrreeeyyy
0
120
EventBridge Connection
_kensh
5
690
AI駆動開発が変える、大規模開発の前提 ーHuman in the Loop から Human on the Loop へ / AIE2026
visional_engineering_and_design
30
24k
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
2.2k
生成 AI × MCP で切り拓く次世代 SRE!自律型運用への挑戦と開発者体験の進化
_awache
0
190
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
490
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
The browser strikes back
jonoalderson
0
1.2k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Speed Design
sergeychernyshev
33
1.8k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
580
Navigating Weather and Climate Data
rabernat
0
220
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Making Projects Easy
brettharned
120
6.7k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
360
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
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