🤔 youkiとは
OCI Runtime Specificationに載っているOCIコンテナランタイム1の1つでRustで実装されています。 簡単に言うとコンテナを実際に作るソフトウェアです。
実際に動いている様子はこんな感じです。 このツイートの時に日本の冬が終わるまでにリリースと宣言していたので今回のリリースで一安心してます。
🥳 Youki, the OCI container runtime written in Rust(@rustlang), passed all the integration tests of runtime_tools prepared by @OCI_ORG. I hope to first release it by the end of the cold season in Japan. Please look forward to it.https://t.co/Pj2uWRnZG6 pic.twitter.com/5hLvzJTMny
— utam0k (@utam0k) September 27, 2021
youkiは何がうれしいのか
コンテナを利用する側と、OCIコンテナランタイムを開発する側の2種類の目線から細かいところは無視して一番インパクトが大きそうなうれしさを紹介させてください。
コンテナの起動から削除までの1サイクルの実行速度の向上が一番体感できるうれしさだと思います。 簡単にですが、私のローカル環境での実行速度のベンチマーク結果です。
Runtime | Time (mean ± σ) | Range (min … max) |
---|---|---|
youki | 198.4 ms ± 52.1 ms | 97.2 ms … 296.1 ms |
runc | 352.3 ms ± 53.3 ms | 248.3 ms … 772.2 ms |
crun | 153.5 ms ± 21.6 ms | 80.9 ms … 196.6 ms |
ベンチマークの詳細
- A command used for the benchmark
$ hyperfine --prepare 'sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' --warmup 10 --min-runs 100 'sudo ./youki create -b tutorial a && sudo ./youki start a && sudo ./youki delete -f a'
- Enviroment
$ ./youki info Version 0.0.1 Kernel-Release 5.11.0-41-generic Kernel-Version #45-Ubuntu SMP Fri Nov 5 11:37:01 UTC 2021 Architecture x86_64 Operating System Ubuntu 21.04 Cores 12 Total Memory 32025 Cgroup setup hybrid Cgroup mounts blkio /sys/fs/cgroup/blkio cpu /sys/fs/cgroup/cpu,cpuacct cpuacct /sys/fs/cgroup/cpu,cpuacct cpuset /sys/fs/cgroup/cpuset devices /sys/fs/cgroup/devices freezer /sys/fs/cgroup/freezer hugetlb /sys/fs/cgroup/hugetlb memory /sys/fs/cgroup/memory net_cls /sys/fs/cgroup/net_cls,net_prio net_prio /sys/fs/cgroup/net_cls,net_prio perf_event /sys/fs/cgroup/perf_event pids /sys/fs/cgroup/pids unified /sys/fs/cgroup/unified CGroup v2 controllers cpu detached cpuset detached hugetlb detached io detached memory detached pids detached device attached Namespaces enabled mount enabled uts enabled ipc enabled user enabled pid enabled network enabled cgroup enabled $ ./youki --version youki version 0.0.1 commit: 0.0.1-0-0be33bf $ runc -v runc version 1.0.0-rc93 commit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec spec: 1.0.2-dev go: go1.13.15 libseccomp: 2.5.1 $ crun --version crun version 0.19.1.45-4cc7 commit: 4cc7fa1124cce75dc26e12186d9cbeabded2b710 spec: 1.0.0 +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +YAJL
開発が楽になります。OCIコンテナランタイム2というソフトウェアは強くLinuxカーネルの機能に依存しています。 利用するカーネルの機能の中にはマルチスレッドで動作していては効果が発揮されないものもあります。 これはつまり、言語のランタイムなどがある場合、ランタイムがマルチスレッドでは困るということです。 Rustの場合はその制約をクリアし、さらにメモリ安全であり、ゼロコスト抽象化の恩恵を受けながら開発を進めることができます。 こんなにOCIコンテナランタイムの実装にちょうどよい言語はなかなかないかなと思います。
youkiの不安点
まだまだできたてほやほやです。 OCI Runtime仕様にはないがコンテナ界隈ではスタンダードな機能が全て実装されているかというとまだまだです。 実運用されている実績もまだないです。 これらを補うために、containerdなどのハイレベルコンテナランタイムのインテグレーションをruncではなく強制的にyoukiに置き換えてyoukiのCIに組み込むことを挑戦しています。少々お待ちください。
実装状況
OCIコンテナランタイム2では仕様の実装以外にも実世界で使われている様々な機能の実装が必要です。 youkiのv.0.0.1のリリース時点での実装状況は以下のような感じです。 なかなかがんばってるでしょ😉
Feature | Description | State |
---|---|---|
Docker | Running via Docker | ✅ |
Podman | Running via Podman | ✅ |
pivot_root | Change the root directory | ✅ |
Mounts | Mount files and directories to container | ✅ |
Namespaces | Isolation of various resources | ✅ |
Capabilities | Limiting root privileges | ✅ |
Cgroups v1 | Resource limitations, etc | ✅ |
Cgroups v2 | Improved version of v1 | Support is complete except for devices. WIP on #78 |
Systemd cgroup driver | Setting up a cgroup using systemd | ✅ |
Seccomp | Filtering system calls | ✅ |
Hooks | Add custom processing during container creation | ✅ |
Rootless | Running a container without root privileges | ✅ |
OCI Compliance | Compliance with OCI Runtime Spec | ✅ 50 out of 50 test cases passing |
💪 モチベーション
なぜ我々はyoukiを実装し続けているのでしょうか。
Rustという言語
楽しい。我々はRustらしいコードを目指しています。コンテナランタイム界隈への貢献
OCIランタイムの仕様にはスタンダードになっているが、仕様にはないものがあります。 これは他のコンテナランタイムが発展することでしっかりと仕様に落とし込まれるのではないかと思っています。
また、youkiで出来たcrateの提供をできる限り行おうとしています。実際にcontainers/oci-spec-rsをcrateとしてyouki本体のコードから切り離して提供しています。探求心
新しいOCIコンテナランタイムは古いカーネルのサポートなどはしません。 そうすることでio_uringやclone3など新しい機能を使える可能性を秘めています。わくわくしますね。なんて言ったてプログラミングは楽しい
皆さんプログラミング好きですか?僕はOSSを楽しんでいます。
🤝 Youkiへの参加
YoukiはRustでコンテナランタイムを勉強したい方やみなさんの意見をいつでも募集しています。
また、開発としての最初の参加方法としてgood first issueを用意しています。 もし、good first issueがなくて困った場合はDiscordやTwitterで僕に聞いてみてください。
👣 歴史
完全に私事ですが、最初のコミットをしたうたもくがyoukiを作るまでの経緯を書かせてください。
Rustで作ってます。公開できる形になったら、そのうち公開するかもです...
— utam0k (@utam0k) January 31, 2021
最低限でdockerでHelloWorldするまでの道みたいな文書あると面白いかな。気が向いたら...文書書くの苦手...
まだエラーとかいっぱい出てる... pic.twitter.com/jLsaVQH9Vl
🎉 I joined the containers organization, which is developing podman and crun. And I moved youki under containers.https://t.co/dMTFxrZKUZ pic.twitter.com/qx2nnvyvxw
— utam0k (@utam0k) June 4, 2021
🥰 謝辞
素晴らしいコラボレータの方々ありがとうございます。 Thomas Schubart、yihuaf、YJDoc2、tommady、Yukang 、Travis Sturzl
また、協力してくださったcontainersのみなさんありがとうございます。 特に、Sascha Grunert, Giuseppe Scrivano and Daniel J Walshありがとうございます。
Thanks to all the people who already contributed!
💬 最後に
みなさんのコントリビュートをいつだって待っています。 スポンサー機能とか開放していないので、よかったらスターをつけてくれると開発者の励みになります。
OCIコンテナランタイムについては以前にODC2021、Rust.Tokyo 2021、第15回 コンテナ技術の情報交換会(習熟度順)で発表させてもらっているのでそれらを参照してみてください ↩︎
この記事のOCIコンテナランタイムはVM型ではなくnamespaceなどを用いたタイプのOCIコンテナランタイムを指しています ↩︎ ↩︎