「あれ、コンテナって何だっけ?」から生まれた Rust で書かれた コンテナランタイム youkiの話@ODC2021
by
うたもく
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
「あれ、コンテナって何だっけ?」 から生まれた Rust で書かれた コンテナランタイム youkiの話 ODC 2021 08-28 うたもく(@utam0k) 1
Slide 2
Slide 2 text
自己紹介 ● うたもく(@utam0k) ● 普段はWeb企業のバックエンドエンジニア(Scala) ● 2021年からコンテナ真面目に入門 ● containersのメンバー 2
Slide 3
Slide 3 text
コンテナなんもわからん問題 この辺の話しがよくわからなくて危機感を覚えた https://thinkit.co.jp/article/18024 3
Slide 4
Slide 4 text
コンテナ何もわからんので自作を始めた 4
Slide 5
Slide 5 text
知ってもらいたいこと コンテナを支える技術 ● 周辺技術 ● 実際にコンテナを作ってみる youkiのこれまでとこれから ● Rustとコンテナランタイム ● youkiの特徴 ● 単なる勉強用の自作コンテナランタイムだったyoukiに他の 開発者が参戦するまでの経緯 5
Slide 6
Slide 6 text
目次 1. コンテナランタイムとは? 2. コンテナを作ってみよう 3. youkiの紹介 4. youkiのこれまでとこれから 6
Slide 7
Slide 7 text
目次 1. コンテナランタイムとは? 2. コンテナを作ってみよう 3. youkiの紹介 4. youkiのこれまでとこれから 7
Slide 8
Slide 8 text
使うもの ● Linux環境を準備してください ○ すぐに用意できない方向けにgitpodを用意しました ○ gitpod… ■ ブラウザで使えるオンラインIDE ■ ブラウザでLinuxのコマンドが使えます ○ リポジトリのREADMEにgitpodのリンクがあります ● デモのコマンドがあるリポジトリ ○ https://github.com/utam0k/container-demo 8
Slide 9
Slide 9 text
目次 1. コンテナランタイムとは? 2. コンテナを作ってみよう 3. youkiの紹介 4. youkiのこれまでとこれから 9
Slide 10
Slide 10 text
コンテナ? ● プロセス ≒ コンテナ ○ 様々なリソースが隔離されたプロセス プロセス ファイル達 プロセス ファイル達 プロセス ファイル達 OS 10
Slide 11
Slide 11 text
隔離? ● chroot(本当はpivot_rootを使う) ○ プロセスのルートディレクトリが指す先を変更 ● namespace ○ プロセスから操作可能なリソースを隔離できる機能 ● cgroup ○ プロセスの使用可能なリソースの設定が可能 11
Slide 12
Slide 12 text
namespace ● 色々な種類のnamespaceがある ○ PID namespace ■ プロセス群の隔離 ○ Mount namespace ■ マウントポイントリストの隔離 ○ UTS namespace ■ ホスト名などの隔離 ● いまだに色々な種類のnamespaceが増殖中 12
Slide 13
Slide 13 text
● プロセスのグループを作ってリソースの設定が可能 ● 例えば... ○ CPU使用時間の制限、割り当てCPUの指定 ○ デバイスのアクセス制御 ○ タスクの一時停止/再開 ● リソースの種類に合わせてリソースコントローラがある cgroup 13
Slide 14
Slide 14 text
/sys/fs/cgroup CPU Memory Devices P P P P P P P P P P 継 承 ディレクトリで階 層を表現 14
Slide 15
Slide 15 text
その他セキュリティ的な技術 ● capability ○ root権限での操作の制限 ● seccomp ○ システムコールの制限 15
Slide 16
Slide 16 text
K8sがコンテナを作るまで 16
Slide 17
Slide 17 text
Kubelet(K8s) Linuxなど 17
Slide 18
Slide 18 text
Kubelet(K8s) Container Runtime CRI Linuxなど CRI − Container Runtime Interface 18
Slide 19
Slide 19 text
Kubelet(K8s) Linuxなど High-Level Runtime CRI − Container Runtime Interface OCI − Open Container Initiative CRI Low-Level Runtime OCI 19
Slide 20
Slide 20 text
Kubelet(K8s) Linuxなど High-Level Runtime CRI Low-Level Runtime OCI ● runc ● youki ● crun 20
Slide 21
Slide 21 text
コンテナなんもわからん問題 この辺の話し側がよくわからなくて危機感を覚えた https://thinkit.co.jp/article/18024 21
Slide 22
Slide 22 text
Kubelet(K8s) Linuxなど High-Level Runtime CRI Low-Level Runtime OCI ● runc ● youki ● crun 22
Slide 23
Slide 23 text
Kubelet(K8s) Linuxなど containerd runc OCI dockershim CRI 23
Slide 24
Slide 24 text
Kubelet(K8s) Linuxなど containerd runc OCI dockershim ⚠ CRI 24
Slide 25
Slide 25 text
どうやって学んだのか 25
Slide 26
Slide 26 text
コンテナ編まとめ ● コンテナを支える技術 ○ chrootpace - ルートディレクトリを変更 ○ namespace - 操作可能なリソースの隔離 ○ cgroup ace - 使用可能なリソースの設定 ● コンテナ界隈を支える仕様 ○ CRI - Container Runtime Interface ○ OCI - Open Container Initiative 26
Slide 27
Slide 27 text
目次 1. コンテナランタイムとは? 2. コンテナを作ってみよう 3. youkiの紹介 4. youkiのこれまでとこれから 27
Slide 28
Slide 28 text
デモ https://github.com/utam0k/container-demo 28
Slide 29
Slide 29 text
知ってもらいたいこと コンテナを支える技術 ● 周辺技術 ● 実際にコンテナを作ってみる youkiのこれまでとこれから ● Rustとコンテナランタイム ● youkiの特徴 ● 単なる自作コンテナだったyoukiに他の開発者が参戦する までの経緯 29
Slide 30
Slide 30 text
目次 1. コンテナランタイムとは? 2. コンテナを作ってみよう 3. youkiの紹介 4. youkiのこれまでとこれから 30
Slide 31
Slide 31 text
Kubelet(K8s) Linuxなど High-Level Runtime CRI Low-Level Runtime OCI ● runc ● youki ● crun 31
Slide 32
Slide 32 text
● Rust製の低レベルコンテナランタイム ● podmanなどを開発しているcontainersで開発中 ○ https://github.com/containers/youki ● うたもくを中心にリリースに向けて開発を進めている ● githubで⭐数が1.3K ● youki = 容器 = コンテナ youkiとは? 32
Slide 33
Slide 33 text
youkiの存在意義 ● コンテナランタイムの多様性 ● コンテナ界隈でのライブラリへの貢献 ● Rustが活躍できる分野の拡大 ● 既存の低レイヤのソフトウェアをRustで書き換える 一例 33
Slide 34
Slide 34 text
Rust × コンテナランタイム ● 言語的な制約で使いにくいシステムコールがない ● 低レベルとRustコミュニティとの相性が良い ● パフォーマンス 34
Slide 35
Slide 35 text
Rust × コンテナランタイム 🤔 ● ライブラリなどの資産がない ● Rustコミュニティに知見がない 35
Slide 36
Slide 36 text
Rust × コンテナランタイムの詳細は 9/18のRust.Tokyo 2021で... 36
Slide 37
Slide 37 text
目次 1. コンテナランタイムとは? 2. コンテナを作ってみよう 3. youkiの紹介 4. youkiのこれまでとこれから 37
Slide 38
Slide 38 text
自作XXが自作とは言えなくなるまで 1. 知りたい分野のソフトウェアを再発明してみる 2. ある程度動くものを公開すると言語公式ツイッターやRedditで 注目を集める – 有益な意見がいっぱい集まる 3. 開発者が集まり、開発パワーを得る – good first issueに人がいっぱいくる – 自分が興味ある分野は他の人も勉強したかったりする 4. 自分はプロジェクトマネジメント的な立ち位置になる 38
Slide 39
Slide 39 text
● ただのRustで書かれた自作のコンテナランタイム ○ 完全に車輪の再発明気分 ● うたもくが1人でプライベートリポジトリで遊んでいた ● アーカイブされているoracle/railcarというRust製のコンテナ ランタイムのコードを参考 ● runtime-toolsという用意されていたコンテナランタイムのイ ンテグレーションテストを用いる 最初のyouki 39
Slide 40
Slide 40 text
最初の頃の僕に言いたいこと 名前を真面目に考えた方がいいぞ 40
Slide 41
Slide 41 text
なぜRustだったのか? ● 楽しいからです ● Q. 何か事前調査して採用したんですか? ○ この分野に無知すぎて何も調べてません ○ まぁRustなら困らんやろくらいには思っていました 41
Slide 42
Slide 42 text
現在のちょっと前のyouki ● リポジトリを公開してみる 42
Slide 43
Slide 43 text
公開した反応 ● 国内問わず海外からも反応があった ● そこそこ注目を集め始める ○ Redditや言語の公式ツイッターのリツイートで注目を集 める ○ GitHubのトレンド入り 43
Slide 44
Slide 44 text
公開した反応 ● 初期の自作アイコンがダサすぎて苦情がくる 😭 初期の酷評された 自作アイコン issueを立てたら描いて もらえた現在のイケてるアイコン 44
Slide 45
Slide 45 text
● 英語で発信できた ● Redditでほとんど全てのコメントに返信していた ● 動くものというインパクト ○ わかりやすいgifや画像が用意できる ● Rust ○ ちょうどLinuxの話もあったりこのレイヤではホットだった ● 完全なものではなかった ○ good first issueをいくつか用意していた ● 運がよかった 今思うとなぜ注目を集めれたか? 45
Slide 46
Slide 46 text
● お手本の実装がある ○ youkiの場合だとruncというお手本があった ○ cgroupのリソースコントローラを1つだけ実装しておく ● テストがある ○ runtime-toolsがあるためテストを通すという明確なゴールを 設定できた ● コンフリクトが起きないように考慮する ○ インターフェイスを区切って渡す good first issueを作るTips 46
Slide 47
Slide 47 text
この時の悩み ● うたもく以外の開発者がちょくちょく集まる ○ Rustの勉強 ○ コンテナの勉強 ● コントリビュータの方に何か還元できないかな... 47
Slide 48
Slide 48 text
containersでの開発に移行 48
Slide 49
Slide 49 text
● コントリビュータの人へ何かできないか... ○ 貢献先 → うたもくのリポジトリ ■ よくわからないうたもく個人リポジトリへの貢献 ○ 貢献先 → containersのリポジトリ ■ githubのプロフィールにもちょっと豪華に掲載される ● コンテナ関係の開発経験がある組織の意見が欲しかった containersでの開発に移行 49
Slide 50
Slide 50 text
現在のyouki ● 普通に動く、ドキュメントやコメントもそれなり ● コラボレータが6人 ○ うたもくはコミット数1位から陥落 ● github.comからそれなりの数の人が毎日見てくれている ● rootlessやcgroup v2などそれなりに新しい機能にも追従 ● まだファーストリリースはされていない ● コンテナランタイム好きの人にはそれなりに認知されてきた 50
Slide 51
Slide 51 text
これからのyouki ● リリースする! ● コンテナ界隈に必要なライブラリを増やしていく ● 他がやっていない独自の機能を研究 & 開発していく ○ 汎用的なコンテナランタイム用のテストツール ○ io_uringを用いた非同期処理 ● ベンチマークの計測 ● 楽しく遊んでいく 51
Slide 52
Slide 52 text
自作XXが自作とは言えなくなるまで 1. 知りたい分野のソフトウェアを再発明してみる 2. ある程度動くものを公開すると言語公式ツイッターやRedditで 注目を集める – 有益な意見がいっぱい集まる 3. 開発者が集まり、開発パワーを得る – good first issueに人がいっぱいくる – 自分が興味ある分野は他の人も勉強したかったりする 4. 自分はプロジェクトマネジメント的な立ち位置になる 52
Slide 53
Slide 53 text
Thanks to all the people who already contributed to youki :) 53
Slide 54
Slide 54 text
Thanks you! Any questions? 54