ϥ ࡞ Γ ͷ ݁ Ռ ʹ ɺ H e r o k u ͔ Β A W S ࡌ ͤ ସ ͑ ɺ Α Γ Ϟ ό Πϧ Λ ॏ ࢹ ͨ͠Ξʔ Ω ς Ϋ ν ϟ ʹ ม ߋ ӈ ࣌ ͷ ߏ ਤ ʹ U b u n t u ͔ Β C o r e O S ʹ ม ߋ ɻ ͜ ͷ ʹ C h e f Λ Ί ͯɺ D o c k e r f i l e Ұ ຊ ʹ ͨ͠ ɻ ͦ ͷ ޙ ɺ ͔ Β K u b e r n e t e s Ҡ ߦ Λ ͡ Ί ͯ ͍ ͘ ɻ 8
ϥ ࡞ Γ ͷ ݁ Ռ 2 0 1 6 Wa n t e d l y P e o p l e M i c r o s e r v i c e s o n K u b e r n e t e s ͜ Ε · Ͱ ͷ R u b y o n R a i l s ( U n i c o r n ) ͷ Έ ͠ ͔ ͑ ͳ ͍ σ ϓϩ Π ϑ ϩ ʔ Λ Ί ɺ ʮ ม Խ ʹ ڧ ͍ Π ϯϑ ϥʯ Λ ࠶ ݱ Ͱ ͖ Δ Α ͏ ͳ ج ൫ ʹ ͨ͠ ɻ ݱ ࡏ ɺ ࣌ ͷ α ʔ Ϗε ͷ ഒ Ҏ ্ ͷ α ʔ Ϗε ͕ Ք ಇ ͯ͠ ͍ Δ ʢ ӈ ࣌ ͷ ߏ ਤ ʣ 9
M a c h i n e Λ ಈ ͔ ͢ • H o r i z o n t a l P o d A u t o s c a l e r • C u s t o m m e t r i c s • C l u s t e r A u t o s c a l e r w ӡ ༻ ͷ ౷ Ұ • k u b e c t l • t h i r d p a r t y t o o l s ( i s t i o c t l … ) • x x x - o p e r a t o r ( v a u l t - o p e r a t o r, e t c d - o p e r a t o r … ) • m a n i f e s t f i l e Ͳͷ Ξ ϓ Ϧ έ ʔ γ ϣ ϯ ʹ Ҡ ͬͯ ɺ ಉ ͡ ί Ϛ ϯ υ Ͱ Ұ ௨ Γ ͷ ۀ ͕ Ͱ ͖ Δɻ ϛ υϧ ΣΞ ͞ ͬ͘ ͱ ೖ Ε Δ ͷ Ͱ͋ Ε ଞ ͷ M a n i f e s t f i l e ͔ Β ഈ आ ͯ͠ ࢼ ͤΔ 12
n e t e s Λ औ Γ ר ͘ Τ ί γεςϜ ͷ Ը ܙ • S e r v i c e m e s h ( I s t i o , E n v o y … ) • N e t w o r k i n g ( A m b a s s a d o r, Te l e p l e s e n c e , Ko n g … ) • M o n i t o r i n g ( P r o m e t h e u s , D a t a d o g , N e w R e l i c … ) • m i n i k u b e • H e l m c h a r t • C l o u d S e r v i c e s • C o m m u n i t y Ϋϥελʹ͍Δ͚ͩͰɺΤίγεςϜͷԸܙ͕ಘΒΕΔϝϦοτͰ͔͘ɺΫϥελʹ͍ͳ͍ ͜ͱͰى͜ΔίετͱϦεΫ͕ߴ͍ɻ·ͨڧྗͳ Community ɺੈͷதͷΞʔΩςΫνϟ͕ Ͳ͏͍͏՝͕͋ΓɺͲ͜ʹ͔͍ͬͯΔͷ͔͕Θ͔Δɻࣗͨͪͷٕज़ͷίϯύεʹͳΔɻ 13
u c t s i s Wa n t e d l y V i s i t , Wa n t e d l y Pe o p l e 60+ M i c r o s e r v i c e s 70+ K u b e r n e t e s N o d e s 3K+ C o n t a i n e r s
2.05 2.47 3.20 3.33 3.50 4.10 4.50 5.00 5.40 6.00 6.70 X X X M i c r o s e r v i c e s S e r v e r M a c h i n e Machine ͱ Server ม Խ ʹ ڧ ͍ Π ϯ ϑ ϥ ࡞ Γ ۭ ͍ͯ ͍ Δ Ϧ ιʔεΛ ଞ ͷ α ʔ ϏεͰ ར ༻ ͢Δ ͜ͱͰɺ ʮ ม Խ ʹ ڧ ͍ Π ϯϑ ϥʯ ͱ ޮ ੑ Λ ߴ Ί Δ 16
ൃ ڥ R a n k i n g , P r o f i l e , Fr i e n d … ڞ ௨ σʔ λ ͨ ͘ ͞Μ ͋ Δ Ͳ͏ ͬ ͯ ଞ α ʔ Ϗε ʹ ൖ ͨ͠ Γɺ Ωϟ ο γϡΫ Ϧ Ξ ͢Δ ϕε τϓϥ Ϋ ςΟ ε ৽ ͠ ͍ ϛ υϧ ΣΞΛ ೖ Εͯ ν ʔϜΛ ӽ ͑Δ ͱ ͨ Γ લ ͡Ό ͳ͘ ͳΔɻ ͯ͢ͷ α ʔ Ϗε Λ ϩ ʔΧϧ 1 $ Ͱ ཱ ͯΔ ڞ ༗ ͷ ڥ ਖ਼ ͘͠ ἧ ͬͯ ͍ Δ ಈ ͍ͯ ͍ Δ ʁ σʔ λͷ ߋ ৽ ਖ਼ ͍͠ʁ Microservicesʹ͓͚Δ՝ ͜ ͷ ظ ؒ ʹ ۩ ମ త ʹ ى ͜ ͬ ͨ ͜ ͱ ݸ ͷ M i c r o s e r v i c e s ͷ ͱ͖ ɺ ਓ ؒ ʹ Α Δ ཧ Ͱ े ӡ ༻ Λ ճ ͢͜ͱ ͕ Ͱ͖ ͯ ͍ͨɻ ࣗ ಈ Խ t e m p l a t e ͕ ਐ Έɺ M i c r o s e r v i c e ͕ ࡞ Γ ͢ ͍ ੈ ք Ͱ ى ͜Δ ͜ͱɻ ϧ ʔ ςΟ ϯ ά α ʔ Ϗεͷ ׂ Λ͠ ͯ ͍͖ͨ ͍ ͚Ͳɺ ύ εϨ ϕ ϧ ͷ ม ߋ ΛͲ ͜ · Ͱ ख ಈ Λ ڐ ༰ ʁ " # ςε τ Ͳ͏ ͢Δ ʁ 19
ʹ Ճ ͞ Ε Δ ࡞ ۀ w To i l τ Πϧ w Ku b e r n e t e s ͷ m a n i fe s t ͷ ม ߋ w C l u s t e r * m i c ro s e r v i c e * d e p l o y m e n t Ͱ ม ߋ ࿙ Ε ͕ ى ͖ ͢ ͍ w n * n ͷ ࡞ ۀ p u b l i c _ u r l ͔ Β i n t e r n a l _ u r l ͷ ม ߋ w Ξ ϓϦ έ ʔ γ ϣ ϯ ଆ ಉ ͡ Α͏ ͳ ί ʔ υ Λ ྔ ࢈ M o n i t o r i n g ܥ ϝ τ ϦΫε ऩ ू w S S L ূ ໌ ॻ ߋ ৽ ͕ 2 0 0 ྫ A C M ͱ E L B ͷ S S L ΞΫη ϥ Ϩ ʔ λʔ Λ ͍ ɺ S S L ূ ໌ ॻ Λ i m p o r t ͢Δͩ ͚ ʹ ͢Δ ͳͲɺ ࠜ ຊ త ʹ O ( 1 ) ʹ Ͱ͖ ͳ ͍ ͔ ߟ ͑Δ 20
w ελοΫτϨʔεͦͷϦϙδτϦ͚ͩͷใͷΈ w ௨৴݁ՌͷσʔλΛॲཧ͢ΔҰ࿈ͷϑϩʔͰΤϥʔ͕ى͖ͨ߹ w ୭͕Ͳ͏͍͏ϦΫΤετΛͯ݁͠Ռ͕Ͳ͏ͩͬͨͷ͔ʁ w λΠϛϯάɾΠγϡʔͰ্ख͍͔͘ͳ͍έʔεͰͦͷલޙͷϦΫΤετΛΈ͍ͨ w ϚΠΫϩαʔϏεؒͰ n + 1 ͷϦΫΤετ͍ͯ͠Δ͜ͱʹؾ͚ͮͳ͍ 22
Rails config/settings/{production,qa,development}.yml URLΛॻ͘ඞཁ w URLʹinternal_urlͱpublic_url w ൚༻తʹࢀর͞ΕΔΑ͏ͳαʔϏεɺMicroserviceඞཁ w log ͷϨʔϧ w ΠϕϯτϩάΛՃ͢ΔϨʔϧ͋Δ͔ʁ w ΞΫηεϩάউखʹΑ͠ͳʹऔͬͯ͘Εͳ͍ͷ͔ʁ w ϑΥʔϚοτͷܾ·Γ JSON , LSTV w ܽଛͦͦͲͷ͘Β͍͋Δͷ͔ʁ 24
HTTP ΫϥΠΞϯτͷڍಈ͕౷Ұ͞Ε͍ͯͳ͍ w ίʔυʹڞ௨Խ͞Ε͍ͯͳ͍ w λΠϜΞτͱϦτϥΠͷॳظઃఆ͋Δͷ͔ʁ w ϔομʔʹͲ͏͍͏ใΛೖΕΔͷ͔ʁ w αʔϏεؒͷೝূΛͲͷΑ͏ʹ͢Δͷ͔ʁ w current userͷൖͲ͏͢Δͷ͔ʁetc w ͋ΔΤϯυϙΠϯτ͕ԿΛظ͍ͯ͠Δͷ͔͕Θ͔Βͳ͍ w ύϥϝʔλͷεΩʔϚͷཧ༝͕Ԟ·Ͱಡ·ͳ͍ͱΘ͔Βͳ͍ 25
Ϣʔβʔ૿ՃͰɺେྔʹϦΫΤετΛૹΔ͜ͱʹͳΔ w αʔόʔ͔ΒɺRDSElastiCacheʹৗʹؾΛ͏ w దͳසʹsleep͢Δͱ͍͏ঊͷٕ w ͦͦඇಉظͰྑ͍λεΫྑ͍ײ͡ʹΕͳ͍ͷ͔ w ຊདྷͷׂΛେ͖͑ͨ͘ػೳΛ࣋ͭαʔϏε͕͋ΓɺԿނ͔ඞ͍ͣ߹Θͤͷதʹଘࡏ ͢Δ 26
͢ ͍ w σʔλͷൖ w ͦΕͧΕͷMicroserviceͰCache͍ͯͨ͠߹ʹPurgeΛͲ͏͢Δ͔ w มߋΛͲ͏͑Δ͔ w ڞ௨ͷσʔλͷϋϯυϦϯά w ෳͷϨΠϠʔͰऔΓΉඞཁ͕͋Δ w ྫϓϩϑΟʔϧʹΧϥϜΛͭՃͯ͠ಡΈॻ͖͢Δ w A αʔϏεʹ schema Ճ -> B αʔϏεͷ Garage Λมߋ -> C αʔϏεͷ garage proxy Ϟσϧमਖ਼ -> D αʔϏεʹॻ͖ࠐΈ endpoint • Microservice ʹͯ͠ɺϥΠϒϥϦͱͯ͠Γग़ͯ͠ɺશ෦࠷৽ʹ্͛ΔͱՃ͞Εͳ͍͔ʁ 27
Γ ͳ ͍ ҉ w Microservicesͷجຊతͳࣝ w ྫDBͷڞ༗ͷͰ͖Εආ͚Δ w ΤϯυϙΠϯτɺϦΫΤετͷதΓͱΓํࣜ w ؔऀͷࣝʹΒ͖ͭ w ৫શମͰͷAPIͷ࡞ΓํʹϨʔϧ w API࣮ํ๏ w I/F ϧʔϧ w όϥόϥʹΑΔݺͿଆͷੜ࢈ੑ͕Լ͛ΒΕΔ 28
Γ ͳ ͍ w ར༻͢ΔOSSͷѻ͍ʹؔ͢ΔϨʔϧ w ԿΛͲͷϨϕϧ·Ͱѻ͏ͷ͔ w ج४ͳʹ͔ w DockerfileͲ͏͍͏෩ʹॻ͍ͨΒ͍͍͔ w ݴޠʹΑ͔ͬͯΘΔ w Alpine Linux Ͱফ͢Δͷ͕ͭΒ͍ w ٕज़Λपͤ͞Δॴ w ͦͷͰཧղ͠ͳͯ͘ɺ͏Ұ୳ͤΔॴ͕ͳ͍ 29
Topic branch Ͱ֬ೝ͠ͳ͕Β։ൃ͍ͨ͠ w ಛఆͷϧʔςΟϯά͢Δज़͕ͳ͍ͨΊɺ master Ͱৗʹ֬ೝ͍ͯ͠Δςελʔ͞Μͱ࿈ܞ ͯ͠ڞ༗ڥʹͩͯ֬͠ೝ͢Δ͔͠ͳ͍ w A service -> B sevice -> C service ͱ͍͏ϚΠΫϩαʔϏε͕ؒ͋ͬͨ࣌ w B ͷ։ൃ͕͗͢͠Δ w ϦΫΤετΛ࠶ݱ͢Δ؆୯ͳํ๏ͳ͍͔ʁ 31
ϋ ϯ υ Ϧ ϯ ά Ͳ ͜ Ͱ Δ ʁ w ΞʔΩςΫνϟͷมߋαʔϏεׂ͢Δࡍ w Ͳͷ͘Β͍ΠϯύΫτ͕͋Δʁ w Θ͔Βͣාͯ͘ग़͠ʹ͍͘ɺΧφϦʔσϓϩΠͯ͠ཉ͍͠ͱ͖͕͋Δ w A/B ڥͰνΣοΫ͍ͨ͠ w inͱout͕ಉ͡Ͱ͋Δ͜ͱΛอূΛνΣοΫ͢ΔΈ͕΄͍͠ w timeout ͱ retry Λશ෦ͷΞϓϦέʔγϣϯʹॻ͍͍ͯ͘ͷ͍͔ͭഁ͢Δ w αʔϏεΛׂ͢Δࡍʹ path ϕʔεͰ͚ΔͷΛ nginx.conf ͰΔͷ͍͔ͭݶք w API Gatewayʹ͍͖͍ͤͯͨ 32
͔ Β ɺ γ ΰ τͰί ί ϩΦ υϧ Λ ૿ ͢ ج ൫ Τϯ δχΞͷ ࣄ ྔ Λ ૿ ͢͜ͱ ʹ γ ϑ τ αΠτͷ৴པੑ S i t e R e l i a b i l i t y ΤϯδχΞશମͷੜ࢈ੑ D e v e l o p e r P r o d u c t i v i t y ίΞٕज़ͱͳΔج൫ ٕ ज़ ઓ ུ 34
KRʢՌࢦඪʣ w Ұਓ͋ͨΓ͕͜ͳͤΔࣄྔͷ֦େ w Ұਓ͋ͨΓͷػցֶशandࢪࡦͷPDCAͷαΠΫϧ͕ଟ͘ճͤΔ w தԝूݖͱׂ౷࣏ͷׂ߹͕దͰҰਓͻͱΓ͕νϟϨϯδͰ͖Δ w Ұਓ͋ͨΓͷࣄྔ͕ݮΔͷΛݮ w ͷՕॴΛ͙͢ʹಛఆͰ͖Δ w Γ͍ͨใ͕͙͢ʹΘ͔Δ w ౷Ұ͢Δ͖ͱ͜Ζ͕౷Ұ͞Ε͍ͯΔ 35
Ϧ ϯά ·ͱ Ίͯ Βͬͨ ͷ Λ ࢀ ߟ ʹ ϓϥ ΠΦϦ ςΟύ εΛ ܾ Ί Δɻ ͦ ͷ த Ͱɺ ಉ ࣌ ʹ ಈ ͔ ͤΔ ͷ ɺ ݱ ν ʔϜͰ 3 ͭ ͕ ݶ ք ɺ ͦΕͧΕͰ Ұ ൪ ߴ ͍ ͷ ʹ ू த ͢Δ αΠτͷ৴པੑʹͭͳ͕ ΔऔΓΈ S i t e R e l i a b i l i t y ΤϯδχΞ͕ࠔ͍ͬͯΔ ͜ͱͷղܾ D e v e l o p e r P r o d u c t i v i t y ະདྷʹඞཁͱͳΔίΞٕ ज़ͱͳΔج൫ͮ͘Γ ٕ ज़ ઓ ུ 37
ͭ ͳ ͕ Δ औ Γ Έ U p t i m e ί Ξό Ϧϡʔ ࢮ क S c a l a b i l i t y Ku b e r n e t e s Ҡ ߦ p o s t m o r t e m s ਖ਼͘͠ Λཧ ղɺ ֶ ͼΛ ੵ ͠ɺ ࠶ ൃ ࢭ ͱ ࠜ ຊ ର Ԡ D o c s a n d Ta l k ؔ ৺ ࣄ ͱ ҉ ͷ ڞ ༗ S c a l a b i l i t y ͱ p o s t m o r t e m s 38
Λ ޮ త ʹ ߦ ͏ F l u e n t d ܾ ·ͬͨ ϩ ά ܗ ࣜ Λ ૹ Δ D i s t r i b u t e d Tr a c i n g ӈ ͷ ਤ ɺ ϚΠΫ ϩ αʔϏε ؒ ͷτϨʔ εΛ ࣮ ݱ ͢Δ Service mesh ϚΠΫ ϩ α ʔ Ϗε ͷ ωο τϫ ʔ Ϋ ؒ Λ ͑Δ O p e n C e n s u s , S e r v i c e M e s h , F l u e n t d e t c 40