💥

micro VM の管理ツール Ignite を試す

2023/11/05に公開

概要

micro VM

micro VM とは、コンテナ並に軽量で柔軟性をもちつつ、従来の hypervisor 型 VM と同等の機能を持つような仮想マシンを指します。docker のようなコンテナ技術は docker daemon などのコンテナ管理ツールやホスト側の kernel を他コンテナと共有しているため、そこに問題があると他コンテナにも影響が生じるという点で各環境の分離が不十分という指摘があります。
micro VM ではこの点を解消するため、各環境毎にゲストの kernel を用意し、その上で軽量な仮想マシンを動作させることでカーネルレベルでの分離を実現させる構成となっています。
kata container のサイトにある以下の図がわかりやすいかもしれません。


https://katacontainers.io/learn/ より引用。右が従来のコンテナ技術、左が micro VM

Ignite

ローカル環境で micro VM を動かす場合は AWS 製の OSS Firecracker などが利用できます。

https://github.com/firecracker-microvm/firecracker

firecracker 単体でも micro VM を作れますが、素の Firecracker では VM やネットワークの設定が結構面倒です。

ignite は、 micro VM の low level な管理には Firecracker を使用しつつ、作成、削除などの high level な操作に関するユーザフレンドリーな管理機能を提供するツールとなっています。特に vm のスペックを yaml で記述できる、docker CLI に近い操作間の CLI を通じて VM 作成、削除などを容易に行える点がメリットとなっています。

https://ignite.readthedocs.io/en/stable/

実行環境

Ignite では KVM を使用するため cpu の仮想化機能が必要となります。最近の intel/amd であればだいたい対応しています。
その他に必要な前提条件は Requirements and dependencies に記載されています。
ソフトウェア的な要件は標準的な linux マシンであればだいたい満たせるので、基本的には cpu 仮想化をサポートする linux マシンであればなんでもいいと思います。

cpu 仮想化が有効になっていれば物理マシン、仮想マシンは問わないため、今回は Openstack 上の nested KVM を有効化した仮想マシンを使って動作確認を行いました。

パブリッククラウドの仮想マシンを使用する場合、KVM がサポートされたタイプを使用する必要があります。一覧は Cloud Provider Instances with KVM support を参照。

インストール

基本的にはドキュメントの Ignite installation guide に従って上から順にコマンドを実行すれば ok です。
ignite に関するコンポーネントは ignite daemon (ignited) と ignite CLI があり、いずれも github release からダウンロードします。

export VERSION=v0.10.0
export GOARCH=$(go env GOARCH 2>/dev/null || echo "amd64")

for binary in ignite ignited; do
    echo "Installing ${binary}..."
    curl -sfLo ${binary} https://github.com/weaveworks/ignite/releases/download/${VERSION}/${binary}-${GOARCH}
    chmod +x ${binary}
    sudo mv ${binary} /usr/local/bin
done

micro VM の使用

micro VM の管理は ignite daemon を使う方法もありますが、ignite CLI でだいたいのことは出来るのでこれをメインに使います。

作成

ignite では k8s のマニフェストに近い形式で VM の構成を宣言的に記述できます。まずは Run Ignite VMs declaratively に従って、ubuntuの仮想マシンを作成するための yaml ファイルを用意します。

myvm.yml
apiVersion: ignite.weave.works/v1alpha4
kind: VM
metadata:
  name: myvm
spec:
  image:
    oci: weaveworks/ignite-ubuntu
  cpus: 1
  diskSize: 10GB
  memory: 1024MB
  ssh: [path_to_ssh_publickey]
説明
name VM の名前
image.oci VM に使用するベースのコンテナイメージ
cpus VM に割り当てる vCPU 数
diskSize VM に割り当てるディスクサイズ
memory VM に割り当てるメモリ
ssh VM に ssh で接続する場合、ホスト側の ssh 公開鍵までのパスを指定

作成した構成を元に VM を作成・起動するには ignite run --config [config_file] を実行します。

