$30 off During Our Annual Pro Sale. View Details »

「あれ、コンテナって何だっけ?」から生まれた 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

うたもく

August 27, 2021
Tweet

More Decks by うたもく

Other Decks in Technology

Transcript

  1. 「あれ、コンテナって何だっけ?」

    から生まれた Rust で書かれた 

    コンテナランタイム youkiの話

    ODC 2021 08-28

    うたもく(@utam0k)

    1

    View Slide

  2. 自己紹介

    ● うたもく(@utam0k)

    ● 普段はWeb企業のバックエンドエンジニア(Scala)

    ● 2021年からコンテナ真面目に入門

    ● containersのメンバー

    2

    View Slide

  3. コンテナなんもわからん問題

    この辺の話しがよくわからなくて危機感を覚えた

    https://thinkit.co.jp/article/18024 
 3

    View Slide

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

    4

    View Slide

  5. 知ってもらいたいこと

    コンテナを支える技術 

    ● 周辺技術 

    ● 実際にコンテナを作ってみる 


    youkiのこれまでとこれから

    ● Rustとコンテナランタイム

    ● youkiの特徴

    ● 単なる勉強用の自作コンテナランタイムだったyoukiに他の
    開発者が参戦するまでの経緯


    5

    View Slide

  6. 目次

    1. コンテナランタイムとは?

    2. コンテナを作ってみよう

    3. youkiの紹介

    4. youkiのこれまでとこれから

    6

    View Slide

  7. 目次

    1. コンテナランタイムとは?

    2. コンテナを作ってみよう

    3. youkiの紹介

    4. youkiのこれまでとこれから

    7

    View Slide

  8. 使うもの

    ● Linux環境を準備してください

    ○ すぐに用意できない方向けにgitpodを用意しました

    ○ gitpod…

    ■ ブラウザで使えるオンラインIDE

    ■ ブラウザでLinuxのコマンドが使えます

    ○ リポジトリのREADMEにgitpodのリンクがあります

    ● デモのコマンドがあるリポジトリ

    ○ https://github.com/utam0k/container-demo

    8

    View Slide

  9. 目次

    1. コンテナランタイムとは?

    2. コンテナを作ってみよう

    3. youkiの紹介

    4. youkiのこれまでとこれから

    9

    View Slide

  10. コンテナ?

    ● プロセス ≒ コンテナ

    ○ 様々なリソースが隔離されたプロセス

    プロセス

    ファイル達

    プロセス

    ファイル達

    プロセス

    ファイル達

    OS
    10

    View Slide

  11. 隔離?

    ● chroot(本当はpivot_rootを使う)

    ○ プロセスのルートディレクトリが指す先を変更

    ● namespace

    ○ プロセスから操作可能なリソースを隔離できる機能

    ● cgroup

    ○ プロセスの使用可能なリソースの設定が可能

    11

    View Slide

  12. namespace

    ● 色々な種類のnamespaceがある

    ○ PID namespace

    ■ プロセス群の隔離

    ○ Mount namespace

    ■ マウントポイントリストの隔離

    ○ UTS namespace

    ■ ホスト名などの隔離

    ● いまだに色々な種類のnamespaceが増殖中

    12

    View Slide

  13. ● プロセスのグループを作ってリソースの設定が可能

    ● 例えば...

    ○ CPU使用時間の制限、割り当てCPUの指定

    ○ デバイスのアクセス制御

    ○ タスクの一時停止/再開

    ● リソースの種類に合わせてリソースコントローラがある

    cgroup

    13

    View Slide

  14. /sys/fs/cgroup

    CPU
 Memory
 Devices

    P
    P P P P P
    P P
    P P

    承

    ディレクトリで階
    層を表現

    14

    View Slide

  15. その他セキュリティ的な技術

    ● capability

    ○ root権限での操作の制限

    ● seccomp

    ○ システムコールの制限

    15

    View Slide

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

    16

    View Slide

  17. Kubelet(K8s)
 Linuxなど

    17

    View Slide

  18. Kubelet(K8s)
 Container Runtime

    CRI

    Linuxなど

    CRI − Container Runtime Interface

    18

    View Slide

  19. Kubelet(K8s)
 Linuxなど

    High-Level
    Runtime

    CRI − Container Runtime Interface

    OCI − Open Container Initiative

    CRI

    Low-Level
    Runtime

    OCI

    19

    View Slide

  20. Kubelet(K8s)
 Linuxなど

    High-Level
    Runtime

    CRI

    Low-Level
    Runtime

    OCI

    ● runc

    ● youki

    ● crun

    20

    View Slide

  21. コンテナなんもわからん問題

    この辺の話し側がよくわからなくて危機感を覚えた

    https://thinkit.co.jp/article/18024 

    21

    View Slide

  22. Kubelet(K8s)
 Linuxなど

    High-Level
    Runtime

    CRI

    Low-Level
    Runtime

    OCI

    ● runc

    ● youki

    ● crun

    22

    View Slide

  23. Kubelet(K8s)
 Linuxなど

    containerd
 runc

    OCI

    dockershim

    CRI

    23

    View Slide

  24. Kubelet(K8s)
 Linuxなど

    containerd
 runc

    OCI

    dockershim

    ⚠

    CRI

    24

    View Slide

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

    25

    View Slide

  26. コンテナ編まとめ

    ● コンテナを支える技術

    ○ chrootpace - ルートディレクトリを変更

    ○ namespace - 操作可能なリソースの隔離

    ○ cgroup ace - 使用可能なリソースの設定


    ● コンテナ界隈を支える仕様

    ○ CRI - Container Runtime Interface

    ○ OCI - Open Container Initiative

    26

    View Slide

  27. 目次

    1. コンテナランタイムとは?

    2. コンテナを作ってみよう

    3. youkiの紹介

    4. youkiのこれまでとこれから

    27

    View Slide

  28. デモ

    https://github.com/utam0k/container-demo

    28

    View Slide

  29. 知ってもらいたいこと

    コンテナを支える技術 

    ● 周辺技術 

    ● 実際にコンテナを作ってみる 


    youkiのこれまでとこれから

    ● Rustとコンテナランタイム

    ● youkiの特徴

    ● 単なる自作コンテナだったyoukiに他の開発者が参戦する
    までの経緯


    29

    View Slide

  30. 目次

    1. コンテナランタイムとは?

    2. コンテナを作ってみよう

    3. youkiの紹介

    4. youkiのこれまでとこれから

    30

    View Slide

  31. Kubelet(K8s)
 Linuxなど

    High-Level
    Runtime

    CRI

    Low-Level
    Runtime

    OCI

    ● runc

    ● youki

    ● crun


    31

    View Slide

  32. ● Rust製の低レベルコンテナランタイム

    ● podmanなどを開発しているcontainersで開発中

    ○ https://github.com/containers/youki

    ● うたもくを中心にリリースに向けて開発を進めている

    ● githubで⭐数が1.3K

    ● youki = 容器 = コンテナ

    youkiとは?

    32

    View Slide

  33. youkiの存在意義

    ● コンテナランタイムの多様性

    ● コンテナ界隈でのライブラリへの貢献

    ● Rustが活躍できる分野の拡大

    ● 既存の低レイヤのソフトウェアをRustで書き換える
    一例

    33

    View Slide

  34. Rust × コンテナランタイム

    󰢐

    ● 言語的な制約で使いにくいシステムコールがない

    ● 低レベルとRustコミュニティとの相性が良い

    ● パフォーマンス

    34

    View Slide

  35. Rust × コンテナランタイム

    🤔

    ● ライブラリなどの資産がない

    ● Rustコミュニティに知見がない

    35

    View Slide

  36. Rust × コンテナランタイムの詳細は

         9/18のRust.Tokyo 2021で...

    36

    View Slide

  37. 目次

    1. コンテナランタイムとは?

    2. コンテナを作ってみよう

    3. youkiの紹介

    4. youkiのこれまでとこれから

    37

    View Slide

  38. 自作XXが自作とは言えなくなるまで

    1. 知りたい分野のソフトウェアを再発明してみる

    2. ある程度動くものを公開すると言語公式ツイッターやRedditで
    注目を集める

    – 有益な意見がいっぱい集まる

    3. 開発者が集まり、開発パワーを得る

    – good first issueに人がいっぱいくる

    – 自分が興味ある分野は他の人も勉強したかったりする

    4. 自分はプロジェクトマネジメント的な立ち位置になる

    38

    View Slide

  39. ● ただのRustで書かれた自作のコンテナランタイム

    ○ 完全に車輪の再発明気分

    ● うたもくが1人でプライベートリポジトリで遊んでいた

    ● アーカイブされているoracle/railcarというRust製のコンテナ
    ランタイムのコードを参考

    ● runtime-toolsという用意されていたコンテナランタイムのイ
    ンテグレーションテストを用いる

    最初のyouki

    39

    View Slide

  40. 最初の頃の僕に言いたいこと

    名前を真面目に考えた方がいいぞ

    40

    View Slide

  41. なぜRustだったのか?

    ● 楽しいからです

    ● Q. 何か事前調査して採用したんですか?

    ○ この分野に無知すぎて何も調べてません

    ○ まぁRustなら困らんやろくらいには思っていました

    41

    View Slide

  42. 現在のちょっと前のyouki

    ● リポジトリを公開してみる

    42

    View Slide

  43. 公開した反応

    ● 国内問わず海外からも反応があった

    ● そこそこ注目を集め始める

    ○ Redditや言語の公式ツイッターのリツイートで注目を集
    める

    ○ GitHubのトレンド入り

    43

    View Slide

  44. 公開した反応

    ● 初期の自作アイコンがダサすぎて苦情がくる 😭

    初期の酷評された

    自作アイコン

    issueを立てたら描いて

    もらえた現在のイケてるアイコン

    44

    View Slide

  45. ● 英語で発信できた

    ● Redditでほとんど全てのコメントに返信していた

    ● 動くものというインパクト

    ○ わかりやすいgifや画像が用意できる

    ● Rust

    ○ ちょうどLinuxの話もあったりこのレイヤではホットだった

    ● 完全なものではなかった

    ○ good first issueをいくつか用意していた

    ● 運がよかった

    今思うとなぜ注目を集めれたか?

    45

    View Slide

  46. ● お手本の実装がある

    ○ youkiの場合だとruncというお手本があった

    ○ cgroupのリソースコントローラを1つだけ実装しておく

    ● テストがある

    ○ runtime-toolsがあるためテストを通すという明確なゴールを
    設定できた

    ● コンフリクトが起きないように考慮する

    ○ インターフェイスを区切って渡す

    good first issueを作るTips

    46

    View Slide

  47. この時の悩み

    ● うたもく以外の開発者がちょくちょく集まる

    ○ Rustの勉強

    ○ コンテナの勉強

    ● コントリビュータの方に何か還元できないかな...

    47

    View Slide

  48. containersでの開発に移行

    48

    View Slide

  49. ● コントリビュータの人へ何かできないか...

    ○ 貢献先 → うたもくのリポジトリ

    ■ よくわからないうたもく個人リポジトリへの貢献

    ○ 貢献先 → containersのリポジトリ

    ■ githubのプロフィールにもちょっと豪華に掲載される

    ● コンテナ関係の開発経験がある組織の意見が欲しかった

    containersでの開発に移行

    49

    View Slide

  50. 現在のyouki

    ● 普通に動く、ドキュメントやコメントもそれなり

    ● コラボレータが6人

    ○ うたもくはコミット数1位から陥落

    ● github.comからそれなりの数の人が毎日見てくれている

    ● rootlessやcgroup v2などそれなりに新しい機能にも追従

    ● まだファーストリリースはされていない

    ● コンテナランタイム好きの人にはそれなりに認知されてきた

    50

    View Slide

  51. これからのyouki

    ● リリースする!

    ● コンテナ界隈に必要なライブラリを増やしていく

    ● 他がやっていない独自の機能を研究 & 開発していく

    ○ 汎用的なコンテナランタイム用のテストツール

    ○ io_uringを用いた非同期処理

    ● ベンチマークの計測

    ● 楽しく遊んでいく

    51

    View Slide

  52. 自作XXが自作とは言えなくなるまで

    1. 知りたい分野のソフトウェアを再発明してみる

    2. ある程度動くものを公開すると言語公式ツイッターやRedditで
    注目を集める

    – 有益な意見がいっぱい集まる

    3. 開発者が集まり、開発パワーを得る

    – good first issueに人がいっぱいくる

    – 自分が興味ある分野は他の人も勉強したかったりする

    4. 自分はプロジェクトマネジメント的な立ち位置になる

    52

    View Slide

  53. Thanks to all the people who
    already contributed to youki :)

    53

    View Slide

  54. Thanks you! Any questions?

    54

    View Slide