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

歴史から紐解く Linux カーネルのコンテナ機能 / KOF2019

tenforward
November 08, 2019

歴史から紐解く Linux カーネルのコンテナ機能 / KOF2019

KOF 2019 の講演資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。

tenforward

November 08, 2019
Tweet

More Decks by tenforward

Other Decks in Technology

Transcript

  1. ࣗݾ঺հʢ2ʣ झຯ〜ぢアふべ〹〘〛〳『ɻぢアふべ〣ओ〠じがぼ゚पล〣࣮૷〠ڵຯ⿿⿴〿〳『ɻ 2007 ೥ ぢアふべぇ࢖〘〔つがもと։ൃʢVirtuozzoʣ 2009 ೥ OpenVZ/LXC ৮〿〕『 2013

    ೥ ୈ 1 ճぢアふべܕԾ૝Խ〣৘ใަ׵ձɹ։࠵ LXC ೔ຊޠ man pages ຋༁&ろがで ʢݱࡏ〤 LXD ؔ࿈〣຋༁ɺlinuxcontainers.org ຋༁〷〹〘〛〳『ʣ 2014 ೥ gihyo.jp 〜 ʮLXC 〜ֶ〫ぢアふべೖ໳ ʵܰྔԾ૝Խ؀ڥぇ࣮ݱ『぀ٕज़ʯ ࿈ࡌ։࢝ ݱࡏ CloudNative 〣೾〠৐〿஗ぁ぀ 3/39
  2. ຊ೔〣಺༰ ɹʮྺ࢙ぇඥղ。ʯ〝⿶⿸のぐぷ゚〜『⿿ɺྺ࢙ぇશ෦௥〘〛⿶぀〝࣌ؒ⿿଍〿〳【えɻ࣍〣෦ ෼〣ゃひぜぎひゆ「〛આ໌「〳『ɻ • ぢアふべ〝〤 • ぢアふべ〣やきぐ゚てとふわ • ぢアふべ〣ぼひぷゞがぜ •

    ぢアふべ〣࣮ߦݖݶ ɹ〳〔ɺ࠷ۙ〤 OCI 〠४ڌ「〔ଟ਺〣ぢアふべ゘アのぐわ⿿ग़〛 〛⿶〳『ɻ〈〣த〠〤 VM 〹 Unikernel 〟〞〣ٕज़ぇ࢖〘〔゘アのぐわ⿿⿴〿〳『⿿ɺຊ೔ѻ⿸〣〤ੲ⿾〾ʮぢアふべʯ 〝ݺ〥ぁ〛⿶〔ɺゆ゜なとִ཭ܕ〣ʮぢアふべʯ〜『ɻ ɹぢアふべ࡞੒〠࢖⿸ぢろアへ〤 unshare ぢろアへɺip ぢろアへ〜『ʢDocker 〹 LXC 〤࢖ ⿶〳【え!!ʣ ɻ 5/39
  3. Linux 〠⿼々぀ぢアふべ Linux じがぼ゚〠〤ʮぢアふべʯ〝⿶⿸ػೳ〤͋Γ·ͤΜɻじがぼ゚〠࣮૷《ぁ〔৭ʑ〟ػೳΛ ૊Έ߹ΘͤͯʮίϯςφʯΛ࡞Γ·͢ɻ Docker 〹 LXC/LXD 〝ݴ〘〔ぢアふべ࣮૷ぇ࢖⿸୅い〿〠ࣗ෼ʹඞཁͳػೳ͚ͩΛબΜͰίϯ ςφΛ࡞Δ͜ͱ΋Ͱ͖·͢ɻ

    Linux じがぼ゚〠࣮૷《ぁ〔⿸〖ɺぢアふべ༻〣ओཁػೳ: Namespaceʢ໊લۭؒʣ: ʮִ཭ۭؒʯΛ࡞Δɻִ཭͢ΔϦιʔε͝ͱ〠 Namespace ⿿ଘࡏ cgroup: ゆ゜なと〠ର「〛Ϧιʔε੍ݶΛߦ͏ ຊ೔〤〈〣⿸〖 Namespace ぇத৺〠⿼࿩「〳『ʢKubernetes 〜〷 Namespace 〝⿶⿸໊ લ⿿ग़〛 〳『⿿ɺ〒ぁ〝〤ผ〣 Linux kernel 〣ػೳ〜『ʣ ɻ 8/39
  4. chroot ΋ͬͱ΋ྺ࢙ͷ͋Δίϯςφʢతػೳʣ • 1979 ೥ UNIX Version 7 〜〣৽ػೳʢੜ〳ぁ〛〔ਓʂʣ •

    1982 ೥〠 BSD 〠ಋೖ • chroot 「〔ぶく゛ぜぷ゙ҎԼ「⿾ݟ⿺〟⿶ • Linux 〠⿼々぀ chroot: • ゆ゜なと〤゚がぷぶく゛ぜぷ゙〣৘ใぇ࣋〘〛⿶぀ chroot 「〛⿶〟⿶ゆ゜なと chroot 「〔ゆ゜なと 11/39
  5. pivot_rootʢ2.3.41/2000 ೥ʣ • root ϑΝΠϧγεςϜࣗମΛऔΓସ͑Δʢൈ々぀〝⿶⿸֓೦⿿〟⿶ʣ • chroot 〠ൺ〮〛 pivot_root 〜 ぀৚݅〤ݫ「⿶

    pivot_root લ pivot_root ޙ • ʮ৽「⿶ root やきぐ゚てとふわʯ⿾〾〤ൈ々ग़【〟⿶ • Docker 〹 LXC/LXD 〟〞〤 pivot_root ぇ࢖༻「〛⿶぀ 13/39
  6. ぶゑʢ1ʣ pivot_root 〝 bind mount 〝 Mount namespace 〣ぶゑ Namespace

    ぇ؆୯〠࡞぀〠〤 util_linux ෇ଐ〣 unshare ぢろアへ⿿࢖⿺〳『 1. Mount namespace ぇ࡞぀ 2. pivot_root 『぀〔〶〠ぢアふべやきぐ゚てとふわぇผぶく゛ぜぷ゙〠 bind mount 『぀ 3. mount ৘ใぇऔಘ『぀〔〶〠ぢアふべ༻〠 proc やきぐ゚てとふわぇ mount 『぀ 4. pivot_root 『぀ʢҎલ〣 / 〤 /old 〠ろげアぷ『぀ʣ 5. ぢアふべ಺〜 / ぇ umount 『぀ 16/39
  7. 2000 ೥ʙ2005 ೥〣ぢアふべք۾ɹ〒〣ଞ〣࿩୊ 2000 ೥ FreeBSD jail 2002 ೥ VirtuozzoʢLinux

    ޲々঎༻ぢアふべʣ゙゙がとʢ։ൃ〤 1999 ೥։࢝ʣ 2004 ೥ Solaris Containers (Zone) 2005 ೥ OpenVZ ゆ゜でこぜぷൃ଍ʢOSS ൛ Virtuozzoʣ 18/39
  8. 2006ʙ2008 ೥〣ぢアふべք۾ Linux ぢアふべ׬੒ظ ୈҰظ 2006 ೥ UTS Namespace, IPC

    Namespaceʢ2.6.19ʣ りとぷ໊ɾへゐぐア໊ぇぢアふべ〉〝〠࣋〙ɺゆ゜なとؒ௨৴〟〞ぇぢアふべ಺ 〠ִ཭ 2007 ೥ macvlanʢ2.6.23ʣぼひぷゞがぜぐアのがやこがと 2008 ೥ pid Namespace, Network Namespace, vethʢ2.6.24ʣ ゆ゜なとɺぼひぷゞがぜ〣ִ཭ cpu, cpuacct, cpuset cgroupʢ2.6.24ʣ CPU 〠ର『぀゙ぬがと੍ݶ device cgroupʢ2.6.26ʣ freezer cgroupʢ2.6.28ʣ 19/39
  9. Network Namespaceʢ2.6.24/2008 ೥ʣ Network Namespace ぼひぷゞがぜؔ࿈〣゙ぬがとぇִ཭『぀ • ぼひぷゞがぜぐアのがやこがと ʢଞ〣 Namespace

    ⿾〾ݟ⿺〟。〟〿〳『ʣ • ぎへ゛と • れがぷ • ゚がふくアそ • Firewall • ʜ • ෺ཧぐアのがやこがと〷ಛఆ〣 Namespaceʢぢアふべʣ〠ॴଐ《【〾ぁ぀ • ಛఆ〣ぐアのがやこがとぇෳ਺〣 Namespaceʢぢアふべʣ〜ڞ༗〜 ぀ 23/39
  10. veth ぐアのがやこがとʢ2.6.24/2008 ೥ʣ • Virtuozzo/OpenVZ ༝དྷ • ࡞੒『぀〝ର〝〟぀ぐアのがやこがと⿿ੜ੒《 ぁ぀ɻ〒〣ର〝〟぀ぐアのがやこがとؒ〜௨৴ ぇߦ⿸ʹ

    L2 〣ぷアぼ゚ • ର〣ยํぇりとぷɺยํぇぢアふべ〣 Namespace 〠ॴଐ《【぀ʢҟ〟぀ Namespace ؒ〜〟⿶〝௨৴ෆՄʣ 24/39
  11. ぶゑʢ2ʣ Network Namespace 〝 veth ぇ࡞〿ɺveth ぐアのがやこがとぇ Namespace 〠ॴଐ《【 〛௨৴『぀

    Network Namespace ぇ࡞぀〠〤 iproute2 ෇ଐ〣 ip netns ぢろアへ⿿࢖⿺〳『 1. Network namespace ぇ࡞぀ • Namespace ಺〣ぐアのがやこがと〣֬ೝ 2. veth ぐアのがやこがとらぎぇ࡞぀ 3. veth ぐアのがやこがと〣ยׂぁぇ Namespace 〠Ҡ『 4. veth ぐアのがやこがとらぎ〣〒ぁ〓ぁ〠ぎへ゛とぇׂ〿౰〛〛 Up 『぀ 5. veth らぎಉ࢜〜௨৴〜 ぀〈〝ぇ֬ೝ『぀ 25/39
  12. 2009ʙ2012 ೥〣ぢアふべք۾ 2009 ೥ Memory, net_cls cgroupʢ2.6.29ʣ ゐゑ゙ɺぼひぷゞがぜ゙ぬがと੍ݶ 2010 ೥

    blkio cgroupʢ2.6.33ʣ ゅ゜ひぜぶみぐと〣 I/O ੍ݶ 2011 ೥ setns() てとふわぢが゚ʢ3.0ʣ Namespaceʢぢアふべʣ಺〜ゆ゜なとぇ࣮ߦ『぀ʢdocker exec / lxc execʣ 2012 ೥ perf_event cgroupʢ3.3ʣ Seccomp-based system call filtering (3.5) ɹ seccomp 〜೚ҙ〣てとふわぢが゚⿿やく゚の〜 ぀〽⿸〠〟〘〔 hugetlb cgroupʢ3.6ʣ ʢࡉ⿾⿶ػೳ௥Ճ〤ଞ〠〷⿴〿〳『ʣ 27/39
  13. 2013 ೥〣ぢアふべք ぢアふべత〠ॏཁ〟೥ • 3.8 kernel 〤ݱࡏ࢖いぁ〛⿶぀ぢアふべ〣ओཁ〟ػೳ⿿ଗ〘〔ॏཁ〟゙゙がと User namespace ඇಛݖʢrootlessʣぢアふべ〣࣮ݱʢ։ൃ։࢝〤〟え〝

    2.6.23, 2007 ೥!!ʣ setns() શ Namespace 〠ର「〛࢖༻Մೳ〠〟〘〔 • Docker ݩ೥ʢ3 ݄〠 OSS 〝「〛ެ։ʣ • Checkpoint/Restart ػೳʢ3.11ʣ ⿴぀࣌఺〣ゆ゜なと〣ঢ়ଶぇอଘɺ࠶։〜 ぀ 29/39
  14. User namespaceʢ3.8/2013 ೥ʣ • root ݖݶ〜ぢアふべぇىಈ『぀〝ɺぢアふべ಺〣 root 〤りとぷʢぢアふべ֎ʣ〣 root 〝

    ಉ」ݖݶぇ࣋〘〛⿶぀ • ぢアふべ (Namespace) ֎〝ผ〠 User namespace ಺〣 uid/gid ぇ࣋〛぀〽⿸〠〟〘 〔ʢぢアふべ֎〣 uid/gid 〝ぢアふべ಺〣 uid/gid ぇろひゃアそ『぀ʣ • User namespace Λ࢖͏ͱɺϗετͰ͸ಛݖΛ࣋ͨͳ͍ίϯςφ͕ىಈͰ͖Δ • User namespace ͸ҰൠϢʔβʔͰ࡞੒Մೳ 31/39
  15. ぶゑʢ3ʣ User Namespace ぇ࡞੒ ࠶〨 unshare ぢろアへぇ࢖⿶〳『 1. Ұൠゕがづが〜〤 User

    namespace Ҏ֎〣 namespace 〤࡞ぁ〟⿶〈〝ぇ֬ೝ 2. User namespace ぇ࡞〿てこ゚ぇ࣮ߦ 3. てこ゚〣ಈ࡞ݖݶぇ namespace ಺〝 namespace ֎⿾〾֬ೝ 4. namespace ಺〜やきぐ゚ぇ࡞੒「ɺnamespace ֎〜ॴ༗ݖぇ֬ೝ 5. User namespace ಺〜ଞ〣 Namespace ぇ࡞ぁ぀〈〝ぇ֬ೝ 6. ࡞〘〔ぢアふべ಺〜〤ぢアふべ಺〣ゆ゜なと〕々ݟ⿺぀〈〝ぇ֬ೝʢPID Namespaceʣ 32/39
  16. 2014ʙ2016 ೥〣ぢアふべք۾ 2014 ೥ Overlayfsʢ3.18ʣ ゕぺざアやきぐ゚てとふわ〣࣮૷〜ɺぶく゛ぜぷ゙ぇॏ〢߹い【〛〧〝〙〣ぶく ゛ぜぷ゙〠ݟ【぀ 2014 ೥ cgroup

    v2, ext4 〠 project quota ػೳ௥Ճʢ4.5ʣ 2016 ೥ cgroup namespaceʢ4.6ʣ ぢアふべ〉〝〠ぢアふべઐ༻〣 cgroup ぇݟ【぀ 34/39
  17. 2017ʙ2019 ೥〣ぢアふべք۾ 2017 ೥ Namespaced file capabilitiesʢ4.14ʣ User namespace ಺〜

    file capability ⿿ઃఆ〜 ぀ 2018 ೥ ඇಛݖϚ΢ϯτʢ4.18ʣ User namespace ಺〜 FUSE ろげアぷ 2018 ೥ PSIʢ4.20ʣ ゐゑ゙ɺCPUɺIO 〣ෛՙ⿿૿େ「゙ぬがと⿿ෆ଍「〛⿶぀ঢ়گぇ؍ଌ 2018 ೥ seccomp trap to userspaceʢ5.0ʣ seccomp 〣ܾఆぇゕがづがとらがと〠౉「〛ॲཧ『぀ 2019 ೥ LSM stackingʢ5.1ʣ AppArmor on SELinux 〝⿾ʜ 2019 ೥ clone3() てとふわぢが゚ʢ5.3ʣ clone() てとふわぢが゚〜なひぷ〜 ぀や゘そ⿿ऴྃ「〔〔〶 2019 ೥ pidfdsʢ5.3ʣ PID ࠶ར༻໰୊〣ղܾ 35/39
  18. ぢアふべք۾〣〈ぁ⿾〾 〳〕〳〕৭ʑ〟ػೳ⿿ఏҊ《ぁ〛⿶〳『ɻLinux じがぼ゚〠ろがで《ぁ぀〷〣〷《ぁ〟⿶〷〣 〷⿴぀〜「〼⿸ɻ ShiftFS Ubuntu 19.04 〜࢖⿺぀ʢLinux じがぼ゚〠〤〳〕ろがで《ぁ〛⿶〟⿶ʣぢア ふべぐゐがで಺〣やきぐ゚〣

    uid/gid ぇぢアふべ〣࣮ߦゕがづが〠߹い【〛มߋ 『぀ Container Object ๯಄〜ݴ〘〔ʮLinux じがぼ゚〠〤ぢアふべ〝⿶⿸ػೳ〤⿴〿〳【えʯ ぇ࣮ݱ『぀ػೳ Time namespace ぢアふべ〉〝〠೔࣌ぇม⿺〾ぁ぀ 36/39
  19. 〳〝〶 ྺ࢙ぇ〔〞〿〟⿿〾 Linux 〠࣮૷《ぁ〛⿶぀ぢアふべؔ࿈〣ػೳぇ΄Μͷগ͠঺հ「〳「〔 • Linux 〠〤ʮぢアふべʯ〝⿶⿸ػೳ〤〟。ɺ৭ʑ〟ػೳ〣૊〴߹い【〜ぢアふべ⿿࡞〾ぁ぀ • ゙ぬがと〉〝〠४උ《ぁ〔 Namespace

    ػೳ〜৭ʑ〟ִ཭ۭؒぇ࡞぀ • MountɺPIDɺNetworkɺUser Namespace 〝ؔ࿈『぀ػೳぇઆ໌ • ぢアふべ〠ؔ܎『぀ػೳ⿿〞え〞え Linux じがぼ゚〠௥Ճ《ぁɺࠓ〜〷ଟ਺〣ػೳ⿿ఏҊ 《ぁ〛⿶぀ 38/39
  20. ࢀߟ • ぐアや゘ษڧձʮ[ぢアふべ〣ྺ࢙]Docker ⿿〜 ぀〳〜ʯࢿྉ • ୈ 2 ճ • ୈ

    3 ճ • ぢアふべٕज़ೖ໳ - Ծ૝Խ〝〣ҧ⿶ぇ஌〿ɺཁૉٕज़ぇ৮〘〛ֶ〱⿸ʢby hayajo_77 《 え / ごアでぺぎ Hubʣ • LXC 〜ֶ〫ぢアふべೖ໳ ʵܰྔԾ૝Խ؀ڥぇ࣮ݱ『぀ٕज़ (gihyo.jp) • Linux ぢアふべ〣಺෦ぇ஌あ⿸ • Linux ぢアふべ࠷৽৘ใʢ2013-06-01ʣ • History of containersʢS3hh’s Blogʣ 39/39