$ sudo ignite run --config myvm.yml
INFO[0001] Created VM with ID "a53c432b5f46c254" and name "myvm"
INFO[0001] Networking is handled by "cni"
INFO[0001] Started Firecracker VM "a53c432b5f46c254" in a container with ID "ignite-a53c432b5f46c254"

正常に作成されると、sudo ignite ps で起動済みの vm 一覧に追加されます。

$ sudo ignite ps
VM ID                   IMAGE                           KERNEL                                  SIZE    CPUS    MEMORY          CREATED         STATUS          IPS             PORTS   NAME
a53c432b5f46c254        weaveworks/ignite-ubuntu:latest weaveworks/ignite-kernel:5.10.51        10.0 GB 1       1024.0 MB       30s ago         Up 28s          10.61.0.6               myvm

VM には固有の uid と IP address が追加されます。上記では UID: a53c432b5f46c254 が付加され、cni ネットワークプラグインによって IP address 10.61.0.6 が設定されました。

ログイン

作成した VM にログインするには以下の方法があります。

  • sudo ignite attach [vm_name] を実行する。(パスワードでログイン)
  • VM に付加されたアドレスに対して ssh でログインする。(vm 作成時に ssh を有効化している場合のみ有効)

今回は root ユーザで ssh ログインしてみます。

$ ssh -i ~/.ssh/id_rsa root@10.61.0.6
The authenticity of host '10.61.0.6 (10.61.0.6)' can't be established.
ED25519 key fingerprint is SHA256:3rr2q9Z2N7GmPoFEVy7BVYWWevlxTMVDaPmqFt50S/Y.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.61.0.6' (ED25519) to the list of known hosts.
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.10.51 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Sat Nov  4 08:51:09 2023 from 10.61.0.1
root@a53c432b5f46c254:~#

VM 内の環境は基本的には hypervisor VM と同様であり、linux コマンドやパッケージマネージャーによるインストールの他、コンテナ環境では難しいような systemd サービスなど管理や、この環境内でさらに docker コンテナを立てたりすることもできます。

また、構成ファイルで指定した memory, disk が割り当てられていることが確認できます。

root@a53c432b5f46c254:~# dfc
FILESYSTEM (=) USED      FREE (-)  %USED AVAILABLE  TOTAL MOUNTED ON
/dev/root  [==------------------]   8.9%      8.9G   9.8G /
devtmpfs   [--------------------]   0.0%    488.8M 488.8M /dev
tmpfs      [--------------------]   0.0%    491.6M 491.6M /dev/shm
tmpfs      [=-------------------]   0.2%     98.2M  98.3M /run
tmpfs      [--------------------]   0.0%      5.0M   5.0M /run/lock
tmpfs      [--------------------]   0.0%    491.6M 491.6M /sys/fs/cgroup
tmpfs      [--------------------]   0.0%     98.3M  98.3M /run/user/0

root@a53c432b5f46c254:~# free -h
              total        used        free      shared  buff/cache   available
Mem:          983Mi        43Mi       820Mi       0.0Ki       118Mi       810Mi
Swap:            0B          0B          0B

ignite コマンド

ignite CLI は docker CLI に使用感が近く、VM に対して主に以下のようなことができます。

command 説明
ignite attach [vm_name] vm にログインする
ignite create --config [config_file] config ファイルから VM を作成する
ignite start [vm_name] VM を起動する
ignite run --config [config_file] VM を作成 + 起動する。create, start を一度に行うコマンド。
ignite rm [vm_name] -f VM を削除する。VM は停止してからでないと削除できないが、-f, --force を付けることで強制的に削除する。
ignite image ローカルに存在する VM 用のイメージを一覧表示する。見た感じ containerd, firecracker namespace のイメージ一覧を表示しているっぽい。

一覧

Usage:
  ignite [command]

Available Commands:
  attach      Attach to a running VM
  completion  Output bash completion for ignite to stdout
  cp          Copy files/folders between a running vm and the local filesystem
  create      Create a new VM without starting it
  exec        execute a command in a running VM
  help        Help about any command
  image       Manage base images for VMs
  inspect     Inspect an Ignite Object
  kernel      Manage VM kernels
  kill        Kill running VMs
  logs        Get the logs for a running VM
  ps          List running VMs
  rm          Remove VMs
  rmi         Remove VM base images
  rmk         Remove kernels
  run         Create a new VM and start it
  ssh         SSH into a running vm
  start       Start a VM
  stop        Stop running VMs
  version     Print the version of ignite
  vm          Manage VMs

