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
20年ものの巨大プロダクトをKubernetesに移行している話 後日談/Garoon on ...
Search
Yuichi Sugiyama
PRO
October 12, 2022
Technology
0
560
20年ものの巨大プロダクトをKubernetesに移行している話 後日談/Garoon on Kubernetes after talk
サイボウズのPHP Conference 2022の後日談イベントの発表資料です
Yuichi Sugiyama
PRO
October 12, 2022
Tweet
Share
More Decks by Yuichi Sugiyama
See All by Yuichi Sugiyama
サイボウズ と Garoon と The PHP Foundation と 私 / Cybozu and Garoon and The PHP Foundation and me
oogfranz
PRO
1
510
可能な限り確実にmkdirを成功させるには / Make mkdir
oogfranz
PRO
0
520
サイボウズ #Garoon 開発チームの 「 完成度低いの歓迎LT大会 」 PHPerKaigi出張版 / Low quality LT in PHPerKaigi 2023
oogfranz
PRO
0
540
20年ものの巨大プロダクトをKubernetesに移行している話/Garoon on Kubernetes
oogfranz
PRO
0
440
PHPアプリケーションだってモニタリングしたい / Monitoring PHP application
oogfranz
PRO
1
620
効果的な静的解析の CI導入パターンを求めて / Great static analysis with CI
oogfranz
PRO
3
3.6k
Dev-meets-Ops
oogfranz
PRO
1
980
GitHub力の低い僕でも、 OSSコントリビュートできたワケ / GitHub Power
oogfranz
PRO
1
580
静的解析の育て方 / How to make your static analysis strong
oogfranz
PRO
3
2.9k
Other Decks in Technology
See All in Technology
Software Architecture in an AI-Driven World
atty303
63
25k
Docker Compose で手軽に手元環境を実現する / Simplifying Local Environments with Docker Compose #CinemaDeLT
nabeo
0
280
20250514 1Passwordを使い倒す道場 vol.1
east_takumi
0
160
The PyArrow revolution in Pandas
reuven
0
130
株式会社Awarefy(アウェアファイ)会社説明資料 / Awarefy-Company-Deck
awarefy
3
17k
golang-migrate VS Atlas !? 技術選定のポイントと学び ~DBマイグレーションツール選定の実例を通して~ / golang-migrate vs Atlas ! What is the point of technology selection and what you can learn from the examples of DB migration tool selection?
nttcom
0
110
encoding/json v2を予習しよう!
yuyu_hf
PRO
1
220
正解のない未知(インボイス制度対応)をフルサイクル開発で乗り越える方法 / How to overcome the unknown invoice system with full cycle development
carta_engineering
0
170
NAB Show 2025 動画技術関連レポート / NAB Show 2025 Report
cyberagentdevelopers
PRO
0
130
本番環境への影響リスクが低い Real Application Testing (SQL Performance Analyzer) の実施方法の検討と実践
jri_narita
0
200
4月15日の AZ 障害をテクサポの中の人目線で振り返ってみる
kazzpapa3
3
190
Kaigi Effect 2025 #rubykaigi2025_after
sue445
0
320
Featured
See All Featured
Navigating Team Friction
lara
185
15k
Optimising Largest Contentful Paint
csswizardry
37
3.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
40
7.3k
How to Think Like a Performance Engineer
csswizardry
23
1.6k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.2k
Designing for Performance
lara
608
69k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
19
1.2k
Scaling GitHub
holman
459
140k
Code Review Best Practice
trishagee
68
18k
Writing Fast Ruby
sferik
628
61k
Transcript
20ͷͷڊେϓϩμΫτΛ KubernetesʹҠߦ͍ͯ͠Δ αΠϘζגࣜձࣾ Garoon։ൃ ਿࢁ ༞Ұ PHP Conference 2022 ޙஊ
#phpcon #phpcon2022
Whoami • ਿࢁ ༞Ұ @oogFranz • αΠϘζ8ΤϯδχΞ • େاۀ͚άϧʔϓΣΞGaroon(Ψϧʔϯ) ࡞ͬͯΔ
• ෳۀδϟζϛϡʔδγϟϯ@MASHݭָஂ
αΠϘζ Garoon • ։ൃ20ʂ • େاۀ͚ͷάϧʔϓΣΞ • PHPͱMySQLͰಈ͘ • ύοέʔδ൛ͱΫϥυ൛͕͋Δ
αΠϘζ Garoon • ։ൃ20ʂ • େاۀ͚ͷάϧʔϓΣΞ • PHPͱMySQLͰಈ͘ • ύοέʔδ൛ͱΫϥυ൛͕͋Δ
ݱΫϥυΠϯϑϥج൫ʢForestʣ • 2011ʹαʔϏε։࢝ • ࣗࣾσʔληϯλʔ • 10ఔͷVMΛ1ηοτʹͯ͠ߏ ʢApplication, DB,
ϑΝΠϧαʔό…ʣ • ߏஙʹܞΘͬͨ̋͞Μͷ໊લ͔ΒForestͱݺΕΔ
ݱΫϥυΠϯϑϥج൫ʢForestʣ Forest ʹଟ༷ͳׂΛ࣋ͬͨཧɾԾαʔόʔ܈ͱɺ ͦΕΒΛཧ͢ΔίϚϯυϥΠϯπʔϧ͕ଘࡏ͠ɺ ͦͷෳࡶ͔͞Β໎͍ͷͷΑ͏ʹײ͡Δ͜ͱ͋Δ͔͠Ε·ͤΜɻ ͔͠͠ɺਖ਼͍ࣝ͠ΛಘͯɺͷਤϧʔϧΛཧղ͢Εɺ
๛͔ͳՄೳੑΛ͍࣋ͬͯΔ͜ͱʹؾͮ͘͜ͱͰ͠ΐ͏ɻ “ αΠϘζࣾ༻ޠࣙయ BozupediaΑΓ
ݱΫϥυΠϯϑϥج൫ʢForestʣ Forest ʹଟ༷ͳׂΛ࣋ͬͨཧɾԾαʔόʔ܈ͱɺ ͦΕΒΛཧ͢ΔίϚϯυϥΠϯπʔϧ͕ଘࡏ͠ɺ ͦͷෳࡶ͔͞Β໎͍ͷͷΑ͏ʹײ͡Δ͜ͱ͋Δ͔͠Ε·ͤΜɻ ͔͠͠ɺਖ਼͍ࣝ͠ΛಘͯɺͷਤϧʔϧΛཧղ͢Εɺ
๛͔ͳՄೳੑΛ͍࣋ͬͯΔ͜ͱʹؾͮ͘͜ͱͰ͠ΐ͏ɻ “ αΠϘζࣾ༻ޠࣙయ BozupediaΑΓ Ҏ্ͷ'PSFTUͷʹΑΓɺ ͞·͟·ͳ͕ൃੜ͍ͯ͠Δ
ݱΫϥυΠϯϑϥج൫ʢForestʣͷ՝ εέʔϥϏϦςΟ͕ ͍ ϝϯςφϯεੑ͕ ͍ ϝϯςφϯεͷ μϯλΠϜ͕͍ ։ൃͱӡ༻ͷؒʹน αʔϏεͷߏมߋ͕
ࠔ
ΫϥυΠϯϑϥج൫৽ϓϩδΣΫτ Neco • εέʔϥϏϦςΟϝϯςφϏϦςΟͷ͔Βελʔτ • VMϕʔεͷߏ͔Βίϯςφϕʔεͷߏʹ৽ • Kubernetes(K8s)ΛίΞٕज़ʹਾ͍͑ͯΔ • ج൫ଆͷ։ൃ2018։࢝ɻ2021ʹҰ୴ྃʂ
• https://blog.cybozu.io/entry/ever-lasting-neco
ΫϥυΠϯϑϥج൫৽ϓϩδΣΫτ Neco • εέʔϥϏϦςΟϝϯςφϏϦςΟͷ͔Βελʔτ • VMϕʔεͷߏ͔Βίϯςφϕʔεͷߏʹ৽ • Kubernetes(K8s)ΛίΞٕज़ʹਾ͍͑ͯΔ • ج൫ଆͷ։ൃ2018։࢝ɻ2021ʹҰ୴ྃʂ
• https://blog.cybozu.io/entry/ever-lasting-neco (BSPPOͷҠߦ͕ࠓ͔Βελʔτʂ
ΫϥυΠϯϑϥج൫৽ϓϩδΣΫτ Neco • εέʔϥϏϦςΟϝϯςφϏϦςΟͷ͔Βελʔτ • VMϕʔεͷߏ͔Βίϯςφϕʔεͷߏʹ৽ • Kubernetes(K8s)ΛίΞٕज़ʹਾ͍͑ͯΔ • ج൫ଆͷ։ൃ2018։࢝ɻ2021ʹҰ୴ྃʂ
• https://blog.cybozu.io/entry/ever-lasting-neco (BSPPOͷҠߦ͕ࠓ͔Βελʔτʂ ྃඪʂ
͕͜͜େม৽Ϋϥυج൫ʢNecoʣҠߦ • ίϯςφ͙͢ࢮ͵ʂVMϕʔε͔ΒͷϚΠϯυγϑτ • ΦϨΦϨϑϨʔϜϫʔΫ͍ͭͯདྷΕΔ͔ʁ • Πϯϑϥࣝ0͔ΒͷNecoҠߦνʔϜ࡞Γ
͕͜͜େม৽Ϋϥυج൫ʢNecoʣҠߦ • ίϯςφ͙͢ࢮ͵ʂVMϕʔε͔ΒͷϚΠϯυγϑτ • ΦϨΦϨϑϨʔϜϫʔΫ͍ͭͯདྷΕΔ͔ʁ • Πϯϑϥࣝ0͔ΒͷNecoҠߦνʔϜ࡞Γ
Garoon Pods ίϯςφ͙͢ࢮ͵ʂ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS
/HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS ΞΫηεࢄ
Garoon Pods ίϯςφ͙͢ࢮ͵ʂ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS
/HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS ❌ ❌ ͍ͣΕ͔ͷίϯςφ 1PEʹ͕͋ͬͨΒ
Garoon Pods ίϯςφ͙͢ࢮ͵ʂ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS
/HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS ❌ ❌ ͍ͣΕ͔ͷίϯςφ 1PEʹ͕͋ͬͨΒ /HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS ͷ1PEΛऔΓআ͖ ৽͘͠1PEΛ࡞͢Δ
VMϕʔεͷ • VMجຊతʹམͱͤͳ͍ʢԽ͍ͯ͠Δ͕ʣ • ͕͋ͬͨ࣌ʹVMΛ1Ճͯ͠ɺɺɺͱ͍͏ରॲࠔ • VMͷઃఆ10Ҏ্ͷΫϥυӡ༻ʹ͍ෳࡶʹ • ӡ༻ଆͷઃఆΞϓϦέʔγϣϯʢGaroonʣଆͷઃఆෳࡶ
ίϯςφ͙͢ࢮ͵ʂ • ίϯςφͰ͕ى͖ͨΒ͙͢ʹམͱͯ͠ɺ ৽͍͠ͷΛ࡞Δɻ • ͜ΕʹΑΓߴՄ༻ੑͱεέʔϧΞτ͕࣮ݱՄೳ • ࣮ࡍʹίϯςφ͕੬͙ͯ͘͢ࢮ͵ɺͱ͍͏ΑΓ
ίϯςφ͕͍ͭࢮΜͰྑ͍લఏͰઃܭ͠Α͏ɺ ͱݴ͏͓ɻ
ίϯςφ͙͢ࢮ͵ʂ • ίϯςφͰ͕ى͖ͨΒ͙͢ʹམͱͯ͠ɺ ৽͍͠ͷΛ࡞Δɻ • ͜ΕʹΑΓߴՄ༻ੑͱεέʔϧΞτ͕࣮ݱՄೳ • ࣮ࡍʹίϯςφ͕੬͙ͯ͘͢ࢮ͵ɺͱ͍͏ΑΓ
ίϯςφ͕͍ͭࢮΜͰྑ͍લఏͰઃܭ͠Α͏ɺ ͱݴ͏͓ɻ ύοέʔδͰ࢝·ͬͨ(BSPPOʹͦͷલఏ͕ͳ͍
Garoon Pods ୯ʹίϯςφԽ͢Δͱɺίϯςφ͕ঢ়ଶΛ࣋ͭ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS
/HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS ϑΝΠϧΞοϓϩʔυ ϩάϑΝΠϧ Ωϟογϡ
Garoon Pods ୯ʹίϯςφԽ͢Δͱɺίϯςφ͕ঢ়ଶΛ࣋ͭ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS
/HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS ϑΝΠϧΞοϓϩʔυ ϩάϑΝΠϧ Ωϟογϡ ❌ ❌ 1PE͕ෆ༻ҙʹམͪΔͱɺಓ࿈ΕͰ͍Ζ͍Ζফ͑ͯ͠·͏ ❌ ❌
Garoon Pods ղܾࡦ1ɿঢ়ଶΛ֎෦αʔϏεʹ͓͘ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS /HJOY
$POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS KVS ϑΝΠϧετϨʔδ ϩάαʔϏε
Garoon Pods ղܾࡦ2ɿϩάϑΝΠϧΛαΠυΧʔͰٵ͍ग़͢ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS
/HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS -PHಡΈग़͠ -PHಡΈग़͠ -PHಡΈग़͠ ϩάج൫αʔϏε Volumeʹॻ͖ग़͢
Garoon Pods ղܾࡦ2ɿϩάϑΝΠϧΛαΠυΧʔͰٵ͍ग़͢ Garoon αʔϏε "1 $POUBJOFS /HJOY $POUBJOFS
/HJOY $POUBJOFS "1 $POUBJOFS /HJOY $POUBJOFS "1 $POUBJOFS -PHಡΈग़͠ -PHಡΈग़͠ -PHಡΈग़͠ ϩάج൫αʔϏε Volumeʹॻ͖ग़͢ ͜Ε͔Βؤுͬͯ࡞Γ·͢ɻɻɻ😇
ίϯςφϕʔεͰ • ίϯςφ͍ͭམͪͯྑ͍Α͏ʹઃܭ͢Δ • K8sίϯςφ͕མͪͨΒࣗಈతʹ৽ͨͳίϯςφΛ࡞ • ઃఆͯ͢ίʔυԽ • ঢ়ଶΛίϯςφ֎෦ʹ͍ΔʢϛυϧΣΞɺαΠυΧʔί ϯςφʣ
͕͜͜େม৽Ϋϥυج൫ʢNecoʣҠߦ • ίϯςφ͙͢ࢮ͵ʂVMϕʔε͔ΒͷϚΠϯυγϑτ • ΦϨΦϨϑϨʔϜϫʔΫ͍ͭͯདྷΕΔ͔ʁ • Πϯϑϥࣝ0͔ΒͷNecoҠߦνʔϜ࡞Γ
ΦϨΦϨϑϨʔϜϫʔΫ • 20ͷͷϑϨʔϜϫʔΫ • ։ൃॳʢ20Ҏ্લʣͱͯ͠ଥͳબ • DBଓͳͲ͕ύοέʔδલఏͰॻ͔Ε͍ͯΔ • ϑΝΠϧͷಈతಡΈࠐΈͳͲɺՄಡੑʹ͋Γ
is_forest() ࠈ • ύοέʔδ൛͔ݱΫϥυ൛ʢForestʣ͔ͷݟ͚ɺ ઃఆϑΝΠϧͷΛࢀর͍ͯ͠Δ • ΫϥυڥԼΛௐΔϝιουɺ if(is_forest())
͕ඦՕॴʹॻ͔Ε͍ͯΔ if (is_forest()) { $validate = new ValidateFileIdentifierOnForest($id); … //͜͜ʹԿेߦ͔͕ͭͮ͘ } else { $validate = new ValidateFileIdentifierOnpremise($id); … //͜͜ʹԿेߦ͔͕ͭͮ͘ }
is_forest() ࠈ • ύοέʔδ൛͔ݱΫϥυ൛ʢForestʣ͔ͷݟ͚ɺ ઃఆϑΝΠϧͷΛࢀর͍ͯ͠Δ • ΫϥυڥԼΛௐΔϝιουɺ if(is_forest())
͕ඦՕॴʹॻ͔Ε͍ͯΔ if (is_forest()) { $validate = new ValidateFileIdentifierOnForest($id); … //͜͜ʹԿेߦ͔͕ͭͮ͘ } else { $validate = new ValidateFileIdentifierOnpremise($id); … //͜͜ʹԿेߦ͔͕ͭͮ͘ } ͜͜ʹJT@OFDP Λ࡞͍ͬͯͯ͘͠ͷݱ࣮తͰͳ͍
ͬͯͯΑ͔ͬͨDIίϯςφ • ͜͜ͷվળʹΑΓDIίϯςφ͕ಋೖʂʂ • ΦϨΦϨϑϨʔϜϫʔΫͳͷͰɺcomposerͰphp-diΛಋೖ • ৽ج൫(Neco)Ͱ͋Δ͔Ͳ͏͔ΛݟΔͷDIίϯςφͷొ෦ʹӅṭ • ͍ͭͰʹύοέʔδ൛͔ݱج൫(Forest)͔
DIίϯςφͰ֬ೝ͢ΔΑ͏ʹϦϑΝΫλ https://speakerdeck.com/ynkt/sok-gai-shan-shi-bai-karaxue-bu-regasipurodakutonili-tixiang-kautimuzuo-ri?slide=23
ͬͯͯΑ͔ͬͨࣗಈςετ • ͜͜ͷվળͰϢχοτςετͱE2Eςετͷඋ͕ਐΜͩ • ج൫෦ʹखΛՃ͑ͨͱ͖ͷӨڹൣғͰ͔͍͕ɺ Ͳ͔͜ͷςετͰམͪΔ͔ΒٯʹେৎͩΖ͏ɺͱ͍͏҆৺ײ • ·ͩ·ͩΓ͍ͯͳ͍͕ɺ͕Μͬͯ࡞͍͔͍ͬͯͨ͋ͬͨ
Ͳ͏ͤϑϨʔϜϫʔΫ෦ʹ৮ΔͳΒ • ϑϨʔϜϫʔΫ෦Մಡੑʹ͋Γ • ίʔυΛมߋ͢Δػձগͳ͍😇 • ίʔυΛಡΉػձଟ͍😩 • खΛՃ͑ʹ͔ͬͨ͘ϑϨʔϜϫʔΫ෦ͷ
ϦϑΝΫλɾϦϥΠτΛਐΊΔ͖͔͚ͬʹ
Ͳ͏ͤϑϨʔϜϫʔΫ෦ʹ৮ΔͳΒ • ϑϨʔϜϫʔΫ෦Մಡੑʹ͋Γ • ίʔυΛมߋ͢Δػձগͳ͍😇 • ίʔυΛಡΉػձଟ͍😩 • खΛՃ͑ʹ͔ͬͨ͘ϑϨʔϜϫʔΫ෦ͷ
ϦϑΝΫλɾϦϥΠτΛਐΊΔ͖͔͚ͬʹ νʔϜͰ߹ҙΛऔΓͭͭɺۃྗϦϑΝΫλΛਐΊ͍ͯΔͧʂ
ΦϨΦϨϑϨʔϜϫʔΫ͍ͭͯ͜ΕΔ͔ • ͜͜ͷվળʢDIίϯςφɾࣗಈςετʣʹΑΓ ਐḿ͕ग़͘͢͠ͳ͍͍ͬͯΔ • ͱ͍͑खΛग़͠ʹ͍͘ͱ͜Ζଟ͍ • ͦ͏͍͏ͱ͜ΖੵۃతʹϦϑΝΫλ͍ͯ͘͠😤
ΦϨΦϨϑϨʔϜϫʔΫ͍ͭͯ͜ΕΔ͔ • ͜͜ͷվળʢDIίϯςφɾࣗಈςετʣʹΑΓ ਐḿ͕ग़͘͢͠ͳ͍͍ͬͯΔ • ͱ͍͑खΛग़͠ʹ͍͘ͱ͜Ζଟ͍ • ͦ͏͍͏ͱ͜ΖੵۃతʹϦϑΝΫλ͍ͯ͘͠😤
ΦϨΦϨϑϨʔϜϫʔΫ͍ͭͯ͜ΕΔ͔ • ͜͜ͷվળʢDIίϯςφɾࣗಈςετʣʹΑΓ ਐḿ͕ग़͘͢͠ͳ͍͍ͬͯΔ • ͱ͍͑खΛग़͠ʹ͍͘ͱ͜Ζଟ͍ • ͦ͏͍͏ͱ͜ΖੵۃతʹϦϑΝΫλ͍ͯ͘͠😤
ෛ࠴ฦࡁͱͷόϥϯε͍͠ɻɻɻ😇
͕͜͜େม৽Ϋϥυج൫ʢNecoʣҠߦ • ίϯςφ͙͢ࢮ͵ʂVMϕʔε͔ΒͷϚΠϯυγϑτ • ΦϨΦϨϑϨʔϜϫʔΫ͍ͭͯདྷΕΔ͔ʁ • Πϯϑϥࣝ0͔ΒͷNecoҠߦνʔϜ࡞Γ
Πϯϑϥࣝ0͔ΒͷνʔϜ࡞Γ • Garoon։ൃνʔϜ͍··Ͱྑ͘ѱ͘ɺ ΠϯϑϥपΓΛؾʹͤͣ։ൃΛਐΊΒΕ͍ͯͨ • ΞϓϦέʔγϣϯϨΠϠͱΠϯϑϥϨΠϠ͕ผΕ͍ͯͨ • ίϯςφʁK8sʁͳʹͦΕ͓͍͍͠ͷʁ
ΤΩεύʔτνʔϜͷڠྗ • ੜ࢈ੑ্νʔϜϝϯόʔʹظతʹJoin • Docker, CIͷΤΩεύʔτ • ίϯςφԽͷݟΛνʔϜʹ ڞ༗ͯ͠Β͏
• खͷपΓʹ͍͘CIͷඋਐΊͯΒ͏ https://blog.cybozu.io/entry/2020/08/31/080000
Ϟϒ • ࡞ۀجຊϞϒ • ϞϒͷதͰνʔϜͷݟΛڞ༗͍ͯ͘͠ • ΤΩεύʔτʹϞϒʹೖͬͯΒ͏
ใ • ใʹٙΛॻ͖ࠐΉͱ ӡ༻νʔϜNecoνʔϜ͔Βճ͕ಧ͘
νʔϜͰͷษڧձ • ӡ༻ͷجૅࣝΛνʔϜͰ͚ͭΔ • DevOpsϋϯυϒοΫͷྠߨ
ΠϯϑϥͰֶͿ͜ͱଟ͍ • ΤΩεύʔτνʔϜʹϞϒʹೖͬͯΒ͏ • ٙΛใʹॻ͘ͱ͑ͯ͘ΕΔ • ࣭ശ͋Δ • ྠಡ͍͖ͬͯ