Firecrackerをさわって大量のmicroVMを立ち上げてみた #reinvent

こんにちは、shoitoです。

先日、re:Invent 2018で発表された軽量な仮想環境Firecrackerをさわって大量のmicroVMを立ち上げてみました。

[速報]AWSのサーバーレス基盤、FirecrackerがOSSとしてリリースされました! #reinvent

Firecracker のデザインについて調べてみた #reinvent

検証環境

  • i3.metal(EC2インスタンス)
  • Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - 64 ビット (x86)

必須要件

  • Linux 4.14+
  • KVM

セットアップ

firecrackerリポジトリにあるGetting Started with Firecrackerに従って進めます。

Firecrackerのバイナリをリリースからダウンロードします。
もちろんBuilding From Sourceに従ってソースからビルドしてもかまいません。

$ curl -L -O https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
$ chmod +x firecracker-v0.11.0

次に検証用のLinuxカーネルイメージ(Alpine)とルートファイルシステムをダウンロードします。

$ 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

次にAppendix A: Setting Up KVM Accessにあるように、KVMのセッティングの確認をします。

$ [ -r /dev/kvm ] && [ -w /dev/kvm ] && echo "OK" || echo "FAIL"
FAIL

ここでOKとならなかったら、現在のユーザーに権限がないので、付与します。

$ ll /dev/kvm
crw-------+ 1 root root 10, 232 11月 29 20:10 /dev/kvm
$ sudo setfacl -m u:${USER}:rw /dev/kvm
$ ll /dev/kvm
crw-rw----+ 1 root root 10, 232 11月 29 20:10 /dev/kvm
$ [ -r /dev/kvm ] && [ -w /dev/kvm ] && echo "OK" || echo "FAIL"
OK

setfacl後、確認するとOKになりました。

Firecrackerとゲストマシンを立ち上げる

準備ができたのでFirecrackerを立ち上げます。

$ ./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock

問題なく立ち上がったら、別のシェルから、ゲストマシンを立ち上げてみます。

まずはゲストカーネルのセッティングします。

$ 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"
    }'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 21:31:57 GMT

次に、ルートファイルシステムをセッティングします。

$ 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
    }'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 21:32:24 GMT

これでゲストマシンの最低限のセッティングはできたので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"
     }'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 21:33:24 GMT

リクエストが正常に受け付けられると、Firecrackerを立ち上げた1つ目のシェルに、一瞬でLinuxのブートログが表示され、ログインできる状態になります。

$ ./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock
[    0.000000] Linux version 4.14.55-84.37.amzn2.x86_64 (mockbuild@ip-10-0-1-79) (gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)) #1 SMP Wed Jul 25 18:47:15 UTC 2018
[    0.000000] Command line: console=ttyS0 reboot=k panic=1 pci=off  root=/dev/vda virtio_mmio.device=4K@0xd0000000:5
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.

...(省略)

Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)

localhost login:
Password:

あとはroot:rootでログインすると、ゲストマシンのAlpine Linuxが使えるようになります。

Welcome to Alpine!

The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org>.

You can setup the system with the command: setup-alpine

You may change this message by editing /etc/motd.

login[855]: root login on 'ttyS0'

試しにCPU情報を見てみるとFirecrackerのデフォルト設定で、1 vCPUであることが分かります。

localhost:~#cat /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) Processor @ 2.30GHz
stepping    : 1
microcode   : 0x1
cpu MHz     : 2299.998
cache size  : 46080 KB
physical id : 0
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat arch_capabilities
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass
bogomips    : 4599.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual

これだけだと、ちょっと物足りないので、Announcing the Firecracker Open Source Technology: Secure and Fast microVM for Serverless Computingで紹介されているように、1000インスタンスのmicroVMも立ち上げてみました。

for ((i=0; i<1000; i++)); do
    ./firecracker-v0.11.0 --api-sock /tmp/firecracker-$i.sock &
done

psコマンドでプロセスを見るとfirecracker-0.sock から firecracker-999.sock で立ち上がっているのが確認できました。

ps ax | grep firecracker | grep -v grep
14598 pts/0    Sl     0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-0.sock
14599 pts/0    Sl     0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-1.sock
14600 pts/0    Sl     0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-2.sock
14602 pts/0    Sl     0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-3.sock

...(省略)

16643 pts/0    Sl     0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-997.sock
16646 pts/0    Sl     0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-998.sock
16647 pts/0    Sl     0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-999.sock

さいごに

さて、これを活かして面白いことができないかなと模索してますが、今回はFirecrackerが爆速で立ち上げられることの確認までです。
Firecracker関連ではfirecracker-microvm Organizationに以下の2つのリポジトリもあったので、次の機会にまとめようと思います。