Flags:
  -h, --help                   help for ignite
      --ignite-config string   Ignite configuration path; refer to the 'Ignite Configuration' docs for more details
      --log-level loglevel     Specify the loglevel for the program (default info)
  -q, --quiet                  The quiet mode allows for machine-parsable output by printing only IDs

network について

デフォルトでは CNI がネットワークプラグインとして使用され、VM が作成された際に 10.61.0.0/16のレンジからアドレスが割り当てられます。
これはあくまでローカルアドレスであるため外部から VM に対して ssh することはできません(外部 -> host -> VM の多段 ssh のようなホストを経由するログインは可能)。

CNI の他に k8s で使用するようなネットワークプラグインも使用することができます。詳細は https://ignite.readthedocs.io/en/stable/networking/ を参照。

image について

ignite の VM で使用されるイメージは hypervisor VM で使用されるようなイメージファイルではなく、docker 等で使用するコンテナイメージを流用する形式となっています。ドキュメントの手順で記載されている weaveworks/ignite-ubuntu も dockerhub 上にあるものが使用されています。
使用できるイメージの種類は https://github.com/weaveworks/ignite/tree/main/images にあり、alpine や rockylinux などの主要な distribution が選択できます。

また、上記の github 上で Dockerfile の中身が確認できるため、これをベースに独自のイメージを作成して VM に使用することもできます。
なお ignite で使用されるイメージは containerd の firecracker namespace に保存されるため、独自イメージを作成する際も namespace を指定してビルドする必要があります。

$ sudo nerdctl -n firecracker image ls
REPOSITORY                      TAG        IMAGE ID        CREATED          PLATFORM       SIZE         BLOB SIZE
my-ubuntu                       latest     561e87541418    8 seconds ago    linux/amd64    247.6 MiB    79.9 MiB
weaveworks/ignite-kernel        5.10.51    c1d99eafa5b2    9 hours ago      linux/amd64    71.3 MiB     15.0 MiB
weaveworks/ignite-rockylinux    latest     5283a6043412    6 hours ago      linux/amd64    254.0 MiB    85.6 MiB
weaveworks/ignite-ubuntu        latest     11550e0912d2    9 hours ago      linux/amd64    248.8 MiB    78.1 MiB
weaveworks/ignite               v0.10.0    b8cc53c5cba8    9 hours ago      linux/amd64    36.7 MiB     16.5 MiB

補足

ここまで書いておいて何ですが、ignite の github レポジトリは 2023/8/29 にアーカイブされています。

Deprecated
This repository is no longer maintained. For a more up-to-date way to manage microVMs, please take a look at Flintlock.

今後は micro VM の管理ツールとして flintlock の開発を進めていくようです。

https://github.com/weaveworks-liquidmetal/flintlock

これは micro VM で k8s クラスタを構成するという weaveworks の Liquid Metal プロジェクトに使われています。最初のリリースが 2021/10/30 であることから比較的歴史が浅く、ドキュメントでも coming soon となっているページが多いですが、今後の動向が期待されます。

おわりに

firecracker による micro VM は hyperviosr VM とコンテナのハイブリッドのいいところ取りのような環境ですが、VM を作る際の設定が面倒という点があります。
ignite を使うとその面倒な作業を任せることができ、VM のスペックを決める yaml と VM イメージを用意するぐらいで気軽に VM が起動できるのが一番のメリットであると思いました。
また、linux マシン上で仮想マシンを起動する方法は virsh (libvirt) や openstack 等がありますが、いずれも準備がわりと面倒であるので気軽に仮想マシンを試せる環境が作れる点も良さそうです。
また、今後は ignite の代わりに flintlock が開発されていくことから、flintlock の機能充実も期待されます。

Discussion