Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
youki libkrunで実現するVM型コンテナ
Search
Yusuke Sakurai
October 23, 2025
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
youki libkrunで実現するVM型コンテナ
Yusuke Sakurai
October 23, 2025
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Accessibility Awareness
sabderemane
1
140
Become a Pro
speakerdeck
PRO
31
6k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Site-Speed That Sticks
csswizardry
13
1.2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Practical Orchestrator
shlominoach
191
11k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
390
How to Talk to Developers About Accessibility
jct
2
230
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
The Cult of Friendly URLs
andyhume
79
6.9k
Transcript
情報科学若手の会 10/11-13 youki x libkrunで実現するVM型コンテナ Copyright © 3-shake, Inc. All
Rights Reserved.
自己紹介 2 • 桜井 佑介 • 株式会社スリーシェイク • Sreake 事業部
SRE • github: saku3 • youki reviewer
株式会社スリーシェイク 3 株式会社スリーシェイク • SREの設計・技術支援 • 社内の技術検証活動の一環としてyoukiにコントリビュート • 参考 ◦
スリーシェイクインタビュー : 技術顧問 うたもくさん編 ◦ 社内活動の取り組み紹介
概要 4 話すこと • youki: 低レベルコンテナランタイム • libkrun: 動的ライブラリとして提供されているVMM(仮想マシンモニター) •
youkiにlibkrunを組み込み、VM型のコンテナを実現する • 実装や処理方針、通常のコンテナとの違いについて説明する
youki 5 • Rust製のOCI ランタイム(低レベルコンテナランタイム) • runcの代替として開発 • CNCF sandbox
Project のOSS • 低レベルコンテナランタイム
OCIコンテナランタイム 6 • OCI ランタイム ◦ 以下の技術を利用してlinuxのプロセスを隔離する技術 ▪ pivot_root •
ルートファイルシステムを変更してコンテナに独立したファイルシステムを 提供 ▪ cgroup • memory, cpuなどプロセスのリソースを制限する ▪ namespace • mount/pid/net/ipc/uts/cgroupなどを隔離して実行 • コンテナを作成する流れ ◦ Kubelet(Kubernetes) →(CRI)→ 高レベルコンテナランタイム(containerd / CRI-O)→ 低レベルOCIランタイ ム
低レベルコンテナランタイム 7 引用 詳説 OCIコンテナランタイム youki
libkrunとは 8 • RedHatが開発している仮想マシンモニター(VMM) • 動的ライブラリとして提供されている ◦ C API 経由で呼び出すことができる
• コンテナ向けの軽量VMMとして開発 • KVMベースの仮想化を実現する • ユースケース ◦ crun: コンテナに仮想化ベースの分離を実現 ◦ krunkit: macOSでGPU対応の軽量VMを起動
youki x libkrun 9 • コンテナに仮想化(VM)ベースの分離をする • VMベースで仮想化することにより、通常のコンテナより強い分離とセキュリティを実現する モチベーション •
crun ◦ libkrunを利用して各コンテナを VM上で実行できるようにした • youkiへの応用 ◦ ➡crunと同様にyoukiでもlibkrunによるVMレベルでコンテナを分離できないか ? ◦ wasmからrunwasiにつながったように、利用用途は広がるか ? 余談 • runc ◦ 標準のOCI ランタイム • crun ◦ 実験的な機能をどんどん入れていく (wasm, libkrun…)
コンテナ比較 10 • コンテナ ◦ 軽量・高速に隔離された環境を提供する ◦ コンテナはホストとLinuxカーネルを共有 • libkrun
x youki(OCI Runtime) ◦ ホストとカーネルを共有しない ◦ VMでコンテナ単位で隔離 • Kata Container ◦ 別のVM型のコンテナ ◦ ホストとカーネルを共有しない ◦ VMでPod単位でコンテナを隔離
youki でもlibkrunを統合できるか? 11 https://github.com/youki-dev/youki/issues/3196
どうやって実装する? 12 • 参考になるものはたくさんある ◦ crunのlibkrun実装 ◦ youkiのwasm実装
crunの実装 13 • https://github.com/containers/crun • 参照実装: crun/src/libcrun/handlers/krun.c • 判定: annotationsで判断
◦ libkrun統合のコンテナ(libkrun) ◦ 通常のコンテナ(libcrun) • ライブラリ読み込み: libkrun.soをロード • デバイス許可: コンテナから/dev/kvmにアクセス可能に • VM起動 引用: Don’t peek into Container
wasmの実装 14 • youkiでは通常のコンテナ以外にwasmをサポートしている • 既存のワークフローにwasmの実行を組み込むという点で参考にする • executor ◦ youkiでサポートされている実行方式を制御する
◦ 通常コンテナ, wasm, libkrun • 参照実装: • youki/crates/youki/src/workload/wasmedge.rs
PR(未マージ) 15 https://github.com/youki-dev/youki/pull/3234
youki x libkrun ワークフロー 16
処理概要 youki(通常のコンテナ起動) 17 1. (準備) a. ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 2.
youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む 4. コンテナ初期化プロセスをクローン 5. cgroup を作成・適用してリソースを制限する 6. uts/ipc/net/mount/pidなどのnamespace を設定する 7. pivot_rootして新しいルートファイルシステムに切り替える 8. 指定したエントリポイント/コマンドを実行 9. namespace/cgroupで隔離されたプロセスが実行される
18 引用 Design and implementation of youki
libkrunを動かすには? 19 libkrunでVMを起動する単純なコード • libloading ◦ libkrun.soをロード • krun_create_ctx ◦
contextを設定する • krun_set_vm_config ◦ VMのRAMとvCPUを設定する • krun_set_root ◦ ホスト上のディレクトリを VM内のルート設定 • krun_set_log_level ◦ ログを設定する • krun_set_exec ◦ 実行する処理(/bin/sh)を指定 • krun_start_enter ◦ VMを起動する
libkrunを動かす 20 • libkrunでVMを起動する単純なコード • libloading ◦ libkrun.soをロード • krun_create_ctx
◦ contextを設定する • krun_set_vm_config ◦ VMのRAMとvCPUを設定する • krun_set_root ◦ ホスト上のディレクトリを VM内のルート ◦ としてマウント • krun_set_log_level ◦ ログを設定する • krun_set_exec ◦ 実行する処理(/bin/sh)を指定 • krun_start_enter ◦ VMを起動する この処理をコンテナの作成ワークフローの中に組み込む
処理概要 youki(通常のコンテナ起動)(再喝) 21 1. (準備) a. ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 2.
youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む 4. コンテナ初期化プロセスをクローン 5. cgroup を作成・適用してリソースを制限する 6. uts/ipc/net/mount/pidなどのnamespace を設定する 7. pivot_rootして新しいルートファイルシステムに切り替える 8. 指定したエントリポイント/コマンドを実行 9. namespace/cgroupで隔離されたプロセスが実行される
処理概要 (youki x libkrun) 22 既存のyoukiのコンテナ作成プロセスに libkrunの設定、実行プロセスを組み込む 1. (準備) a.
ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 c. libkrun, libkrunfwを配置 2. youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む a. annotationsで判定 "run.oci.handler" = "krun" を指定した場合 libkrun用の処理を実行する 4. libkrun をロードし、コンテキストを作成 a. libkrun.soを読み込み , krun_create_ctxを実行 5. コンテナ初期化プロセスをクローン 6. cgroup を作成・適用してリソースを制限する 7. uts/ipc/net/mount/pidなどのnamespace を設定する 8. pivot_rootして新しいルートファイルシステムに切り替える 9. libkrunのVM起動設定 a. krun_set_vm_config, krun_set_root, krun_set_log_level 10. libkrunのVMを実行 a. krun_start_enter
処理概要 (youki x libkrun) 23 既存のyoukiのコンテナ作成プロセスに libkrunの設定、実行プロセスを組み込む 1. 準備 a.
ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 c. libkrun, libkrunfwを配置 2. youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む a. annotationsで判定 "run.oci.handler" = "krun" を指定した場合 libkrun用の処理を実行する 4. libkrun をロードし、コンテキストを作成 a. libkrun.soを読み込み , krun_create_ctxを実行 5. コンテナ初期化プロセスをクローン 6. cgroup を作成・適用してリソースを制限する 7. uts/ipc/net/mount/pidなどのnamespace をセットアップ 8. pivot_rootして新しいルートファイルシステムに切り替える 9. libkrunのVM起動設定 a. krun_set_vm_config, krun_set_root, krun_set_log_level 10. libkrunのVMを実行 a. krun_start_enter namespace切り替え前にロードしてランタイムの同一プロセス メモリ マップ上にlibkrunとlibkrunfwをのせる 通常のコンテナと同様に config.jsonで指定したエントリポイントを VMで 実行
libkrun実装 24 • libkrun用のexecutorを用意する • config.jsonのannotationsで判定 ◦ libkrun用のexecutorを実行 • executorにlibkrun実行に固有の処理を実装
◦ libkrun.soのロード ◦ krun_*のlibkrunのAPIを実行
libkrun実装 25 • /dev/kvm, cgroup ◦ youki(やcrun)のコンテナ内でlibkrunを実行するにはコンテナ内で /dev/kvmを利用できる必要があ る ◦
youkiで暗黙的にconfig.jsonを変更して、/dev/kvmを利用できるようにdevice, cgroupの設定をする
youki x libkrun 26 • 良い点 ◦ 通常のyoukiのコンテナ作成のワークフローに統合できる ◦ config.jsonのannotationsで通常のコンテナを起動するか、libkrun統合のコンテナを起動す
るか簡単に切り替えることができる ▪ 既存ワークフローを崩さずにVM型隔離を実現できる ◦ コード上も通常の処理とほぼ分離した形で実装をすることができる • 気になる点 ◦ /dev/kvmが必要 ◦ コンテナごとにVMを起動するのでメモリ‧IOなどオーバーヘッドは発⽣する ◦ コンテナ起動が遅くなる可能性 ◦ VM型のコンテナというものを考える必要 ▪ VM型コンテナを作成する過程で脆弱性が出る可能性
youki x libkrun を動かす 27 • ビルド方法 $ ./scripts/build.sh -o
. -r -f libkrun • 準備 • 通常のコンテナと同様にルートファイルシステムを用意する $ mkdir -p tutorial/rootfs $ cd tutorial $ docker export $(docker create busybox) | tar -C rootfs -xvf - • config.jsonを用意する $ youki spec • libkrun用の準備 ◦ kvmが有効であること ◦ libkrunとlibkrunfwがインストールされていること
youkiを動かす(通常) 28 $ youki --debug run -b tutorial/ container 通常のコンテナを実行
youkiを動かす(youki x libkrun) 29 $ youki --debug run -b tutorial/
container libkrun.soをロード libkrun用の設定でコンテナを実行
psコマンド実行 30 通常コンテナ エントリポイントの/bin/bashとpsだけ • ゲストVMのinitプロセス ゲストカーネルスレッド • エントリポイントの/bin/bashとps
プロセス 31 親プロセスから見た youki x libkrun 通常のコンテナ
mount 32 通常のコンテナのmount出力 youki x libkrunで起動したコンテナの mount出力 ルートファイルシステムが virtiofsになっている
今後の展望 33 • crun でも現在でも機能が追加されている ◦ krun: add support for
krun-sev ◦ krun: Add support to run AWS Nitro Enclaves ◦ krun: enable virtio-gpu
今後の課題 34 • パフォーマンスを計測する ◦ 通常のコンテナとどの程度違うのか? ◦ runcと⽐べた場合はどうか? • crunの実装への追随
◦ krun-sev, AWS Nitro Enclaves, virtio-gpu, etc.. • kubernetes上で動かす ◦ 業務レベルで使えるか