Firecrackerをさわって大量のmicroVMを立ち上げてみた #reinvent
こんにちは、shoitoです。
先日、re:Invent 2018で発表された軽量な仮想環境Firecrackerをさわって大量のmicroVMを立ち上げてみました。
検証環境
- 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つのリポジトリもあったので、次の機会にまとめようと思います。