「あれ、コンテナって何だっけ?」から生まれた Rust で書かれた コンテナランタイム youkiの話@ODC2021
by
うたもく
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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