Hello, youki!
tech rust youki
Published: 2021-12-27

Hello, youki!

この記事はyoukiのv0.0.1リリースの思い出に書いた記事です

View Relase Note
英語記事のほうがより詳しい内容になっています。

🤔 youkiとは

OCI Runtime Specificationに載っているOCIコンテナランタイム1の1つでRustで実装されています。 簡単に言うとコンテナを実際に作るソフトウェアです。

実際に動いている様子はこんな感じです。 このツイートの時に日本の冬が終わるまでにリリースと宣言していたので今回のリリースで一安心してます。

youkiは何がうれしいのか

コンテナを利用する側と、OCIコンテナランタイムを開発する側の2種類の目線から細かいところは無視して一番インパクトが大きそうなうれしさを紹介させてください。

コンテナ利用者目線

コンテナの起動から削除までの1サイクルの実行速度の向上が一番体感できるうれしさだと思います。 簡単にですが、私のローカル環境での実行速度のベンチマーク結果です。

RuntimeTime (mean ± σ)Range (min … max)
youki198.4 ms ± 52.1 ms97.2 ms … 296.1 ms
runc352.3 ms ± 53.3 ms248.3 ms … 772.2 ms
crun153.5 ms ± 21.6 ms80.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コンテナランタイム開発者目線

開発が楽になります。OCIコンテナランタイム2というソフトウェアは強くLinuxカーネルの機能に依存しています。 利用するカーネルの機能の中にはマルチスレッドで動作していては効果が発揮されないものもあります。 これはつまり、言語のランタイムなどがある場合、ランタイムがマルチスレッドでは困るということです。 Rustの場合はその制約をクリアし、さらにメモリ安全であり、ゼロコスト抽象化の恩恵を受けながら開発を進めることができます。 こんなにOCIコンテナランタイムの実装にちょうどよい言語はなかなかないかなと思います。

youkiの不安点

まだまだできたてほやほやです。 OCI Runtime仕様にはないがコンテナ界隈ではスタンダードな機能が全て実装されているかというとまだまだです。 実運用されている実績もまだないです。 これらを補うために、containerdなどのハイレベルコンテナランタイムのインテグレーションをruncではなく強制的にyoukiに置き換えてyoukiのCIに組み込むことを挑戦しています。少々お待ちください。

実装状況

OCIコンテナランタイム2では仕様の実装以外にも実世界で使われている様々な機能の実装が必要です。 youkiのv.0.0.1のリリース時点での実装状況は以下のような感じです。 なかなかがんばってるでしょ😉

FeatureDescriptionState
DockerRunning via Docker
PodmanRunning via Podman
pivot_rootChange the root directory
MountsMount files and directories to container
NamespacesIsolation of various resources
CapabilitiesLimiting root privileges
Cgroups v1Resource limitations, etc
Cgroups v2Improved version of v1Support is complete except for devices. WIP on #78
Systemd cgroup driverSetting up a cgroup using systemd
SeccompFiltering system calls
HooksAdd custom processing during container creation
RootlessRunning a container without root privileges
OCI ComplianceCompliance 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を作るまでの経緯を書かせてください。

Oracleが作っていて既にアーカイブされたrailcarを学ぶ
現在のyoukiとなるRustのコンテナランタイムの実装を始める。
Redditなどで注目を集めて開発者が集まる
うたもく個人からcontainersへの移管
注目度が上がり、開発者が続々と増える
Youkiファーストリリース

🥰 謝辞

素晴らしいコラボレータの方々ありがとうございます。 Thomas SchubartyihuafYJDoc2tommadyYukangTravis Sturzl

また、協力してくださったcontainersのみなさんありがとうございます。 特に、Sascha Grunert, Giuseppe Scrivano and Daniel J Walshありがとうございます。

Thanks to all the people who already contributed!

💬 最後に

みなさんのコントリビュートをいつだって待っています。 スポンサー機能とか開放していないので、よかったらスターをつけてくれると開発者の励みになります。

Star

  1. OCIコンテナランタイムについては以前にODC2021Rust.Tokyo 2021第15回 コンテナ技術の情報交換会(習熟度順)で発表させてもらっているのでそれらを参照してみてください ↩︎

  2. この記事のOCIコンテナランタイムはVM型ではなくnamespaceなどを用いたタイプのOCIコンテナランタイムを指しています ↩︎ ↩︎

Share on:
comments powered by Disqus