Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はてなのサーバプロビジョニングについて / Hatena Engineer Seminar #6

はてなのサーバプロビジョニングについて / Hatena Engineer Seminar #6

Yusuke Hagihara

September 02, 2016
Tweet

Other Decks in Technology

Transcript

  1. hagihala ͷ͜Ε·Ͱ • 2012/08 த్ೖࣾ • 2012/09ʙ2016/01 ͸ͯͳϒοΫϚʔΫ୲౰ • αʔόαΠυվળ

    • Elasticsearch ಋೖࢧԉ • etc… • 2014/??ʙ2016/01 ूӳࣾίϥϘҊ݅ (δϟϯϓϧʔΩʔɺ͋ͨ͠ ͷϠϯάδϟϯϓ) • αʔόγεςϜͷઃܭɾߏஙɾӡ༻ • 2016/02ʙ Mackerel ୲౰ • ଞɺωοτϫʔΫɺαʔόج൫ͳͲ
  2. ϓϩϏδϣχϯάͱ͸ • “ϓϩϏδϣχϯά(Provisioning)ͷຊདྷͷҙຯ͸ɺ௕ཱྀʹ޲ ͚ͯ৯ྉͳͲͷ֬อΛ͢Δ͜ͱͰ͋Δɻ” (Wikipedia ΑΓ) • ొࢁʁ • ࠓ೔࿩͢ͷ͸ʮαʔόϓϩϏδϣχϯάʯ

    • “ར༻Մೳͳαʔό܈ʢαʔόϑΝʔϜʣ͔ΒαʔόΛબͼ ग़͠ɺద੾ͳιϑτ΢ΣΞʢΦϖϨʔςΟϯάγεςϜɺ σόΠευϥΠόɺϛυϧ΢ΣΞɺΞϓϦέʔγϣϯιϑ τ΢ΣΞʣΛϩʔυ͠ɺγεςϜΛద੾ʹઃఆͨ͠Γɺαʔ όݻ༗ͷઃఆʢIPΞυϨεͳͲʣΛͨ͠Γɺͱ͍ͬͨ࡞ۀ ΛαʔόɾϓϩϏδϣχϯάͱݺͿɻ” (Wikipedia ΑΓ)
  3. ϓϩϏδϣχϯάϨΠϠʔ • http://mizzy.org/blog/2013/10/29/1/ • 3ͭͷϨΠϠʔʹ෼͚ͯߟ͑Δ • Orchestration • σϓϩΠɺΫϥελ؅ཧ •

    Capistrano, Consul ౳ • Configuration • ઃఆ؅ཧ • Chef, Ansible ౳ • Bootstrapping • αʔό (Πϯελϯε) ͷ࡞੒ɺOS Πϯετʔϧ౳ • AWS, OpenStack, kickstart ౳
  4. • ࠓճ࿩͢ͷ͸ Bootstrapping ͱ Configuration ͷ ͋ͨΓͰ͢ɻ Orchestration ͷωλ͸͋Γ·ͤΜ •

    ݫີʹ෼͚ΒΕΔ΋ͷͰ͸ͳ͍ͷͰɺଟগؚ Ή͙Β͍͸͋Δ͔΋ • ࣾ಺తʹ΋σϓϩΠΛؚ·ͳ͍χϡΞϯεͰ࢖ ΘΕΔ͜ͱ͕ଟ͍ؾ͕͢Δ
  5. ͸ͯͳͷαʔό؀ڥ (2012/08ೖࣾ ౰࣌) • DC (͘͞ΒΠϯλʔωοτͷϋ΢δϯάαʔϏε), Amazon EC2 • DC

    • ΄΅શαʔϏε͕Քಇ • ৽نௐୡ෼͸طʹࣗ࡞αʔόͰ͸ͳ͘ϕϯμ͔Βߪ ೖ • (աڈʹ͸αʔόᝑମ (ϑϨʔϜ) ͔Βࣗ࡞ͯ͠ ͍ͨ) • ϋΠύʔόΠβ (Xen) Ծ૝Խͯ͠࢖༻ • ಛघͳϋʔυ΢ΣΞߏ੒΍ύϑΥʔϚϯεཁ݅ ͷ΋ͷΛআ͘ • Amazon EC2 • ͸ͯͳϒϩάͷΈ EC2 ্Ͱӡ༻ (ࠓͰݴ͏ EC2 Classic) • ͪΐ͏Ͳ Amazon VPC ΁ͷҠߦ௚લ • τϦοΩʔͳ VPN ઀ଓͰ DC ͱܨ͕͍ͬͯͨ Amazon EC2 VPN VPN VPN VPN ژ౎ΦϑΟε ౦ژΦϑΟε DC (ϋ΢δϯά)
  6. ͸ͯͳͷαʔό؀ڥ (2016/08ݱࡏ) • DC, Amazon VPC, ͘͞Βͷઐ༻αʔό (New!) • DC

    • ࣗ࡞αʔό͸΄ͱΜͲୀ໾ࡁΈɺ·ͩҰ෦࢒ Δ • ঃʑʹॖখ • Amazon VPC • ϒϩάΛத৺ʹɺ͍͔ͭ͘ͷαʔϏε΍ɺαʔ ϏεͷαϒγεςϜ͕Քಇ • ઐ༻αʔό • ෺ཧαʔό΍ωοτϫʔΫػثͷબఆɺௐୡ ͔ΒϥοΩϯάɺอक·ͰΛؙʑΞ΢τιʔ ε • ෺ཧαʔό͔Β্͸ DC ͱ͍͍ͩͨಉ͡࢖͍ ํ • ຊ֨తར༻͸͜Ε͔Β Amazon VPC VPN ઐ༻ઢ VPN VPN VPN ژ౎ΦϑΟε ౦ژΦϑΟε DC (ϋ΢δϯά) ઐ༻αʔό
  7. ͳͥࠓɺઐ༻αʔό(ͦͯ͠ DC)ʁ • ӡ༻΋ؚΊͨτʔλϧίετ͕҆͘ࡁΉ (Β͍͠) • Ϋϥ΢υ͸(༻్ʹ΋ΑΔ͕)͚ͬ͜͏ߴ͍ • ઐ༻αʔό͸ DC

    ͱൺ΂ͯɺϥοΫͷిྲྀ΍ۭؒͷ؅ཧɺωοτ ϫʔΫͷઃܭɾߏஙɺނোͨ͠ϋʔυ΢ΣΞͷަ׵ͳͲͷӡ༻Λ Ξ΢τιʔεͰ͖Δ • DC ΍ઐ༻αʔόͰ͸ ioDrive ͷΑ͏ͳಛघͳϋʔυ΢ΣΞ΋࢖ ͑Δ • ࣗ༝౓͸ DC ͕࠷΋ߴ͍ • DC ʹ͍ͭͯ͸ɺଞ΁ͷҠߦΛ೉͘͢͠Δٕज़తͳ໰୊ͷ਺ʑ΋ • ϨΨγʔγεςϜ
  8. ͸ͯͳʹ͓͚ΔϓϩϏδϣχϯ ά(෺ཧ) • ϋʔυ΢ΣΞௐୡ • ϥοΩϯά৔ॴબఆ • ϥοΩϯά: ґཔ͢Δ •

    OS Πϯετʔϧ (ॳճ͸ґཔ) • PXE ϒʔτ • preseed (debian), kickstart(CentOS) ͰࣗಈΠϯ ετʔϧ • ηοτΞοϓεΫϦϓτ • ϦϞʔτ؅ཧ (IPMI) ઃఆ • Mackerel ΁ͷొ࿥ • Chef ࣮ߦ ઐ༻αʔόͰ͸ෆཁ Amazon VPCͰ͸
 ෆཁ
  9. ϓϩϏδϣχϯά (Ծ૝) • Ծ૝Խήετ (Xen domU) • ਌ͷબఆ: ਓ͕ؒ΍ͬͯΔ •

    ϝϞϦ΍σΟεΫͷۭ͖༰ྔΛ৚݅ʹϑΟϧλϦϯά্ͨ͠ Ͱɺ CPU ΍ I/O ͸֤ dom0 ͷෛՙঢ়گΛݟͯటष͍ํ๏Ͱ൑ அ • OS Πϯετʔϧɾىಈ: εΫϦϓτΛ࣮ߦ • ैདྷ: ຖճ debootstrap ౳Ͱ OS Πϯετʔϧॲཧ͕૸Δ (࣌ؒ ͕͔͔Δ) • ݱࡏ: ͋Β͔͡Ί OS ΠϝʔδΛ࡞੒ͯ͠ϑΝΠϧαʔόʹઃஔ ͓͖ͯ͠ɺ domU ࡞੒࣌ʹίϐʔɾϑΝΠϧγεςϜͷϦαΠ ζ • AMI ʹ฿͏ • ࣗಈͰ Chef ద༻͞ΕΔ Amazon VPCͰ͸
 ෆཁ
  10. Chef ӡ༻ • chef-solo ϕʔε • ͨͩ͠ɺ chef-solo ͸ DEPRECATED

    (ഇࢭ༧ఆ) • Ұ౓ chef-client local mode ϕʔεʹͨ͠ (؆୯) ͕ɺ cookbook ͷґଘؔ܎ ղܾ͕ chef-solo ΑΓ͍ͩͿ஗͔ͬͨͷͰҰ୴໭ͨ͠ܦҢ͕͋Δ • ݱࡏͷ chef-repo ͸2ੈ୅໨(2013/08ʙ) • ϦϙδτϦ໊ chef-repo2 • mainline (ͳ͔ͥϒϥϯν໊͸ staging) + τϐοΫϒϥϯν, GitHub flow • 1ੈ୅໨ (2010೥ʙ) ͸ Chef Server Λ࢖ͬͯͨ • ։ൃ͸ git-flow ϕʔεɺ cookbook ͷόʔδϣϯΛ Chef Server ͱ Environment Λ࢖ͬͯ؅ཧͯͨ͠ • ෳ਺ਓͰ࡞ۀ͢Δͱόʔδϣϯͷিಥ͕ى͜Γ͕ͪ • Chef Server ͕ϒϥοΫϘοΫεͷͨΊՄ༻ੑɾܧଓੑʹෆ҆
  11. Chef ӡ༻ • Mackerel ͷ Service:Role Λ Chef ͷ Role

    ͱ1ର1ରԠ • Chef ʹ͸ Service (Role ͷ֊૚ߏ଄) ͷ֓೦͕ແ͍ͷͰ୯७ʹ ϑϥοτԽͯ͠࢖༻͍ͯ͠Δ • ྫ: Hatena-Bookmark:proxy → role[Hatena-Bookmark— proxy] • roles/Hatena-Bookmark/proxy.rb ͷΑ͏ʹ഑ஔ͠ɺ࢖༻ ͢ΔࡍʹϑϥοτԽ (+json Խ) ͍ͯ͠Δ • ࣗࣾͷ cookbook ͸ chef-repo ʹू໿ɺ Berkshelf Ͱ֎෦ͷ cookbook ΋࢖༻ • ୯७ԽͷͨΊશͯͷ cookbook Λ Berkshelf ͷ؅ཧԼʹஔ͍ͯ ͍Δ
  12. knife-saba • ख΋ͱ͔Βͷద༻͸ knife-saba ͱ͍͏ಠࣗπʔ ϧͰߦ͍ͬͯΔ • knife-solo ϕʔε •

    `knife saba cook <ϗετ໊>` • Mackerel ͔Βϗετͷ Service:Role Λऔಘ ͠ɺରԠ͢Δ Chef Role Λద༻ • ҰԠɺ։ൃ༻ͱ͍͏Ґஔ෇͚
  13. ຊ൪؀ڥͰͷ Chef ద༻ • Jenkins Ͱ chef-repo ͷϑΝΠϧ܈Λ tarball ʹݻΊͯϑΝΠϧαʔόʹΞοϓϩʔυ

    • kitchen tarball ͱݺΜͰΔ • knife-solo ͕ chef-repo ͷϑΝΠϧ܈ Λ kitchen ͱݺΜͰΔͷʹ฿͍ͬͯΔ • ͚Ͳ test-kitchen ͱฆΒΘ͍͠ • Chef ద༻εΫϦϓτʹΑΓར༻͞ΕΔ • Chef ͷߋ৽ • kitchen tarball ͷμ΢ϯϩʔυɾల։ • Mackerel ͔Β Service:Role औಘ • Chef ద༻ push, merge GitHub
 Enterprise webhook ϏϧυɾΞοϓϩʔυ tarball औಘ ϑΝΠϧαʔό αʔό Service:Role
 औಘ Chef ద༻ chef-repo
  14. Chef ՝୊ • ֶश͕೉͍͠ • (׳ΕΔ·Ͱ͸) ௚ײతͰͳ͍ڍಈ • ແବʹෳࡶʹͳΓ͍͗ͯ͢Δؾ͕͢Δ •

    ಛʹ attribute ͷछྨͷଟ͞ͱ͔ • γϯϓϧʹ͢Δಈ͖΋͋Δ͕ɺྑ͍ํ޲ʹసͿ͔Ͳ ͏͔ • cookbook ͷॻ͖ํͷτϨϯυɺػೳͷ੔ཧ • Chef 12.5ʙͷ Custom Resource ͸ಠࣗͷ Resource ͷॻ͖ํΛγϯϓϧʹ͢ΔҰํͰ৽ͨ ͳམͱ݀͠Λ࡞ͬͯͨ • ςετ͕ճ͍ͤͯͳ͍ • ͏ͪͷ໰୊ • Πϯϑϥςετ೉͍͠ • ίʔυΛ Chef Ҏ֎Ͱ࠶ར༻ͮ͠Β͍ • ͦ͏͍͏ॲཧ͸ Chef ͷ֎ʹಀ͕͢΂͖͔ • ผͷπʔϧ࢖͍͍ͨతͳ෩౰ͨΓ͸ײ͡Δ Attribute Precedence
  15. AMI, OS Πϝʔδͷ࡞੒ʹ͍ͭ ͯ • (ൃදͰ͸͕࣌ؒ଍Γͣɺলུ͠·ͨ͠) • ೰Έ: AMI ͷϝϯςφϯε໰୊

    • ݩʑ AMI ͸طଘͷύϒϦοΫͳ AMI Λϕʔε ʹɺख࡞ۀͰΧελϚΠζͯ͠࡞ΒΕ͍ͯͨ (͸ͣ) • OS ͷΞοϓσʔτʹ௥ਵ͠ͳ͍ͱ௠෗Խͯ͠ ͠·͏ • Xen ༻ͷ OS Πϝʔδʹ͍ͭͯ΋ಉ༷ͷ໰୊
  16. Debian ެࣜ AMI Λ௚઀࢖͏ • ͸ͯͳͰ࠷ۙϝΠϯͰ࢖͍ͬͯΔσΟετϦϏϡʔγϣϯ͸ Debian • Debian ʹ͸ެࣜͷ

    AMI ͕͋Δ • https://wiki.debian.org/Cloud/AmazonEC2Image • cloud-init ͱ͍͏πʔϧ͕͋ΓɺDebian ެࣜ AMI ʹ΋͜Ε͕ೖͬͯ ͍Δ • user-data Ͱ౉ͨ͠ઃఆʹैͬͯىಈ࣌ʹΠϯελϯεΛΧελ ϚΠζͨ͠Γɺ೚ҙͷεΫϦϓτ΍ίϚϯυΛ࣮ߦͰ͖Δπʔϧ • Debian ެࣜ AMI Λ࢖༻͠ɺैདྷ AMI ࡞੒࣌ʹ΍͍ͬͯͨॲཧΛى ಈ࣌ʹ cloud-init Ͱ࣮ߦ͢ΔΑ͏ʹ • ࠷ऴతʹ͸΄΅શͯͷઃఆΛ Chef recipe ʹҠ͠ɺ cloud-init Ͱ Chef Λ࣮ߦͯ͠ηοτΞοϓΛߦ͏Α͏ʹͨ͠
  17. ͔Ώ͍ॴʹख͕ಧ͔ͳ͍ • ৭ʑ΍͍ͬͯ͘͏ͪʹެࣜ AMI ͩͱݫ͍͠ͱ͜Ζ͕ग़͖ͯͨ • ಠࣗϏϧυͨ͠ΧʔωϧΛ࢖͍͍ͨɺ enhanced networking (SR-IOV)

    Λ༗ޮʹ͍ͨ͠ • (Debian7 AMI Ͱ͸σϑΥϧτͰ enhanced networking ແޮͩͬͨɻ Debian8 ͸༗ ޮ) • ΠϯελϯεΛىಈ → cloud-init ͷ boothook εΫϦϓτ಺ͰΧʔωϧΞοϓσʔ τɾγϟοτμ΢ϯ → ΠϯελϯεͷఀࢭΛ֬ೝޙ enhanced networking ༗ޮԽ (Πϯελϯε࡞੒࣌΍ΠϯελϯεՔಇத͸ઃఆͰ͖ͳ͍) → ࠶౓ىಈ • → εΫϦϓτ͕ෳࡶԽɺ͔͠΋ηοτΞοϓʹ͕͔͔࣌ؒΔ • Debian7 Ͱ͸ EBS ϘϦϡʔϜ্ʹ௚઀ϑΝΠϧγεςϜΛ࡞͍ͬͯͨͷʹ Debian8 ެࣜ AMI Ͱ͸ύʔςΟγϣϯׂ͕ΒΕ͍ͯΔ • → ϧʔτϘϦϡʔϜͷ֦ு͕ෳࡶʹͳΔ͠ɺطଘͷΠϯελϯεͱӡ༻͕ҟͳ Δͱ΍ΓͮΒ͍ • cloud-init ͸ࣦഊ࣌ͷௐࠪ΍σόοά͕ͮ͠Β͍ɻ͋·ΓτϦοΩʔͳ͜ͱΛ΍Γͨ͘ ͳ͍
  18. ެࣜͱ΄΅ಉ͡ AMI Λ࡞Δ • bootstrap-vz (https://github.com/andsens/bootstrap-vz) • Debian ͷެࣜ AMI

    ࡞੒ʹ࢖ΘΕ͍ͯΔπʔϧ • ࡞੒͢Δ AMI ͷߏ੒Λ yaml ઃఆϑΝΠϧ (manifest) Ͱهड़ • manifest ΛΧελϚΠζ͢Δ͜ͱͰɺެࣜ AMI ͷߏ੒ΛϕʔεʹΧελ ϚΠζͨ͠ AMI Λखܰʹ࡞ΕΔ • AMI Ҏ֎ͷΫϥ΢υ΍ raw σΟεΫΠϝʔδʹ΋ରԠ • Debian ͷϝϯςφʹΑͬͯܧଓతʹϝϯςφϯε͞Ε͍ͯΔ • ॳظ AMI (initial AMI ͱݺͿ) ͸ bootstrap-vz Ͱ࡞Δ͜ͱʹͨ͠ • DC ͷ domU OS Πϝʔδͷ࡞੒ʹ΋ bootstrap-vz Λ࢖༻͠ɺ DC ͱ EC2 Ͱಉ͡ߏ੒ͷΠϝʔδΛ࢖༻ • ͦΕͧΕࣗಈͰ࡞੒͢ΔεΫϦϓτΛॻ͍ͨɻCI πʔϧͰఆظతʹߋ৽… ͱ͍͏ͷ͸·ͩ͜Ε͔Β
  19. Chef ద༻ࡁΈ AMI • packer Λ༻͍ɺಛఆͷ AMI Λϕʔεʹ Chef ద༻ࡁΈͷ

    AMI Λ࡞੒ • packer ઃఆΛੜ੒ͯ͠ packer Λ࣮ߦ͢ΔϥούʔεΫϦ ϓτ • ͸ͯͳͷҰൠϗετʹڞ௨ͷઃఆΛ·ͱΊͨ “base ϩʔϧ” ద ༻ࡁΈͷ AMI Λ࡞ΓɺҰൠͷΠϯελϯε͸͔ͦ͜Βىಈ͢ Δ͜ͱͰηοτΞοϓ࣌ؒΛ୹ॖ • Πϯελϯε࡞੒࣌ʹ΋ Chef Λద༻͢Δ͜ͱͰɺႈ౳ੑΛར ༻ͯ͠ΠϯελϯεͷઃఆΛ࠷৽Խ • chef-repo ͷߋ৽ͷͨͼʹຖճ AMI Λ࡞Γͳ͓͢ͷ͸ඇޮ ཰
  20. ݸผϩʔϧͷ AMI ࡞੒ • લทͷ AMI ࡞੒εΫϦϓτͰɺಛఆϩʔϧ༻ʹηοτΞοϓ͞Εͨ AMI (role AMI)

    ΋࡞੒Ͱ͖Δ • ΰʔϧσϯΠϝʔδతͳ • Πϯελϯε࡞੒࣌ʹϩʔϧΛࢦఆ͢ΔͱɺϚον͢Δ AMI Λ୳ ͠ɺଘࡏ͢Ε͹ͦͷ AMI Λ࢖ͬͯىಈ͢Δ࢓૊Έʹͳ͍ͬͯΔ • ର৅ AMI ͕ແ͚Ε͹ base ʹϑΥʔϧόοΫ • Ͱ΋ɺ·ͩ͋·Γ࢖ΘΕ͍ͯͳ͍ initial AMI bootstrap-vz base AMI packer role AMI
 (app-1) role AMI (app-2) packer
  21. ՝୊ • CI πʔϧͰܧଓతʹϏϧυ͍ͨ͠ • ։ൃ؀ڥͷҰ෦ (Jenkins Slave) Ͱಋೖ͍ͯ͠Δ •

    ࡞੒ॲཧΛࣗಈԽͯ͠΋ɺͦͷ࣮ߦ·ͰࣗಈԽ͠ͳ͍ͱ΍͸Γ௠ ෗Խ͢Δ • ͍ͭͷؒʹ͔ಈ͔ͳ͘ͳΔ • ࣗಈͰ΍ΔͨΊʹ͸ඞવతʹ࣭ͷߴ͍ςετ΋ඞཁʹͳΔ • ؅ཧ͢΂͖ AMI ͷछྨ͕૿͑Δͱͦͷϝϯςφϯε΋େมʹͳΔ • ؅ཧ͢Δ࢓૊Έ͕ෆे෼ • DC ΍ઐ༻αʔόʹ΋ಉ༷ͷ࢓૊ΈΛ • ͦ΋ͦ΋࿦: ίϯςφٕज़ͷํΛؤுΔ΂͖ʁ
  22. ·ͱΊ • αʔόϓϩϏδϣχϯάʹ͍ͭͯ࿩ͨ͠ • ͸ͯͳͷαʔό؀ڥ • Chef ӡ༻ • AMIɾ

    OS Πϝʔδ࡞੒ • ଞʹ΋͋Δ • ௕͘ଓ͘αʔϏεɺଟ਺ͷখ͞ͳαʔϏε͕͋Δ؀ڥ • ͋·Γେֻ͔ΓʹͳΓա͗ͣɺͳΔ΂͘γϯϓϧͳπʔϧͷ૊Έ߹ ΘͤͰ࣮ݱ͢ΔΑ͏৺͕͚Δ • πʔϧΛΑΓྑͨ͘͠ΓɺͦΕͧΕͷ֓೦Λ͢Γ߹Θͤͯ͏·͘࿈ ܞΛऔΕΔΑ͏ʹ͢Δͷ͸ָ͍͠ • ࠷ۙ͸ CI ͷվળʹ΋ڵຯ͋Δɻ Jenkins Pipeline ͱ͔