Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Wardenで学ぶコンテナの基礎
Hiroaki UKAJI
こんな⼈向け
       コンテナって何?
コンテナ?
コンテナ?
 ユーザ空間の隔離
                ⾼密度化
   VMより軽い
              リソース分離   
          LXC
 起動が速い  
              名前空間  
コンテナ?
  ・・・?
コンテナがなぜ必要か
(Baremetal) Machine	
OS
コンテナがなぜ必要か
ある環境の上で2つのAppを開発します
(Baremetal) Machine	
OS
コンテナがなぜ必要か
(Baremetal) Machine	
OS	
App1 App2
コンテナがなぜ必要か
でもこの図はちょっとマズイ  
                 なぜならば・・・
(Baremetal) Machine	
OS	
App1 App2
コンテナがなぜ必要か
(Baremetal) Machine	
OS	
App1 App2
/
|-- :
|-- home/
| |-- usr1/
| | `-- app1/
| `-- usr2/
| `-- app2/
| :
$ rm...
コンテナがなぜ必要か
何か対策を・・・
(Baremetal) Machine	
OS
コンテナがなぜ必要か
すぐに思いつくのは・・・
              UNIX User?
(Baremetal) Machine	
OS	
usr1
App1
usr2
App2
コンテナがなぜ必要か
しかしUNIX Userでは…
(Baremetal) Machine	
OS	
usr1
App1
App2
でもこれはちょっとやりたくない
作るの時間かかるし・・・
重いし・・・
コンテナがなぜ必要か
(Baremetal) Machine	
OS/Hypervisor	
VM	 VM	
OS	 OS	
App1 App2
コンテナがなぜ必要か
(Baremetal) Machine	
OS
欲しいものは
Appを隔離する「箱」のようなもの
(Baremetal) Machine	
OS	
App1 App2
欲しいものは
 「箱」= 環境の隔離 + リソースの制限
            
(Baremetal) Machine	
OS	
App1 App2
欲しいものは
 「箱」= 環境の隔離 + リソースの制限
            
(Baremetal) Machine	
OS	
App1 App2
これがコンテナ
wardenでは?
	
	
	
    環境の隔離    リソースの制限
wardenでは?
	
	
    環境の隔離    リソースの制限
       ||        													 		||				
  		  namespace        cgroup
	
	
             ...
まずは隔離環境の作成から
	
	
    環境の隔離    リソースの制限
       ||        													  	||				
  		  namespace        cgroup
	
	
          ...
namespace
空間を隔離し名前別に管理するもの
namespace
	
namespace⼀覧
	
	
	
	
ipc, mnt, net, pid, usr, utsの6種類
(各リソースにタグ付けられたID的なもの)
$ readlink /proc/$$/ns/*↵
ipc:[4026...
namespace
	
‘unshare’コマンドで切り替えが可能
net:[4026531956]
↓ 
net:[4026532257]
$ readlink /proc/$$/ns/net↵
net:[4026531956]
$ sudo...
namespace
	
net名前空間をunshareした時は…
network環境「だけ」が切り替わります
$ ls↵
tmp/ warden/ workspace/
$ ifconfig eth0↵
eth0 Link encap:Ethe...
namespace	
(Baremetal) Machine	
OS	
unshare --net <command> された空間
||
fileはそのまま⾒えるのにeth0は⾒えない空間
eth0
namespace @ warden
namespace @ warden	
warden> create
(Baremetal) Machine	
OS	
unshare -m {$target}/setup.sh
unshare(CLONE_NEWNS)
namespace @ warden
	
>>
!
host# readlink /proc/$$/ns/*↵
ipc:[4026531839]
mnt:[4026531840]
net:[4026531956]
pid:[4026531836...
namespace @ warden	
warden> create
(Baremetal) Machine	
OS	
ipc:proc間通信オブジェクト
mnt:マウント操作
net:ネットワーク系リソース  の隔離空間
pid:プロセスID...
次に隔離環境の操作
	
																											
    環境の隔離    リソースの制限
       ||        													 		||				
  		  namespace      ...
cgroup
	
	
	
プロセスのグループを作り
⼀括した管理を⾏うもの
	
	
※cgroup = control group
cgroup
	
controlできるのは
	
	
cpuやmemoryの制限
プロセスのstart&stop等々・・・
$ lssubsys↵
cpuset
cpu
cpuacct
memory
devices
freezer
blkio
p...
cgroup
	
各サブシステムはこんな感じ
   tasks     ⇒ pid
freezer.state ⇒ 状態
$ cd /sys/fs/cgroup/freezer↵
$ tree -L 2↵
.
|-- :
|-- tasks
`...
cgroup
	
