micro VM の管理ツール Ignite を試す
概要
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 などが利用できます。
firecracker 単体でも micro VM を作れますが、素の Firecracker では VM やネットワークの設定が結構面倒です。
ignite は、 micro VM の low level な管理には Firecracker を使用しつつ、作成、削除などの high level な操作に関するユーザフレンドリーな管理機能を提供するツールとなっています。特に vm のスペックを yaml で記述できる、docker CLI に近い操作間の CLI を通じて VM 作成、削除などを容易に行える点がメリットとなっています。
実行環境
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 ファイルを用意します。
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 の開発を進めていくようです。
これは 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