Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「あれ、コンテナって何だっけ?」から生まれた Rust で書かれた コンテナランタイム youkiの話@ODC2021

「あれ、コンテナって何だっけ?」から生まれた Rust で書かれた コンテナランタイム youkiの話@ODC2021

https://event.ospn.jp/odc2021-online/session/405951

今やエンジニアにとって必須の技術となっているコンテナ。何気なく使っているコンテナですが、コンテナって実際はどうやって動いているのでしょう?namespace?cgroup? そんな疑問から私はコンテナランタイムを学び始めました。そして出来上がったのがRustで書かれたコンテナランタイムのyoukiでした。

youkiは今ではコンテナランタイムとしての基本的な機能は一通り備え、rootlessやcgroup v2対応なども行われています。また、僕以外にもアクティブな開発者を数人抱え、podmanなどを開発しているオーガナイゼーションのcontainersでファーストリリースに向けて開発が続けられています。

本セッションではまず、コンテナランタイムの基礎技術の紹介から実際に簡単なコンテナランタイム作成を行います。また、youkiの紹介と小さな自作コンテナランタイムだったyoukiの成長過程とこれからについて紹介します。
https://github.com/containers/youki

D0acab281cd715f03af84f51ebd71faa?s=128

うたもく

August 27, 2021
Tweet

