FirecrackerによるMicroVMのデプロイ:超軽量で瞬時に起動する仮想マシン

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

従来の仮想マシンにおける「リソース食い」という悩み

数十台のVMによってRAMが使い果たされる光景は、SysAdminにとって古典的な悩みです。VMwareやKVMを使ったことがあるなら、仮想マシン(VM)の起動を数分間待つことには慣れているでしょう。実際、従来のVMは、不要な仮想化ハードウェアドライバを実行するためだけに、少なくとも1〜2GBのRAMを消費することがよくあります。

隔離された環境で短いスクリプトをテストしたいだけなのに、この待ち時間は非常にストレスが溜まります。すぐに作業を始める代わりに、テンプレートをクローンし、起動を待ち、ようやくSSHで接続できるのです。このプロセスには通常、貴重な2〜5分が費やされます。駆け出しのエンジニアなら、「VMのようなセキュリティと、Dockerのような軽快さを両立する方法はないのか?」と疑問に思うことでしょう。

なぜコンテナや従来のハイパーバイザでは不十分なのか?

この問題を解決するには、旧技術の限界を理解する必要があります。QEMUのようなハイパーバイザは、サウンドカードからキーボードまで、あらゆるものをエミュレートするように設計されています。クラウドネイティブな環境では、これらは完全に不要です。私たちに必要なのは、コードを実行するためのカーネルとCPU/RAMリソースだけです。

一方、Dockerは非常に軽量ですが、ホストマシンとカーネルを共有します。これは大きなセキュリティリスクです。もしコンテナがハックされれば、攻撃者はサーバー全体の制御権を奪う可能性があります。マルチテナンシー環境において、この脆弱性は許容できません。そこで、私たちが求めているのは、その中間に位置するソリューションです。すなわち、VMのセキュリティ + コンテナのスピードです。

Firecracker — AWS Lambda帝国を支える技術

Firecrackerは、AWSチームによって開発されたオープンソースプロジェクトです。これは、AWS Lambdaが毎日数十億のリクエストを処理するための「心臓部」となっています。すべてをエミュレートする代わりに、FirecrackerはLinuxオペレーティングシステムを実行するために最低限必要なものだけを提供します。

最大の利点はそのスピードです。MicroVMはわずか125ミリ秒で起動します。特に、オーバーヘッドのためのRAM消費は約5MBに過ぎません。そのおかげで、32GBのRAMを搭載したサーバー上で、ボトルネックを心配することなく、数百、さらには数千のMicroVMを同時に実行できます。

技術面: FirecrackerはKVMを使用していますが、QEMUをRustで書かれたVirtual Machine Monitor (VMM)に置き換えています。この言語により、メモリ安全性と極めて高いパフォーマンスの両立を実現しています。

LinuxでのFirecrackerの実践的なデプロイ手順

まず、Linuxマシン(Ubuntu 22.04を推奨)とハードウェア仮想化をサポートするCPUが必要です。BIOSでIntel VT-xまたはAMD-V機能が有効になっていることを確認してください。

ステップ 1: KVMへのアクセス権の確認

まず、Firecrackerがハードウェアとやり取りできるように、/dev/kvm ファイルへの書き込み権限があることを確認します。

[ -r /dev/kvm ] && [ -w /dev/kvm ] && echo "準備完了" || echo "エラー:KVMの権限を確認してください"
sudo chmod +x /dev/kvm # 必要に応じて権限を付与

ステップ 2: Firecrackerバイナリのダウンロード

GitHubからビルド済みのバイナリをダウンロードするのが最も早い方法です。現在、バージョンv1.7.0が非常に安定して動作しています。

release_url="https://github.com/firecracker-microvm/firecracker/releases/download/v1.7.0"
arch=`uname -m` 
wget ${release_url}/firecracker-v1.7.0-${arch} -O firecracker
chmod +x firecracker
sudo mv firecracker /usr/local/bin/

ステップ 3: カーネルとRootfsの準備

BIOSがないため、Firecrackerでは Linuxカーネルファイルとシステムファイルを直接指定する必要があります。AWSが提供している最小構成のファイルを使用して、素早くテストできます。

# カーネルをダウンロード(不要なドライバを削除済み)
wget https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/x86_64/kernels/vmlinux.bin

# Rootfsをダウンロード(サイズはわずか数十MB)
wget https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/x86_64/rootfs/hello-rootfs.ext4

ステップ 4: REST APIによるMicroVMの制御

Firecrackerの興味深い特徴は、GUIがないことです。Unixソケットを介してREST APIで通信します。これは自動化スクリプトを書くのに非常に便利です。

1つ目のターミナルを開き、ソケットを起動します:

rm -f /tmp/firecracker.socket
firecracker --api-sock /tmp/firecracker.socket

2つ目のターミナルを開き、curl を使って設定を行います:

# 1. カーネルの宣言
curl --unix-socket /tmp/firecracker.socket -X PUT \
  'http://localhost/boot-source' \
  -H 'Content-Type: application/json' \
  -d '{
        "kernel_image_path": "vmlinux.bin",
        "boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
    }'

# 2. ディスク構成
curl --unix-socket /tmp/firecracker.socket -X PUT \
  'http://localhost/drives/rootfs' \
  -H 'Content-Type: application/json' \
  -d '{
        "drive_id": "rootfs",
        "path_on_host": "hello-rootfs.ext4",
        "is_root_device": true,
        "is_read_only": false
    }'

# 3. 起動コマンド
curl --unix-socket /tmp/firecracker.socket -X PUT \
  'http://localhost/actions' \
  -H 'Content-Type: application/json' \
  -d '{"action_type": "InstanceStart"}'

最後のコマンドでEnterキーを押すとすぐに、1つ目のターミナルを確認してください。ログイン画面がほぼ瞬時に表示されるはずです。デフォルトのユーザー名/パスワード root/root でログインします。

Firecrackerを運用して得られた教訓

Proxmoxを使ったホームラボでの運用経験から、一つ言えることがあります。それは、Firecrackerはカーネルに対して非常に「偏食」であるということです。Ubuntuから適当な vmlinuz ファイルを持ってきても動作しません。広告通りのミリ秒単位の速度を実現するには、特定のフラグを指定してカーネルを自前でコンパイルする必要があります。

次にネットワークの問題です。FirecrackerはTAPインターフェースを使用します。MicroVMをインターネットに接続するには、ホストマシン上のBridgeやIP Tablesに関する知識が必要です。初心者の場合は、複雑なネットワーク部分に飛び込む前に、まずはAPIを介したリソース管理をマスターすることに集中してください。

プロジェクトで数千のテストケースを実行するCI/CDシステムが必要な場合や、独自のFaaS(Function as a Service)プラットフォームを構築したい場合、Firecrackerは強力な武器になります。失敗を恐れないでください。ソケットを壊しては作り直すことを繰り返せば、すぐに上達するはずです。

Share: