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