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
Gohperに逆らうとどうなるのか
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Seiji Takahashi
April 23, 2016
Technology
3
4.3k
Gohperに逆らうとどうなるのか
Go Conference Spring 2016
Seiji Takahashi
April 23, 2016
Tweet
Share
More Decks by Seiji Takahashi
See All by Seiji Takahashi
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
780
Go Backends for frontends with GraphQL and gRPC
timakin
6
4.2k
Design Pattern for Image and Text Composition in Go
timakin
5
6.8k
Golang API Testing the HARD way
timakin
13
7k
Head First Golang Image Package
timakin
2
10k
React Native Beyond Prototype
timakin
2
1.7k
Performance Optimization on Google AppEngine
timakin
5
6.6k
testcache.pdf
timakin
1
200
How Go cache
timakin
1
120
Other Decks in Technology
See All in Technology
身体を持ったパーソナルAIエージェントの 可能性を探る開発
yokomachi
1
130
Agent ServerはWeb Serverではない。ADKで考えるAgentOps
akiratameto
0
110
AI実装による「レビューボトルネック」を解消する仕様駆動開発(SDD)/ ai-sdd-review-bottleneck
rakus_dev
0
150
AlloyDB 奮闘記
hatappi
0
120
Goのerror型がシンプルであることの恩恵について理解する
yamatai1212
1
160
GCASアップデート(202601-202603)
techniczna
0
200
NewSQL_ ストレージ分離と分散合意を用いたスケーラブルアーキテクチャ
hacomono
PRO
4
380
Go標準パッケージのI/O処理をながめる
matumoto
0
220
TypeScript 7.0の現在地と備え方
uhyo
7
1.6k
Lambda Web AdapterでLambdaをWEBフレームワーク利用する
sahou909
0
160
PMとしての意思決定とAI活用状況について
lycorptech_jp
PRO
0
130
ソフトバンク流!プラットフォームエンジニアリング実現へのアプローチ
sbtechnight
1
180
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Documentation Writing (for coders)
carmenintech
77
5.3k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
980
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Automating Front-end Workflow
addyosmani
1370
200k
Faster Mobile Websites
deanohume
310
31k
Building AI with AI
inesmontani
PRO
1
800
エンジニアに許された特別な時間の終わり
watany
106
240k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Leo the Paperboy
mayatellez
4
1.5k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
Google's AI Overviews - The New Search
badams
0
930
Transcript
Gopherʹ ٯΒ͏ͱ Ͳ͏ͳΔͷ͔ timakin / @__timakin__ Go Conference 2016 Spring
ࣗݾհ • ߴڮೋ / ͪ·͖Μ • Github: timakin • Twitter:
@__timakin__ • Gmail:
[email protected]
• hatena: timakin.log • ϓϥΠϕʔτͰGoͰ࡞ͬͨCLIπʔϧ • timakin/ts - teckstack (ςοΫܥͷใऩूCLI) • timakin/octop - octopatrol (github tracking CLI)
ΞδΣϯμ • ʮgo-lxcΛ௨࣮ͯ͠ײͨ͠Golangͷྑ͞ʯ͕ ਖ਼ࣜͰ͢ɻ • LXCपΓͷ͠·͢ɻ • CLIπʔϧΛGoͰॻ͖ͨ͠ΒߴԽͨ͠ ͠Α͏ͱࢥ͚ͬͨͲ࣌ؒͳ͛͞ͳͷͰࠓ…
Կ͕ىͬͨ͜ͷ͔ • DockerΫϩʔϯΛ࡞ͬͯͨ • YAPC::Asia Tokyo 2015ͰʮGitͷ࡞Γํʯͱ͍͏ LTʹײԽ͞Εͯɺ”࣮͕ͦ͠͏ͩ” ͱࢥ͏ͷΛϓν࣮ͯ͠ΈΑ͏ͱߟ͑ͨɻ •
खݩͰͪΌΜͱதΘ͔ͬͯͦ͏Ͱ Θ͔ͬͯͳ͍πʔϧ… • DockerͩͶʂ
Կ͕ىͬͨ͜ͷ͔ • p8952/bockerͱ͍͏shell100ߦͷ࣮͕͋Δ • ͜ΕΛRubyͰͬͨΒՄಡੑ͕͍͋ͬͯ ͍ͷͰɻʢԿΑ͘ͳ͔ͬͨʣ • Dockerͱ͍͏͔LXCΛϥοϓͨ͠timakin/ Oceanusͱ͍͏ͷΛॻ͖·ͨ͠ɻ
LXC(Linux Containers)ͷ֓ཁ • ίϯςφԾԽʹඞཁͳchrootcgroupɺnamespaceͷׂΛ ѻ͏APIΛఏڙ͢Δٕज़Ͱ͢ɻ • ԾϚγϯΛ࡞ΔͷͰͳ͘ɺϗετOSͷϦιʔεΛׂɺཧ ͢Δ͜ͱͰִۭؒΛ࡞Γग़͠·͢ɻϋʔυΣΞͷγϛϡϨʔγϣ ϯ͕ඞཁͳ͍ͨΊɺԾԽʹΑΔΦʔόʔϔου͕গͳ͍Ͱ͢ɻ •
v0.8ҎલͷDockerLXCܦ༝ͰҰ෦ϦιʔεཧΛ͍ͯ͠·ͨ͠ɻ • DockerϦιʔεׂͦ͏Ͱ͕͢ɺΞϓϦέʔγϣϯͷσϓϩ ΠڥΠϝʔδͷόʔδϣχϯάʹओ؟Λஔ͍͍ͯΔͰɺࠩҟ ͕͋Δͷͩͱ͍͏ҹͰ͢ɻ
go-lxcͷ֓ཁ • Go Bindings for LXC (Linux Containers) • LXD
(REST APIΛఏڙ͢ΔσʔϞϯΛඋ͓͑ͯ ΓɺωοτϫʔΫܦ༝Ͱͷૢ࡞͕Մೳͳίϯ ςφٕज़ɻLXCͷਐԽ൛తͳͷ)ʹಋೖ͞ Ε͍ͯ·͢ɻ • ଞʹruby-lxcpython2-lxc͋Γ·͕͢ɺ ։ൃࢭ·ͬͯ·͢…
go-lxcͷAPIͷྫ • ίϯςφͷجຊૢ࡞ • ৽ن࡞ɿfunc NewContainer • ίϯςφىಈɿfunc (*Container) Start
• ίϯςφͰͷίϚϯυ࣮ߦɿfunc (*Container) Execute • ίϯςφഁغɿfunc (*Container) Destroy • ίϯςφఀࢭɿfunc (*Container) Shutdown • ίϯςφҰཡɿfunc Containers
go-lxcͷAPIͷྫ • ίϯςφ͝ͱͷಠࣗઃఆɺsnapshotɺϓϩη εͷσʔϞϯԽ • func (*Container) SetMemorySwapLimit • func
(*Container) CreateSnapshot • func (*Container) Daemonize
go-lxcͷίʔυϦʔσΟϯά // go-lxc/container.go func (c *Container) Start() error { if
err := c.makeSure(isNotRunning); err != nil { return err } c.mu.Lock() defer c.mu.Unlock() if !bool(C.go_lxc_start(c.container, 0, nil)) { return ErrStartFailed } return nil }
go-lxcͷίʔυϦʔσΟϯά // go-lxc/lxc-binding.c bool go_lxc_start(struct lxc_container *c, int useinit, char
* const argv[]) { return c->start(c, useinit, argv); }
go-lxcͷίʔυϦʔσΟϯά // lxc/src/lxc/lxccontainer.c struct lxc_container *lxc_container_new(const char *name, const char
*configpath) { struct lxc_container *c; ... c->start = lxcapi_start; ... } static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv[]) { bool ret; current_config = c ? c->lxc_conf : NULL; ret = do_lxcapi_start(c, useinit, argv); current_config = NULL; return ret; }
Dockerϓν࣮աఔɿֶश • cgroup, chroot, snapshot࡞पΓͷษڧɻ • Ծڥͱ͍͏ΑΓִۭؒΛ࡞ΔΠϝʔδΛ࣋ͭɻ • ॳظͷDockerLXCͬͯͨΑ͏ͳͷͰɺLXCͷษڧ …
• Docker HubͷAPIͷ༷ಡΉ… • ͪΖΜdockerͦͷͷͷ࣮ͱlxcͷίʔυಡ Ήɻ
Dockerϓν࣮աఔɿ࣮ • e.g. pull -> run, execͷྲྀΕ • Docker HubͷAPIΛୟ͖ɺimages
endpointΛୟ͍ͯɺඞཁͳsession tokenΛऔಘ͢Δ • session token͖ͰRegistry APIΛୟ͍ͯɺ֘λάͷimage_idΛऔಘ͢ Δ • Imageͷancestry(diffཤྺ)Λऔಘ͢Δ • layer(ImageͷόΠφϦσʔλ)Λऔಘ͠ɺಛఆσΟϨΫτϦԼʹల։͢Δ • ετϨʔδͷঢ়ଶͷࠩ(ancestry)ΛϨΠϠͱͯ͠ॏͶ߹ΘͤΔ͜ͱͰɺΠ ϝʔδΛܗ͢ΔɻʢϢχΦϯϑΝΠϧγεςϜʣ • snapshotΛҙͷσΟϨΫτϦʹอଘͭͭ͠ɺͦͷΠϝʔδΛݩʹLXCΛ ىಈɺίϚϯυ࣮ߦ
Dockerϓν࣮աఔɿ࣮ • e.g. pull -> run, execͷྲྀΕ • Docker HubͷAPIΛୟ͖ɺimages
endpointΛୟ͍ͯɺඞཁͳsession tokenΛऔಘ͢Δ • session token͖ͰRegistry APIΛୟ͍ͯɺ֘λάͷimage_idΛऔಘ͢ Δ • Imageͷancestry(diffཤྺ)Λऔಘ͢Δ • layer(ImageͷόΠφϦσʔλ)Λऔಘ͠ɺಛఆσΟϨΫτϦԼʹల։͢Δ • ετϨʔδͷঢ়ଶͷࠩ(ancestry)ΛϨΠϠͱͯ͠ॏͶ߹ΘͤΔ͜ͱͰɺΠ ϝʔδΛܗ͢ΔɻʢϢχΦϯϑΝΠϧγεςϜʣ • snapshotΛҙͷσΟϨΫτϦʹอଘͭͭ͠ɺͦͷΠϝʔδΛݩʹLXCΛ ىಈɺίϚϯυ࣮ߦʢ͕͜͜LXCΛ͏ॴʣ
Dockerϓν࣮աఔɿ࣮ • imageͷϩʔυͰ֎෦APIΛୟ͖ʹߦ͘ͷ ͷɺجຊతʹLXCͷػೳͰ݁͢Δɻ • bockerbtrfsʹΑΔsnapshot࡞ɺcgroupʹ ΑΔϦιʔεཧɺωοτϫʔΫઃఆɺ chrootͰϧʔτมߋΛϕλͰ࣮ɻ
݁ՌɺGolang͡Όͳ͔͔ͬͨΒ… • ·ͣɺવGoDocͳΜͯͳͷͳ͍ • ͨΓલͷ͜ͱͰ͕͢ɺ͜Ε͕ݪҼͰAPIͷ ༷ΛѲ͢ΔͨΊʹίʔυΛಡΉ͜ͱ ʹͳΓ·͢ɻ • ͦͷίʔυ͕LXCΛΧϓηϧԽͨ͠ɺ͔Γ ͍͢ίʔυͳΒ·ͩ͠ɺC֦ுͷίʔυ
ͳͷͰࢮɻ
ͨͱ͑container_start static VALUE container_start(int argc, VALUE *argv, VALUE self) {
int ret; VALUE rb_use_init, rb_daemonize, rb_close_fds, rb_args, rb_opts; struct start_without_gvl_args args; args.use_init = 0; args.daemonize = 1; args.close_fds = 0; args.args = NULL; rb_args = Qnil; rb_scan_args(argc, argv, "01", &rb_opts); if (!NIL_P(rb_opts)) { Check_Type(rb_opts, T_HASH); rb_use_init = rb_hash_aref(rb_opts, SYMBOL("use_init")); if (!NIL_P(rb_use_init)) ͓͏ɺͦ͏ͩͳɻ
݁ՌɺGolang͡Όͳ͔͔ͬͨΒ… • rubyͷ߹ɺGolangͷΑ͏ʹૉఢʹAPI͕ੜ ͍͑ͯΔΘ͚Ͱͳͯ͘ɺ͜͏ɻ • GoҎ֎ͷLXC࣮lxcΛݺͼग़͚ͩ͢Ͱɺ APIͱͯ͠ϦʔμϒϧͩͬͨΓɺརศੑΛߟྀ ͨ͠୯Ґʹϝιουׂ͕͞Εͯͳ͔ͬͨΓ ͠·͢ɻ require
'lxc/lxc'
݁ՌɺGolang͡Όͳ͔͔ͬͨΒ… • GolangͳΒ func (*Container) IPAddress func (*Container) CPUStatsͳͲɺ ίϯςφΛཧ͢Δʹͨͬͯݟ͍ͨใ͕
ࣗ༝ʹݟΕ·͢ɻ • Ұํlxc/lxc-ruby… ϝϞϦωοτϫʔΫཧconfigͷΈ… ͏ͪΐͬͱ࿑ಇͯ͠ʂ
͓લͳΜͰ RubyͰ ࣮͠Α͏ ͱࢥͬͨΜͩʁ
·ͱΊ • GoͷLXCपΓͷ࣮ॆ࣮ͯ͠·͢ɻ • APIͷ༷͕ࡉԽ͞ΕͯͯɺυΩϡϝϯτ ੜ͞ΕͯΔͷͰɺαοͱίϯςφԾԽͷ ίʔυΛಡΉ͜ͱ͕Ͱ͖·͢ɻͥͻɻ • GoͰ͔ͬ͠Γͨ͠API͕Ͱ͖͕͋ͬͯΔͱɺ ͦΕҎ֎ͷݴޠͰͷ࣮͕Γͳ͘ײ͡·͢ɻ
ٯΒ͏ͷΊ·͠ΐ͏ɻ
Thank you!