Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コンテナの実現とその実装
Search
0n1shi
March 27, 2019
0
140
コンテナの実現とその実装
0n1shi
March 27, 2019
Tweet
Share
More Decks by 0n1shi
See All by 0n1shi
コンテナエンジンの作り方 ~ さくらの夕べ ヤンジェネバトル ~
0n1shi
4
1.7k
パーティションとファイルシステムと
0n1shi
3
790
カーネルから見る OCIランタイム
0n1shi
0
1k
Featured
See All Featured
How GitHub (no longer) Works
holman
310
140k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
The Language of Interfaces
destraynor
154
24k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Thoughts on Productivity
jonyablonski
67
4.3k
Designing the Hi-DPI Web
ddemaree
280
34k
Why Our Code Smells
bkeepers
PRO
334
57k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Adopting Sorbet at Scale
ufuk
73
9.1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Transcript
コンテナの 実現とその実装 ECCCompなんでも発表会 03/27
自己紹介 大西 和貴 (@_k_onishi_) https://k-onishi.github.io/ SAKURA Internet Inc. アプリケーショングループ レンタルサーバーチーム
Typescript / Go / PHP / ... Linux / Kernel / CPU / Container / Virtualization / Pwn / C / Assembly / Python Linux Kernel 勉強会
• コンテナと仮想化の違い • コンテナの概要 • コンテナの実現 • コンテナの実装 • ハンズオン(可能な方は)
• まとめ 目次
コンテナと仮想マシンの違い
コンテナと仮想マシンの違い
コンテナと仮想マシンの違い • ソフトウェアで作成したハードウェアエミュレータ。 • 各VMが完全に分離されている。 • 物理マシンの上にOS、その上に仮想化したハードウェア、そしてその上にVMの OSが動作しているのでオーバーヘッドが大きい。
コンテナと仮想マシンの違い • ただのプロセス。 • リソース(CPU, メモリ)やファイルシステムの分離を行う。 • プロセスなので仮想マシンよりもはるかにオーバーヘッドが小さい。 • カーネルに依存するため、カーネルがクラッシュした際などの影響は大きい。
コンテナとはLinux環境で動作するプロセスのことをいう。 通常のプロセスと異なる点は名前空間や ルートファイルシステムがホストから 隔離されているところや、リソース制限が 可能であるということである。 コンテナの概要
コンテナはLinuxカーネルが保持している機能を用いて実現されている。 • namespace PIDやUIDなどをホストとは別空間で管理 • cgroups CPUやメモリなどのリソース制御 • chroot(pivot_root) ルートファイルシステムを切り替え
• Linux capabilities 権限を管理する コンテナの概要
名前空間とはPIDやホスト名を管理する単位のことで、新たに名前空間を作成し、その 空間にプロセスを移動させることでホスト側のプロセスやホスト名を当該プロセスから隠 蔽し、PIDやホスト名などを隔離対象プロセスに再割り当てすることができる。 名前空間にはいくつかの種類が存在し、 どの名前空間(複数組み合わせることが 可能)を作成するかで隔離する対象を 決定する。 コンテナの実現(名前空間:Namespace)
• NS(mount) マウントやアンマウント操作 • UTS ホスト名やドメイン名 • IPC POSIXメッセージキューやSystem Vメッセージキュー、セマフォ、共有メモリセグメ
ント コンテナの実現(名前空間:Namespace)
• NET IPv4及びIPv6スタック、ルーティングテーブル、ファイアウォール、/proc/net、 /sys/class/net、ソケット • PID プロセスに割り振るPIDのマッピング • CGROUP /proc/self/cgroup
• USER UID、GID、Capabiliies コンテナの実現(名前空間:Namespace)
cgroups(control groups)とはプロセスグループのリソース(CPU、メモリ、ディスクI/Oな ど)の利用を制限するLinuxカーネルの機能である。 コンテナの実現(cgroups)
cgroupでは以下の項目(コントローラ)に制限を設けることが可能である。 • cpu: CPUへのアクセス • cpuacct: CPUについての自動レポートを生成 • cpuset: マルチコアCPUのコア単位およびメモリノードを割り当て
• memory: メモリに対する制限設定と自動レポートの生成 • blkio: ブロックデバイスの入出力アクセス • devices: デバイスへのアクセス • net_cls: ネットワークパケットへのタグ付け • net_prio: ネットワークトラフィックの優先度を動的に設定 • freezer: タスクを一時停止または再開 コンテナの実現(cgroups)
コンテナの実現(cgroups) # cgroupの作成 $ cgcreate -g blkio,memory,cpu,pids:test # 指定のプロセスをcgroupに参加させる。 $
echo $$ 2006 $ cgclassify -g blkio,memory,cpu,pids:test 2006 # 1秒間に0.5秒CPUリソースに対するアクセスを許可する $ cgset -r cpu.cfs_period_us=1000000 test $ cgset -r cpu.cfs_quota_us=500000 test # # cgroupを削除する。 $ cgdelete -g blkio,memory,cpu,pids:test
現在のプロセスとその子プロセス群に対してルートディレクトリを変更する。ルートディレ クトリを別のディレクトリに変更されたプロセスは、その範囲外のファイルにはアクセスで きなくなる。 コンテナの実現(chroot)
Linuxには特権ユーザと非特権ユーザの二種類が存在し、特権ユーザは権限チェックを 全てバイパスする。 この特権ユーザに付与されている権限をグループ化し個々に有効無効を設定できるよう にしたモノのがLinux Capabilitiesである。 コンテナの実現(Linux Capabilities)
• CAP_SYS_BOOT reboot(2) と kexec_load(2) を呼び出す • CAP_SYS_CHROOT chroot(2). を呼び出す
• CAP_SYS_MODULE カーネルモジュールのロード、アンロードを行う (init_module(2) と delete_module(2) を参照のこと) コンテナの実現(Linux Capabilities)
• CAP_SYS_NICE 任意のプロセスの nice 値の変更を行う • CAP_SYS_PTRACE ptrace(2) を使って任意のプロセスをトレースする •
CAP_SYS_TIME システムクロックを変更する (settimeofday(2), stime(2), adjtimex(2)) コンテナの実現(Linux Capabilities)
リポジトリは以下。 https://github.com/k-onishi/runb コンテナの(最小)実装
ハンズオン # 新たなルートディレクトリを作成。 $ mkdir my_container; cd $_ # ライブラリとユーティリティの用意
$ sudo cp -r /bin ./ $ sudo cp -r /lib ./ $ sudo cp -r /lib64 ./ # 名前空間の分離とルートディレクトリの変更 $ sudo unshare --pid --fork chroot . /bin/bash # ~ ここからコンテナ内部 ~
ハンズオン # proc fsの作成 # mkdir -p /proc # mount
-t proc proc /proc # psコマンドの実行 # ps PID TTY TIME CMD 1 ? 00:00:00 bash 4 ? 00:00:00 ps
まとめ • コンテナはLinux上で動作するただのプロセス。 • カーネルの機能を組み合わせて実現している。 • シェルでもコンテナは作成可能。もちろんC言語でも。