Firecracker 0.11でmicroVMを試してみた
1.概要
microVMのFirecrackerを試しました。AWS Fargateで利用されている技術です。
loginできないDocker Container環境だと認識していましたが、
正しい内容とその仕組みを知る機会となりました。この内容を記述します。
2.詳細
下記資料がすべてを示しています。
Firecracker
https://firecracker-microvm.github.io/
KVM環境の上に、microVMを複数動作させ、そこでContainerを動かす仕組みのようです。
実際にmicroVMを起動すると100MB程度のメモリで動作しています。
試験環境はIntel i3, Memory 16GB, SSD 256GB, LinuxMint 22.3を利用しました。
手順は上記URLの下の方の下記部分にあります。
Announcing the Firecracker Open Source Technology
手順の記述内容に一部誤り(curl -L => curl -L -Oなど)があり、
下記参考資料を参照して実行します。
私はhome dicrectoryにfirecracker directryを作成して作業しました
Firecrackerをさわって大量のmicroVMを立ち上げてみた
https://dev.classmethod.jp/articles/reinvent2018-try-firecracker/
また、LinuxMint 22.3は/dev/kvmの権限設定は既定値で設定済みでした。
(1) firecrackerのdownload
curl -L -O https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
chmod +x firecracker-v0.11.0
(2) Linux kernelとroot filesystemのdownload
curl -fsSL -o hello-vmlinux.bin https://s3.amazonaws.com/spec.ccfc.min/img/hello/kernel/hello-vmlinux.bin
curl -fsSL -o hello-rootfs.ext4 https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4
(3) LinuxMint 22.3は/dev/kvmの権限設定は既定値で設定済みで、OKになります
[ -r /dev/kvm ] && [ -w /dev/kvm ] && echo "OK" || echo "FAIL"
(4) Firecracker起動
./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock
(5) ゲストカーネルのセッティング
ここからは別のterminalで作業です
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/boot-source' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"kernel_image_path": "./hello-vmlinux.bin",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
}'
(6) ルートファイルシステムをセッティング
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/drives/rootfs' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"drive_id": "rootfs",
"path_on_host": "./hello-rootfs.ext4",
"is_root_device": true,
"is_read_only": false
}'
(7) InstanceStartアクション
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/actions' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"action_type": "InstanceStart"
}'
(8) login
最初のterminalでmicroVMが起動され、loginできます。
User/Passwordはroot/rootです
(9) 停止
login状態でrebootコマンドを入力すると終了します
(10)複数起動
MAX=1000
echo "$MAX"
for NUM in $(seq 1 ${MAX})
do
echo "$NUM"
./firecracker-v0.11.0 --api-sock /tmp/firecracker-${NUM}.sock &
done
不安だったので、10, 100, 1000と順番にチャレンジしました。
1000個起動しても何も問題起きません。
Memoryも大量消費することなく、単にプロセスが定義されただけの状態のようです。
しかし、一度プロセス起動をすると、rebootしないと次の試験はできません。
限界挑戦で10000を指定すると、9806でPanic occurredで終了
9805
9806
[:ERROR:src/main.rs:50] Panic occurred: PanicInfo { payload: Any, message: Some(VMM thread spawn failed.: Os { code: 11, kind: WouldBlock, message: "Resource temporarily unavailable" }), location: Location { file: "libcore/result.rs", line: 1009, col: 5 } }
参考
AWS Fargateについて深掘りしてみた
https://qiita.com/miyar2306/items/4ef892cd0dfc7927a88a
Firecrackerをさわって大量のmicroVMを立ち上げてみた
https://dev.classmethod.jp/articles/reinvent2018-try-firecracker/
コメント
コメントを投稿