controlの方法は
   1.  グループ用ディレクトリを作成 
   2.   tasksにpidを登録        
   3.  freezer.stateで状態を制御
	
# cd /sys/fs/cgroup/...
cgroup
   1.  グループ用ディレクトリを作成 
	 $ cd /sys/fs/cgroup/freezer↵
$ tree -L 2↵
.
|-- freezer.state
|-- tasks
|-- testfs01/
| |-...
cgroup
   2.   tasksにpidを登録  
	 $ cd /sys/fs/cgroup/freezer↵
$ tree -L 2↵
.
|-- freezer.state
|-- tasks
|-- testfs01/
| |-...
cgroup
   3. freezer.stateで状態を制御
	
tasksに登録されたprocだけがFROZENに	
$ cd /sys/fs/cgroup/freezer↵
$ tree -L 2↵
.
|-- freezer.stat...
cgroup
   
	
	
<制限したいリソース>
|-- <tasks(PID)>
|-- <status>
`-- SubDirectory/
|-- <tasks(PID)>
`-- <status>①制限したい項目に
サブDIR作って...
cgroup @ warden
cgroup @ warden
   1.  グループ用ディレクトリを作成
    instance-<handle>/
    …コンテナ⽣成時に出現
	
($PWD=/sys/fs/cgroup/memory)
.
|-- memory.l...
cgroup @ warden
   2.   tasksにpidを登録
    tasks
    …defaultではdaemonのPIDのみ
     コンテナでproc起動すれば追加