Transcript

  1. 「あれ、コンテナって何だっけ?」
 から生まれた Rust で書かれた 
 コンテナランタイム youkiの話
 ODC 2021 08-28


    うたもく(@utam0k)
 1
  2. 自己紹介
 • うたもく(@utam0k)
 • 普段はWeb企業のバックエンドエンジニア(Scala)
 • 2021年からコンテナ真面目に入門
 • containersのメンバー
 2

  3. コンテナなんもわからん問題
 この辺の話しがよくわからなくて危機感を覚えた
 https://thinkit.co.jp/article/18024 
 3

  4. コンテナ何もわからんので自作を始めた
 4

  5. 知ってもらいたいこと
 コンテナを支える技術 
 • 周辺技術 
 • 実際にコンテナを作ってみる 
 


    youkiのこれまでとこれから
 • Rustとコンテナランタイム
 • youkiの特徴
 • 単なる勉強用の自作コンテナランタイムだったyoukiに他の 開発者が参戦するまでの経緯
 
 5
  6. 目次
 1. コンテナランタイムとは?
 2. コンテナを作ってみよう
 3. youkiの紹介
 4. youkiのこれまでとこれから
 6

  7. 目次
 1. コンテナランタイムとは?
 2. コンテナを作ってみよう
 3. youkiの紹介
 4. youkiのこれまでとこれから
 7

  8. 使うもの
 • Linux環境を準備してください
 ◦ すぐに用意できない方向けにgitpodを用意しました
 ◦ gitpod…
 ▪ ブラウザで使えるオンラインIDE
 ▪

    ブラウザでLinuxのコマンドが使えます
 ◦ リポジトリのREADMEにgitpodのリンクがあります
 • デモのコマンドがあるリポジトリ
 ◦ https://github.com/utam0k/container-demo
 8
  9. 目次
 1. コンテナランタイムとは?
 2. コンテナを作ってみよう
 3. youkiの紹介
 4. youkiのこれまでとこれから
 9

  10. コンテナ?
 • プロセス ≒ コンテナ
 ◦ 様々なリソースが隔離されたプロセス
 プロセス
 ファイル達
 プロセス


    ファイル達
 プロセス
 ファイル達
 OS 10
  11. 隔離?
 • chroot(本当はpivot_rootを使う)
 ◦ プロセスのルートディレクトリが指す先を変更
 • namespace
 ◦ プロセスから操作可能なリソースを隔離できる機能
 •

    cgroup
 ◦ プロセスの使用可能なリソースの設定が可能
 11
  12. namespace
 • 色々な種類のnamespaceがある
 ◦ PID namespace
 ▪ プロセス群の隔離
 ◦ Mount

    namespace
 ▪ マウントポイントリストの隔離
 ◦ UTS namespace
 ▪ ホスト名などの隔離
 • いまだに色々な種類のnamespaceが増殖中
 12
  13. • プロセスのグループを作ってリソースの設定が可能
 • 例えば...
 ◦ CPU使用時間の制限、割り当てCPUの指定
 ◦ デバイスのアクセス制御
 ◦ タスクの一時停止/再開


    • リソースの種類に合わせてリソースコントローラがある
 cgroup
 13
  14. /sys/fs/cgroup
 CPU
 Memory
 Devices
 P P P P P P

    P P P P 継 承
 ディレクトリで階 層を表現
 14
  15. その他セキュリティ的な技術
 • capability
 ◦ root権限での操作の制限
 • seccomp
 ◦ システムコールの制限
 15

  16. K8sがコンテナを作るまで
 16

  17. Kubelet(K8s)
 Linuxなど
 17

  18. Kubelet(K8s)
 Container Runtime
 CRI
 Linuxなど
 CRI − Container Runtime Interface


    18
  19. Kubelet(K8s)
 Linuxなど
 High-Level Runtime
 CRI − Container Runtime Interface
 OCI

    − Open Container Initiative
 CRI
 Low-Level Runtime
 OCI
 19
  20. Kubelet(K8s)
 Linuxなど
 High-Level Runtime
 CRI
 Low-Level Runtime
 OCI
 • runc


    • youki
 • crun
 20
  21. コンテナなんもわからん問題
 この辺の話し側がよくわからなくて危機感を覚えた
 https://thinkit.co.jp/article/18024 
 21

  22. Kubelet(K8s)
 Linuxなど
 High-Level Runtime
 CRI
 Low-Level Runtime
 OCI
 • runc


    • youki
 • crun
 22
  23. Kubelet(K8s)
 Linuxなど
 containerd
 runc
 OCI
 dockershim
 CRI
 23

  24. Kubelet(K8s)
 Linuxなど
 containerd
 runc
 OCI
 dockershim
 ⚠
 CRI
 24

  25. どうやって学んだのか
 25

  26. コンテナ編まとめ
 • コンテナを支える技術
 ◦ chrootpace - ルートディレクトリを変更
 ◦ namespace -

    操作可能なリソースの隔離
 ◦ cgroup ace - 使用可能なリソースの設定
 
 • コンテナ界隈を支える仕様
 ◦ CRI - Container Runtime Interface
 ◦ OCI - Open Container Initiative
 26
  27. 目次
 1. コンテナランタイムとは?
 2. コンテナを作ってみよう
 3. youkiの紹介
 4. youkiのこれまでとこれから
 27

  28. デモ
 https://github.com/utam0k/container-demo
 28

  29. 知ってもらいたいこと
 コンテナを支える技術 
 • 周辺技術 
 • 実際にコンテナを作ってみる 
 


    youkiのこれまでとこれから
 • Rustとコンテナランタイム
 • youkiの特徴
 • 単なる自作コンテナだったyoukiに他の開発者が参戦する までの経緯
 
 29
  30. 目次
 1. コンテナランタイムとは?
 2. コンテナを作ってみよう
 3. youkiの紹介
 4. youkiのこれまでとこれから
 30

  31. Kubelet(K8s)
 Linuxなど
 High-Level Runtime
 CRI
 Low-Level Runtime
 OCI
 • runc


    • youki
 • crun
 
 31
  32. • Rust製の低レベルコンテナランタイム
 • podmanなどを開発しているcontainersで開発中
 ◦ https://github.com/containers/youki
 • うたもくを中心にリリースに向けて開発を進めている
 • githubで⭐数が1.3K


    • youki = 容器 = コンテナ
 youkiとは?
 32
  33. youkiの存在意義
 • コンテナランタイムの多様性
 • コンテナ界隈でのライブラリへの貢献
 • Rustが活躍できる分野の拡大
 • 既存の低レイヤのソフトウェアをRustで書き換える 一例


    33
  34. Rust × コンテナランタイム
 󰢐
 • 言語的な制約で使いにくいシステムコールがない
 • 低レベルとRustコミュニティとの相性が良い
 • パフォーマンス


    34
  35. Rust × コンテナランタイム
 🤔
 • ライブラリなどの資産がない
 • Rustコミュニティに知見がない
 35

  36. Rust × コンテナランタイムの詳細は
      9/18のRust.Tokyo 2021で...
 36

  37. 目次
 1. コンテナランタイムとは?
 2. コンテナを作ってみよう
 3. youkiの紹介
 4. youkiのこれまでとこれから
 37

  38. 自作XXが自作とは言えなくなるまで
 1. 知りたい分野のソフトウェアを再発明してみる
 2. ある程度動くものを公開すると言語公式ツイッターやRedditで 注目を集める
 – 有益な意見がいっぱい集まる
 3. 開発者が集まり、開発パワーを得る


    – good first issueに人がいっぱいくる
 – 自分が興味ある分野は他の人も勉強したかったりする
 4. 自分はプロジェクトマネジメント的な立ち位置になる
 38
  39. • ただのRustで書かれた自作のコンテナランタイム
 ◦ 完全に車輪の再発明気分
 • うたもくが1人でプライベートリポジトリで遊んでいた
 • アーカイブされているoracle/railcarというRust製のコンテナ ランタイムのコードを参考
 •

    runtime-toolsという用意されていたコンテナランタイムのイ ンテグレーションテストを用いる
 最初のyouki
 39
  40. 最初の頃の僕に言いたいこと
 名前を真面目に考えた方がいいぞ
 40

  41. なぜRustだったのか?
 • 楽しいからです
 • Q. 何か事前調査して採用したんですか?
 ◦ この分野に無知すぎて何も調べてません
 ◦ まぁRustなら困らんやろくらいには思っていました


    41
  42. 現在のちょっと前のyouki
 • リポジトリを公開してみる
 42

  43. 公開した反応
 • 国内問わず海外からも反応があった
 • そこそこ注目を集め始める
 ◦ Redditや言語の公式ツイッターのリツイートで注目を集 める
 ◦ GitHubのトレンド入り


    43
  44. 公開した反応
 • 初期の自作アイコンがダサすぎて苦情がくる 😭
 初期の酷評された
 自作アイコン
 issueを立てたら描いて
 もらえた現在のイケてるアイコン
 44

  45. • 英語で発信できた
 • Redditでほとんど全てのコメントに返信していた
 • 動くものというインパクト
 ◦ わかりやすいgifや画像が用意できる
 • Rust


    ◦ ちょうどLinuxの話もあったりこのレイヤではホットだった
 • 完全なものではなかった
 ◦ good first issueをいくつか用意していた
 • 運がよかった
 今思うとなぜ注目を集めれたか?
 45
  46. • お手本の実装がある
 ◦ youkiの場合だとruncというお手本があった
 ◦ cgroupのリソースコントローラを1つだけ実装しておく
 • テストがある
 ◦ runtime-toolsがあるためテストを通すという明確なゴールを

    設定できた
 • コンフリクトが起きないように考慮する
 ◦ インターフェイスを区切って渡す
 good first issueを作るTips
 46
  47. この時の悩み
 • うたもく以外の開発者がちょくちょく集まる
 ◦ Rustの勉強
 ◦ コンテナの勉強
 • コントリビュータの方に何か還元できないかな...
 47

  48. containersでの開発に移行
 48

  49. • コントリビュータの人へ何かできないか...
 ◦ 貢献先 → うたもくのリポジトリ
 ▪ よくわからないうたもく個人リポジトリへの貢献
 ◦ 貢献先

    → containersのリポジトリ
 ▪ githubのプロフィールにもちょっと豪華に掲載される
 • コンテナ関係の開発経験がある組織の意見が欲しかった
 containersでの開発に移行
 49
  50. 現在のyouki
 • 普通に動く、ドキュメントやコメントもそれなり
 • コラボレータが6人
 ◦ うたもくはコミット数1位から陥落
 • github.comからそれなりの数の人が毎日見てくれている
 •

    rootlessやcgroup v2などそれなりに新しい機能にも追従
 • まだファーストリリースはされていない
 • コンテナランタイム好きの人にはそれなりに認知されてきた
 50
  51. これからのyouki
 • リリースする!
 • コンテナ界隈に必要なライブラリを増やしていく
 • 他がやっていない独自の機能を研究 & 開発していく
 ◦

    汎用的なコンテナランタイム用のテストツール
 ◦ io_uringを用いた非同期処理
 • ベンチマークの計測
 • 楽しく遊んでいく
 51
  52. 自作XXが自作とは言えなくなるまで
 1. 知りたい分野のソフトウェアを再発明してみる
 2. ある程度動くものを公開すると言語公式ツイッターやRedditで 注目を集める
 – 有益な意見がいっぱい集まる
 3. 開発者が集まり、開発パワーを得る


    – good first issueに人がいっぱいくる
 – 自分が興味ある分野は他の人も勉強したかったりする
 4. 自分はプロジェクトマネジメント的な立ち位置になる
 52
  53. Thanks to all the people who already contributed to youki

    :)
 53
  54. Thanks you! Any questions?
 54