2019年1月21日月曜日

firecracker 超入門

概要

firecracker は Amazon がオープンソースで開発しているサーバレスアーキテクチャを実現するための軽量 VM です
firecracker 上で動作する microVM を使ってサーバレスアーキテクチャを実現します
今回は firecracker のインストールから microVM の起動まで試してみました

環境設定

  • Ubuntu 16.04.2 LTS (kernel 4.4.0-62-generic)
  • libvirt 1.3.1-1ubuntu10.24
  • firecracker 0.13.0

VM 設定変更

今回は Ubuntu16.04 上に KVM をインストールして KVM を使って firecracker を動作させます
本来であれば物理サーバ上にインストールした Ubuntu が必要なのですが、なかったので ESXi 上に構築した Ubuntu を使いました
仮想化の上に仮想化環境を構築するので Nested Virtulazation の設定が必要になります
ESXi であれば作成した Ubuntu の VM の設定から「Expose hardware assisted virtualization to the guest」のチェックをオンにすれば OK です
この設定は VM が停止している状態でないとできないのでご注意ください
firecracker1.png

KVM インストール

まずは KVM をインストールします
すでに KVM が動作する環境がある方は飛ばしてもらって OK です

  • sudo apt -y install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
  • sudo setfacl -m u:${USER}:rw /dev/kvm
  • grep -c '(vmx|svm)' /proc/cpuinfo

0 以上になっていることを確認しましょう

  • kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

最終的に kvm-ok の結果が上記のようになっていれば OK です

firecracker インストール

firecracker は Github 上でバイナリで配布されています
ダウンロードして PATH 上に配置すれば完了です
バージョンの部分は適宜変更して最新版をインストールしてください

  • curl -LOJ https://github.com/firecracker-microvm/firecracker/releases/download/v0.13.0/firecracker-v0.13.0
  • `mv firecracker-v0.13.0 firecracker
  • chmod +x firecracker
  • sudo mv firecracker /usr/local/bin/
  • firecracker --version

firecracker API 起動

それでは起動してみましょう
firecracker は socket 通信を使って API サーバを起動させることで使えるようになります

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

microVM 起動

API サーバが起動したらコールしてみます
作成された socker ファイルを使って API サーバと通信します
その前に firecracker で microVM を起動するのに必要なイメージファイルとディスクファイルをダウンロードします
Getting started 用のイメージファイルとディスクファイルがすでに準備されているのでそれを使います (中身は Alpine Linux)

  • 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

これを使って API をコールします
まずはイメージを使って boot-source を作成します

curl --unix-socket /tmp/firecracker.socket -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"
}'

次にディスクファイルを使って rootfs を作成します

curl --unix-socket /tmp/firecracker.socket -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
}'

最後にマシンのスペックを決定します
CPU およびメモリサイズを指定します

curl --unix-socket /tmp/firecracker.socket -i \
-X PUT 'http://localhost/machine-config' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
  "vcpu_count": 1,
  "mem_size_mib": 512
}'

あとは InstanceStart アクションを使って microVM を起動するだけです
さらっとやっていますが firecracker はこんな感じで REST API を使って microVM を操作します

curl --unix-socket /tmp/firecracker.socket -i \
-X PUT 'http://localhost/actions' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
  "action_type": "InstanceStart"
}'

各 API のレスポンスですが基本 204 No Content が返ってきました
何もしていないかと思うくらいレスポンスが早いですが大丈夫です
InstanceStart すると firecracker API を動作させていたターミナルでログインプロンプトが動作します
root/root で microVM の Alpine Linux にログインすることができます
firecracker2.png

作成した各リソースは以下のように GET をコールすることで取得できます (以下は machine-config を取得しています)

curl -s --unix-socket /tmp/firecracker.socket  \
-X GET 'http://localhost/machine-config' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json'

microVM 停止

これがよくわかりませんでした
API でできるらしいのですがやり方がわからず断念しました
InstanceStop というアクションがあるかなーと思いコールしてみたのですがそんなアクションはないと言ってエラーとなりました
テストだったので自分は firecracker のプロセスを kill して socker ファイルを削除することで microVM も停止しました

firectl という専用の CLI があるのでこれでできないかなーと思ったのですがコマンドがなくダメでした

最後に

KVM 上で firecracker を試してみました
KVM 環境があればサクッと試すことはできるようです
同じレイヤーのソフトウェアとしては Virtualbox や VMware Fusion などがあります
特徴としては高速かつセキュアに軽量な VM が起動できる点かなと思います

firecracker は起動したい microVM ごとに firecracker プロセスを起動させます
そしてアクセスする場合にはそれぞれのプロセスごとに作成された socker ファイルを使うので microVM ごとにサンドボックスになっているのでセキュアなのかなと思います

これからの成長と具体的なユースケースの登場に期待かなと思います

参考サイト

0 件のコメント:

コメントを投稿