($PWD=/sys/fs/cgroup/memor...
cgroup @ warden
   3. memory.limitで状態を制御
    memory.limit_in_bytes
    …tasksに登録したprocにのみ
     使⽤memoryの制限がかかる
($PWD=/sys/...
cgroup @ warden	
warden> limit_memory
(Baremetal) Machine	
OS	
mkdir ~~~/cgroup/memory/instance-$id
              !
echo [...
container
container =		環境の隔離 + リソースの制限
            
(Baremetal) Machine	
OS	
App1 App2
container @ warden
	
	
    環境の隔離    リソースの制限
       ||        													 		||				
  		  namespace        cgroup	
	
     ...
まとめ
WardenコンテナはOS上に隔離環境を作る
  環境を隔離するのは  namespace
隔離環境の操作は   cgroup
Upcoming SlideShare
Loading in …5
×

Wardenで学ぶコンテナの基礎

1,181 views

Published on

第25回PaaS勉強会

「Wardenで学ぶコンテナの基礎」発表資料

  • Be the first to comment

Wardenで学ぶコンテナの基礎

  1. 1. Wardenで学ぶコンテナの基礎 Hiroaki UKAJI
  2. 2. こんな⼈向け        コンテナって何?
  3. 3. コンテナ?
  4. 4. コンテナ?  ユーザ空間の隔離                 ⾼密度化    VMより軽い               リソース分離              LXC  起動が速い                 名前空間  
  5. 5. コンテナ?   ・・・?
  6. 6. コンテナがなぜ必要か (Baremetal) Machine OS
  7. 7. コンテナがなぜ必要か ある環境の上で2つのAppを開発します (Baremetal) Machine OS
  8. 8. コンテナがなぜ必要か (Baremetal) Machine OS App1 App2
  9. 9. コンテナがなぜ必要か でもこの図はちょっとマズイ                    なぜならば・・・ (Baremetal) Machine OS App1 App2
  10. 10. コンテナがなぜ必要か (Baremetal) Machine OS App1 App2 / |-- : |-- home/ | |-- usr1/ | | `-- app1/ | `-- usr2/ | `-- app2/ | : $ rm -rf /home/usr2/app2/↵ ⼀緒のマシン上での開発は         ちょっと⼼配
  11. 11. コンテナがなぜ必要か 何か対策を・・・ (Baremetal) Machine OS
  12. 12. コンテナがなぜ必要か すぐに思いつくのは・・・               UNIX User? (Baremetal) Machine OS usr1 App1 usr2 App2
  13. 13. コンテナがなぜ必要か しかしUNIX Userでは… (Baremetal) Machine OS usr1 App1 App2
  14. 14. でもこれはちょっとやりたくない 作るの時間かかるし・・・ 重いし・・・ コンテナがなぜ必要か (Baremetal) Machine OS/Hypervisor VM VM OS OS App1 App2
  15. 15. コンテナがなぜ必要か (Baremetal) Machine OS
  16. 16. 欲しいものは Appを隔離する「箱」のようなもの (Baremetal) Machine OS App1 App2
  17. 17. 欲しいものは  「箱」= 環境の隔離 + リソースの制限              (Baremetal) Machine OS App1 App2
  18. 18. 欲しいものは  「箱」= 環境の隔離 + リソースの制限              (Baremetal) Machine OS App1 App2 これがコンテナ
  19. 19. wardenでは?     環境の隔離    リソースの制限
  20. 20. wardenでは?     環境の隔離    リソースの制限        ||          ||     namespace        cgroup              ※他のコンテナでも使われてます
  21. 21. まずは隔離環境の作成から     環境の隔離    リソースの制限        ||          ||     namespace        cgroup              
  22. 22. namespace 空間を隔離し名前別に管理するもの
  23. 23. namespace namespace⼀覧 ipc, mnt, net, pid, usr, utsの6種類 (各リソースにタグ付けられたID的なもの) $ readlink /proc/$$/ns/*↵ ipc:[4026531839] mnt:[4026531840] net:[4026531956] pid:[4026531836] user:[4026531837] uts:[4026531838] OS起動時にすでにdefault名前空間が決定
  24. 24. namespace ‘unshare’コマンドで切り替えが可能 net:[4026531956] ↓  net:[4026532257] $ readlink /proc/$$/ns/net↵ net:[4026531956] $ sudo unshare --net /bin/bash↵ $ readlink /proc/$$/ns/net↵ net:[4026532257] unshare --net
  25. 25. namespace net名前空間をunshareした時は… network環境「だけ」が切り替わります $ ls↵ tmp/ warden/ workspace/ $ ifconfig eth0↵ eth0 Link encap:Ethernet HWaddr 08:00:27:95:c2:a1 inet addr:10.0.2.15 Bcast:10.0.2.255 : : $ sudo unshare --net /bin/bash↵ $ ls↵ tmp/ warden/ workspace/ $ ifconfig eth0↵ eth0: error fetching interface information: Device not found
  26. 26. namespace (Baremetal) Machine OS unshare --net <command> された空間 || fileはそのまま⾒えるのにeth0は⾒えない空間 eth0
  27. 27. namespace @ warden
  28. 28. namespace @ warden warden> create (Baremetal) Machine OS unshare -m {$target}/setup.sh unshare(CLONE_NEWNS)
  29. 29. namespace @ warden >> ! host# readlink /proc/$$/ns/*↵ ipc:[4026531839] mnt:[4026531840] net:[4026531956] pid:[4026531836] user:[4026531837] uts:[4026531838] host# bin/wsh /bin/bash↵ container# readlink /proc/$$/ns/*↵ ipc:[4026532199] mnt:[4026532197] net:[4026532202] pid:[4026532200] user:[4026531837] uts:[4026532198] ※ホストマシン側 ※コンテナ側
  30. 30. namespace @ warden warden> create (Baremetal) Machine OS ipc:proc間通信オブジェクト mnt:マウント操作 net:ネットワーク系リソース  の隔離空間 pid:プロセスID uts:ホスト・ドメイン名
  31. 31. 次に隔離環境の操作     環境の隔離    リソースの制限        ||          ||     namespace        cgroup              
  32. 32. cgroup プロセスのグループを作り ⼀括した管理を⾏うもの ※cgroup = control group
  33. 33. cgroup controlできるのは cpuやmemoryの制限 プロセスのstart&stop等々・・・ $ lssubsys↵ cpuset cpu cpuacct memory devices freezer blkio perf_event hugetlb
  34. 34. cgroup 各サブシステムはこんな感じ    tasks     ⇒ pid freezer.state ⇒ 状態 $ cd /sys/fs/cgroup/freezer↵ $ tree -L 2↵ . |-- : |-- tasks `-- user/ |-- 1000.user/ |-- freezer.state |-- : `-- tasks 1 2 : 23788 THAWED
  35. 35. cgroup controlの方法は    1.  グループ用ディレクトリを作成     2.   tasksにpidを登録            3.  freezer.stateで状態を制御 # cd /sys/fs/cgroup/freezer↵ # mkdir testfs↵ # echo 18327 > testfs/tasks↵ # echo 18336 >> testfs/tasks↵ # echo FROZEN > testfs/freezer.state↵ FROZEN これで pid=18327 pid=18336 のprocが停止
  36. 36. cgroup    1.  グループ用ディレクトリを作成  $ cd /sys/fs/cgroup/freezer↵ $ tree -L 2↵ . |-- freezer.state |-- tasks |-- testfs01/ | |-- freezer.state | `-- tasks `-- testfs02/ |-- freezer.state `-- tasks 親DIRと同様のfileが自動生成 (default時)全PIDは親DIRに登録
  37. 37. cgroup    2.   tasksにpidを登録   $ cd /sys/fs/cgroup/freezer↵ $ tree -L 2↵ . |-- freezer.state |-- tasks |-- testfs01/ | |-- freezer.state | `-- tasks `-- testfs02/ |-- freezer.state `-- tasks $ echo 3861 >> testfs01/tasks 等でPIDを書き込み 下で書き込まれたPIDは自動的に defaultの場所から消失
  38. 38. cgroup    3. freezer.stateで状態を制御 tasksに登録されたprocだけがFROZENに $ cd /sys/fs/cgroup/freezer↵ $ tree -L 2↵ . |-- freezer.state |-- tasks |-- testfs01/ | |-- freezer.state | `-- tasks `-- testfs02/ |-- freezer.state `-- tasks $ cat tasks 3861 $ echo FROZEN > freezer.state FROZEN
  39. 39. cgroup     <制限したいリソース> |-- <tasks(PID)> |-- <status> `-- SubDirectory/ |-- <tasks(PID)> `-- <status>①制限したい項目に サブDIR作っておく ②制限かけたいprocの   PIDをtasksに書き込む ③statusで一気に制御
  40. 40. cgroup @ warden
  41. 41. cgroup @ warden    1.  グループ用ディレクトリを作成     instance-<handle>/     …コンテナ⽣成時に出現 ($PWD=/sys/fs/cgroup/memory) . |-- memory.limit_in_bytes |-- tasks `-- instance-18fgfj7va3n/ |-- memory.limit_in_bytes `-- tasks
  42. 42. cgroup @ warden    2.   tasksにpidを登録     tasks     …defaultではdaemonのPIDのみ      コンテナでproc起動すれば追加 ($PWD=/sys/fs/cgroup/memory) . |-- memory.limit_in_bytes |-- tasks `-- instance-18fgfj7va3n/ |-- memory.limit_in_bytes `-- tasks
  43. 43. cgroup @ warden    3. memory.limitで状態を制御     memory.limit_in_bytes     …tasksに登録したprocにのみ      使⽤memoryの制限がかかる ($PWD=/sys/fs/cgroup/memory) . |-- memory.limit_in_bytes |-- tasks `-- instance-18fgfj7va3n/ |-- memory.limit_in_bytes `-- tasks
  44. 44. cgroup @ warden warden> limit_memory (Baremetal) Machine OS mkdir ~~~/cgroup/memory/instance-$id               ! echo [コンテナ内のPID] > tasks               ! (←本当はここまで前準備) echo [制限値] > memory.limit_in_bytes
  45. 45. container container = 環境の隔離 + リソースの制限              (Baremetal) Machine OS App1 App2
  46. 46. container @ warden     環境の隔離    リソースの制限        ||          ||     namespace        cgroup         
  47. 47. まとめ WardenコンテナはOS上に隔離環境を作る   環境を隔離するのは  namespace 隔離環境の操作は   cgroup

×