Share
Embed
Linux コンテナの基礎 / KOF 2016
"KOF 2016" の発表資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。
tenforward
November 11, 2016
Transcript
60 slides
-
ࣗݾհ Ճ౻ହจ • http://www.ten-forward.ws/ • @ten forward • http://gplus.to/tenforward •
https://github.com/tenforward • http://d.hatena.ne.jp/defiant/ (ٕज़ϒϩά) 2 -
ࣗݾհ • LXC/LXD ͷ։ൃʹগ͠ࢀՃ • man page ͷຊޠ༁ • ެࣜϖʔδ
(linuxcontainers.org) ༁ • όάϑΟοΫεͳͲগ͚ͩ͠ίʔυʹߩݙ • LXD ຊޠϝοηʔδ 5 -
ίϯςφͱ • Χʔωϧ͔ΒݟΔͱී௨ʹϓϩηε͕ىಈ͢Δ͚ͩ • ىಈ͢ΔࡍʹִΛࢦࣔ͢Δ • ΧʔωϧͷػೳͰ (ෳͷ) ಠཱۭͨؒ͠Λ࡞Γग़͠ɼϦιʔ εΛׂɾ͢Δ
• ϓϩηεΛάϧʔϓԽͯ͠ଞͱϦιʔεۭؒΛִ • άϧʔϓԽͨ͠ϓϩηεʹର͢ΔϦιʔε੍ݶ • ԾԽͱ͍͏ΑΓʮִԽʯͱݴͬͨ΄͏͕Θ͔Γ͍͢ ͔ • ԾతͳίϯϐϡʔλɾγεςϜΛ࠶ݱ͢ΔԾϚγϯʹର ͯ͠ɺԾతͳ OS ڥΛఏڙ͢Δ • ˠ OS ϨϕϧͷԾԽ 12 -
ίϯςφͷϝϦοτ • ߴີԽ͕Մೳ • ىಈ͍ͯ͠Δ OS (Χʔωϧ) Ұͭ • Φʔόʔϔου͕খ͍͞
• ϋʔυΣΞͷԾԽ͕ෆཁ • ىಈ͕ૣ͍ • ԾϚγϯͷىಈͰͳ͘ɼϗετ OS ͔ΒݟͨΒ୯ʹϓϩ ηε͕ىಈ͍ͯ͠Δ͚ͩͳͷͰɼී௨ͷϓϩάϥϜ͕ىಈ͢ Δͷͱ΄ͱΜͲมΘΒͳ͍ • ඞͣ͠γεςϜΛಈ͔͢ඞཁͳ͍ (ΞϓϦέʔγϣϯί ϯςφ) • ྫ͑ίϯςφͰ httpd ͷΈ͕ಈ͍͍ͯΔ • ίϯςφʹϝϞϦΛݻఆతʹׂΓͯΔඞཁ͕ͳ͍ 13 -
ίϯςφͷσϝϦοτ • ҟͳΔ OS ͷγεςϜ / ϓϩάϥϜಈ͔ͤͳ͍ • ୯ʹϗετ OS
্Ͱϓϩηε͕ىಈ͢Δ͚ͩͳͷͰͨΓલ • ΧʔωϧʹؔΘΔૢ࡞Ͱ͖ͳ͍ • ىಈ͍ͯ͠ΔΧʔωϧมΘΒͳ͍ͷͰ • ίϯςφຖʹϩʔυ͢ΔϞδϡʔϧΛม͑ΔͳͲ • Χʔωϧͷ࣮ෳࡶʹͳΔ • શͯΧʔωϧͷػೳͱ࣮ͯ͠͞Ε͍ͯΔͷͰ 14 -
ىಈͤ͞Δϓϩηε͔ΒΈͨίϯςφ • γεςϜίϯςφ • init Λىಈ͢Δɻී௨ʹ OS ͕ىಈ͢Δͷͱಉ༷ • ΞϓϦέʔγϣϯίϯςφ
• ୯ҰͷϓϩηεͷΈىಈɻඞཁͳΞϓϦέʔγϣϯͷΈִ ͞ΕͨڥͰ࣮ߦɻ 15 -
Linux ͰίϯςφΛ࣮ݱ͢ΔͨΊͷػೳ Linux Χʔωϧʹؚ·ΕΔ৭ʑͳػೳΛΈ߹Θͤͯίϯςφ ڥΛ࡞͢ΔɻͦΕͧΕͷػೳίϯςφઐ༻ͷػೳͱ͍͏Θ͚ Ͱͳ͍ɻ • ϓϩηεΛάϧʔϓԽͯ͠ଞͷάϧʔϓͱִ • OS
Ϧιʔεͷִ • ˠ Namespace (໊લۭؒ) • άϧʔϓԽͨ͠ϓϩηεʹର͢ΔϦιʔε੍ݶ • ϗετͷཧϦιʔεʹର͢Δ੍ݶ • ˠ cgroup (control group) 19 -
Linux ͰίϯςφΛ࣮ݱ͢ΔͨΊͷػೳ • ͦͷଞ • ωοτϫʔΫ (veth, macvlan ͳͲ) •
έʔύϏϦςΟ • chroot (pivot root) • bind mount • Checkpoint/Restore (CRIU) • ͳͲͳͲ 20 -
Linux ͷίϯςφ࣮ྫ • Docker ΞϓϦέʔγϣϯίϯςφͷ࣮ߦʹಛԽɻίϯςφؔ࿈ͷॲཧ runC ϓ ϩδΣΫτͷ libcontainer Λ༻ɻ͍·ʮDockerʯͱ͍͏ݴ༿͕ࢦ
͢ͷίϯςφͰ͋Γ·ͤΜɻΞϓϦέʔγϣϯΛ؆୯ʹ։ൃͨ͠Γ ߏஙͨ͠Γ͢ΔͨΊͷϓϥοτϑΥʔϜɺΠϯϑϥɻ • runC (libcontainer) Docker ʹΑΔ Open Container Project ४ڌͷ࣮ • LXC/LXD Ubuntu Λத৺ʹ։ൃɻओʹγεςϜίϯςφΛ࣮ߦ͢Δ͜ͱΛલఏʹ࡞ ΒΕ͍ͯΔ͕ɺΞϓϦέʔγϣϯίϯςφͷ࣮ߦՄೳɻඇಛݖίϯςφ ͕࣮ߦͰ͖Δɻ 21 -
Linux ͷίϯςφ࣮ྫ • OpenVZ Linux ͷίϯςφ࣮ͱͯ͠ݹ͔͘Β͋Δ࣮ͷͻͱͭɻ2000 ͝Ζ ͔ΒɻΧʔωϧʹύονΛద༻͢ΔɻΧʔωϧʹ࣮͞Ε͍ͯΔίϯςφ ؔ࿈ػೳ OpenVZ
༝དྷͷػೳ͕ଟ͋ΔɻOpenVZ Λϕʔεʹͨ͠ ༻൛ Virtuozzo ͕ଘࡏ͢Δɻ • rkt CoreOS ͕ࣾ։ൃ͢ΔΞϓϦέʔγϣϯίϯςφͷϥϯλΠϜɻ • systemd ͝ଘ Linux ͚ͷ࠷ۙओྲྀͱͳͬͨ init ࣮ͷͻͱͭɻίϯςφΛѻ͏ ίϚϯυΈแ͍ͯ͠Δ 22 -
Linux ͷίϯςφ࣮ྫ • MINCS γΣϧεΫϦϓτͰॻ͔Εͨίϯςφ࣮ • bocker “Docker implemented in
around 100 lines of bash” • haconiwa ίϯςφ࣮ɾ࡞ͷͨΊͷ (m)Ruby DSL • aqr perl Ͱॻ͔Εͨίϯςφ࣮ • Awesome Container ͦͷଞ৭ʑ·ͱ·ͬͯ·͢ 23 -
Namespace(໊લۭؒ) • ִ͍ͨ͠ OS Ϧιʔε͝ͱʹ Namespace ͕४උ͞ΕΔ • Ұ෦ͷ Namespace
͚ͩ༻ִͯ͠ڥΛ࡞Δ͜ͱ͕Ͱ ͖Δ 26 -
Mount Namespace (2.4.19ʙ) • ϓϩηε͔Βݟ͍͑ͯΔϚϯτͷू߹ɼૢ࡞Λ͢Δɽ Namespace ͷ mount, umount ͕ଞͷ
Namespace ʹӨ ڹΛ༩͑ͳ͍Α͏ʹͰ͖Δ (༩͑ΔΑ͏ʹͰ͖Δ) ˠ private/shared/slave • ࢀߟ: • Ϛϯτ໊લۭؒΛద༻͢Δ (IBM developerWorks) • Mount Namespace and shared subtrees (lwn.net) • Mount namespaces, mount propagation, and unbindable mounts (lwn.net) • Χʔωϧෟଐจॻ (Documentation/filesystems/sharedsubtree.txt) • σϑΥϧτ private ͕ͩɺsystemd /Λ shared ͰϚϯ τ͢Δ 27 -
UTS Namespace (2.6.19ʙ) • ϗετ໊ͳͲɼuname(2) ͕ฦ͢ͷू߹Λɽ setdomainname(2), sethostname(2) Ͱ Namespace
ͷ ͷΈมߋͰ͖Δ user$ hostname enterprise --- (͜͜·Ͱϗετͷ Namespace) --- user$ sudo unshare --uts (৽͍͠ Namespace ࡞) root# hostname enterprise (ॳظϗετͱಉ͡) root# hostname utsns (ϗετ໊มߋ) root# hostname utsns root# exit logout --- (͔͜͜Βϗετͷ Namespace) --- user$ hostname enterprise 28 -
PID Namespace (2.6.24ʙ) • PID ۭؒͷɽ৽͍͠ PID Namespace Ͱ PID
1 ͔Β ࢝·Δ PID ׂ͕ΓͯΒΕΔɽ͔Βࢠͷ PID Namespace ݟ͑Δ (ͷۭؒͷ PID Λ࣋ͭ) ͕ɼࢠ͔Βݟ͑ͳ͍ 29 -
IPC Namespace (2.6.19ʙ) • SysV IPC ΦϒδΣΫτɼPOSIX ϝοηʔδΩϡʔͷִ
# ipcs -q (ϗετͷ Namespace ্ͰϝοηʔδΩϡʔͷ֬ೝ) ------ Message Queues -------- key msqid owner perms used-bytes messages 0x4b79e805 32768 root 644 0 0 # unshare --ipc (৽ͨʹ IPC Namespace ࡞) # ipcs -q (৽ͨʹ࡞ͬͨ Namespace ͰΩϡʔΛ֬ೝ͢Δͱଘࡏ͠ͳ͍) ------ Message Queues -------- key msqid owner perms used-bytes messages 30 -
User Namespace (3.8ʙ) • ಠཱͨ͠ UID/GID ۭؒͱ֎෦ۭؒͷϚοϐϯά (ྫ͑ɼ ִۭؒͰ uid/gid
0/0ɼ֎෦Ͱ 1000/1000 ͱ͔Մೳ ʹͳΔ) • User Namespace ҰൠϢʔβͰ࡞Ͱ͖ɺNamespace ͷಛݖϢʔβଞͷ Namespace Λ࡞Ͱ͖Δ (User Namespace Ҏ֎ͷ Namespace ಛݖ͕ඞཁ) 31 -
Network Namespace (2.6.26ʙ) • ωοτϫʔΫϦιʔεͷִ • ωοτϫʔΫσόΠε • ϧʔςΟϯάςʔϒϧ •
ιέοτ • ϑΟϧλϦϯά • ΞυϨε 32 -
cgroup Namespace (4.6ʙ) • cgroup ͷִ • /proc/$PID/cgroup ϑΝΠϧͷ cgroup
ύε • namespace ͰϚϯτͨ͠ cgroupfs πϦʔ • (͜ͷ Namespace Ͱ clone(2) ʹ༩͑Δϑϥά (32bit ) Λ͍͖Γ·ͨ͠ :-) • Ubuntu 16.04 ͷ 4.4 ΧʔωϧʹόοΫϙʔτࡁ 33 -
Namespace ৄࡉ Namespace ͷΧʔωϧ෦ͷ࣮ʹ͍ͭͯʮୈ 8 ճ ίϯςφ ܕԾԽͷใަձˏ౦ژʯͰͷ Masami Ichikawa
͞Μͷ Linux Namespaces ͕ৄ͍͠Ͱ͢ (ಈը) 34 -
Namespace ͷૢ࡞ (γεςϜίʔϧ) • clone(2) Ͱ৽͍͠ϓϩηε Λੜ • unshare(2) Ͱ৽͍͠ϓϩηεΛੜͤͣʹ࣮ߦίϯςΩε
τΛ੍ޚ͢Δ • setns(2) ͰϓϩηεΛطଘ ͷ Namespace ʹؔ࿈͚Δ 35 -
cgroup ͱ ϓϩηεΛάϧʔϓԽ͠ɺάϧʔϓʹରͯ͠Ϧιʔε੍ݶΛߦ ͏ɻίϯςφઐ༻ͷΈͰͳ͍ɻ • cgroup ͷಛ • ػೳ͝ͱʹαϒγεςϜʹ͔ΕΔ •
cgroupfs ΛϚϯτͯ͠σΟϨΫτϦͰάϧʔϓΛද͢ • ϓϩηεΛάϧʔϓͷ tasks ϑΝΠϧʹՃ͢Δͱؔ࿈͢ ΔλεΫ͕εϨου୯ҐͰάϧʔϓʹՃ͞ΕΔ • ෳ֊ߏɻվߏ͝ͱʹҟͳΔπϦʔΛ࡞Ͱ͖Δɻ ͨͩ͠ɺҰͭͷαϒγεςϜ͕ॴଐͰ͖ΔπϦʔҰͭ • πϦʔͷͲͷϨϕϧͷάϧʔϓʹλεΫ͕ॴଐͰ͖Δ 38 -
cgroup ͷαϒγεςϜ • cpu: 2.6.24 • CFS(Completely Fair Scheduler) bandwidth
controlɽ୯Ґ ࣌ؒͷάϧʔϓͷλεΫ͕࣮ߦͰ͖Δ߹ܭ࣌ؒΛ੍ݶ͢ Δ (3.2 Ͱ࣮) • ૬ରɽάϧʔϓؒͷ CPU ࣌ؒͷׂͷׂ߹Λࢦఆ͢Δɽ ྫ͑ GroupA=100,GroupB=50 ͱ͢Δͱ A:B=2:1 • cpuacct: 2.6.24 • άϧʔϓͷ CPU ϦιʔεͷϨϙʔτ (CPU ࣌ؒ) • cpuset: 2.6.24 • ׂΓͯΔ CPU, ϝϞϦϊʔυͷׂ 40 -
cgroup ͷαϒγεςϜ • device: 2.6.26 • σόΠεͷΞΫηεڐՄɼ੍ݶͷࢦఆ • freezer: 2.6.28
• άϧʔϓͷϓϩηεΛશͯҰ࣌ఀࢭ͢Δ • memory: 2.6.29 • ϝϞϦϦιʔεͷ੍ݶ (ϢʔβϝϞϦɼΧʔωϧϝϞϦ) • blkio (Block IO): • I/O weight controller(2.6.33 Ҏ߱) άϧʔϓͷ༏ઌΛࢦ ఆ͢Δ • I/O throttling(2.6.37 Ҏ߱) άϧʔϓͷϓϩηεͷσόΠ εʹର͢Δૢ࡞ͷ߹ܭͷࢦఆ • (ࢀߟ)Linux2.6.37 ͷ৽ػೳ “I/O throttling” 41 -
cgroup ͷαϒγεςϜ • hugetlb: 3.6 • cgroup ͔Βͷ hugetlb ͷ༻
• perf event: 2.6.39 • άϧʔϓ୯ҐͰ perf πʔϧͰϞχλϦϯά (ύϑΥʔϚϯε ղੳ) • net cls: 2.6.29 • ύέοτʹࣝผࢠΛ͚ͭɼτϥϑΟοΫίϯτϩʔϧ (tc) ͱ netfilter(3.14 Ҏ߱) ͰίϯτϩʔϧՄೳʹ • Linux 3.14 Ͱ net cls cgroup ʹՃ͞Εͨ netfilter ରԠ • net prio: 3.3 • άϧʔϓؒͰͷωοτϫʔΫͷ༏ઌΛΠϯλʔϑΣʔεຖ ʹࢦఆ͢Δ • Linux 3.3 ͷ৽ػೳ Network priority cgroup • Linux 3.3 ͷ৽ػೳ Network priority cgroup (2) 42 -
cgroup ͷαϒγεςϜ • pids: 4.3 • fork() clone() ͰىಈͰ͖ΔϓϩηεΛ੍ݶ͢Δ
• LXC ͰֶͿίϯςφೖ ୈ 30 ճ Linux Χʔωϧͷίϯς φػೳ [8] ʔ cgroup ͷ pids αϒγεςϜ 43 -
cgroup ͷ͍ํ cgroup ίϯςφͱؔͳ͘༻Մೳ # mount -t tmpfs
cgroup_root /sys/fs/cgroup # mkdir /sys/fs/cgroup/memory # mount -t cgroup -o memory cgroup /sys/fs/cgroup/memory (ϝϞϦαϒ γεςϜͷϚϯτ) # mkdir /sys/fs/cgroup/memory/test01 ("test01" ͱ͍͏άϧʔϓͷ࡞) # echo $$ > /sys/fs/cgroup/memory/test01/tasks (ϓϩηεΛάϧʔϓʹొ ) # cat /sys/fs/cgroup/memory/test01/tasks (άϧʔϓͷϓϩηεͷ֬ೝ) 2824 2837 # echo 30M > /sys/fs/cgroup/memory/test01/memory.limit_in_bytes (άϧʔϓʹରͯ͠ϝϞϦ্ݶ 30M ͱ͍͏੍ݶΛઃఆ) # cat /sys/fs/cgroup/memory/test01/memory.limit_in_bytes (੍ݶͷ֬ ೝ) 31457280 # cat /sys/fs/cgroup/memory/test01/memory.usage_in_bytes (ݱࡏͷ༻ ྔͷ֬ೝ) 565248 44 -
cgroup v2 • 4.5 ΧʔωϧͰ stable ʹͳͬͨ (ͦΕ·Ͱ։ൃ༻Ͱ࣮ ͞Ε͍ͯͨ) •
cgroup v1 ͕͋Δ • ෳࡶ͗͢ • ੍ݶ͕͋ΔͷͰෳࡶͳ͜ͱ͕Ͱ͖࣮ͯࡍ͑ͳ͍ɾΘ ͳ͍ • αϒγεςϜಉ࢜ͷ࿈ܞ͕औΕͳ͍ • ·ͩҰ෦ͷαϒγεςϜͷΈ (memory,io,pids) • Ұ෦ v2 Λͬͯɺଞ v1 Λ͏͜ͱͰ͖Δ • Χʔωϧෟଐจॻ (Documentation/cgroup-v2.txt) 45 -
σϞ • Namespace σϞ (unshare ίϚϯυ) • User Namespace •
Network Namespace • PID Namespace • UTS Namespace • γεςϜίϯςφ • LXD • ΞϓϦέʔγϣϯίϯςφ • Docker 50 -
σϞ ʙ unshare ίϚϯυʹΑΔ Namespace ମݧ • unshare ίϚϯυɿutil-linux ʹؚ·ΕΔίϚϯυ
• ؆қతʹίϯςφڥΛ࡞Ͱ͖Δ σϞ 1 # unshare --mount --pid --net --uts --fork --mount-proc -- /bin/bash σϞ 2 # unshare --mount --pid --net --uts --fork --mount-proc --mount-proc \ --map-root-user -- /bin/bash 51 -
·ͱΊ • ίϯςφͷ֓ཁ • Linux ʹ͓͚ΔίϯςφͷΈ • ίϯςφΧʔωϧʹ࣮͞Ε͍ͯΔ৭ʑͳػೳͷΈ߹Θ ͤͰ࣮ݱ͞Ε͍ͯΔ •
Namespace • OS Ϧιʔεͷִ • cgroup • ϗετͷཧϦιʔεͷ੍ݶ • σϞ 56 -
ίϯςφܕԾԽͷใަձ • https://sites.google.com/site/containerstudy/ • http://ct-study.connpass.com/ • ίϯςφٕज़ʹؔ࿈͢ΔΛѻ͏ • ίϯςφʹؔ࿈͢ΔΧʔωϧͷ࣮ʹ͍ͭͯ •
֤छπʔϧΩοτͷհɼ࣮ʹ͍ͭͯ • ίϯςφٕज़ΛͬͨπʔϧιϑτΣΞͷհ࣮ʹ ͍ͭͯ • ίϯςφٕज़ͷ׆༻ɾӡ༻ࣄྫ • ͦͷଞʮίϯςφʯͱ͍͏Ωʔϫʔυ͕গ͠Ͱೖ͍ͬͯΔ ٕज़ʹ͍ͭͯ • ͜Ε·Ͱେࡕͱ౦ژͰަޓʹ 8 ճ࣮ࢪɻ࣍ճԬͷ༧ఆɻ 58 -
ڠྗऀืू • ҎԼͷ༁Λߦ͍ͬͯ·͢ɻ͕࣌ؒ͋Δͱ͖͚ͩͰྑ͍ͷ ͰϨϏϡʔɺमਖ਼ɺվྑΛͯͩ͘͠͞Δํܴ͠·͢ɻ • LXC ϚχϡΞϧ (man pages) •
linuxcontainers.org ίϯςϯπ • LXD ຊޠϝοηʔδ 59