仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Ubuntu VMを簡単に作成できるMultipassでmicrok8sやk3sを動かしてみた

CanonicalがMultipassというツールをリリースしていたので触ってみました。

multipass.run

触ろうと思ったきっかけは偶然次のような記事を見つけたためです。

medium.com

Multipassを使ってUbuntu VMを作ってその中でKubernetesとか動かしたら便利っぽいな? ...ということで、早速使ってみました。

ダウンロードとインストール

インストーラーを使って導入する

WindowsやmacOSの場合は、公式のサイトからインストーラーをダウンロードできます。これを使ってインストールします。

macOSでHomebrewを使ってインストールする場合

macOSの場合はHomebrewを使う方法もあるようです。

% brew cask install multipass

Linuxでsnapdを使ってインストールする場合

Linuxの場合はsnapdを使ってインストールできます。Ubuntu 16.04以降のバージョンでは標準でsnapdがインストールされているようですが、 インストールされていない場合は、事前にsnapdをインストールしてから実行します。

% sudo snap install multipass --beta --classic 

デフォルトではWindowsはHyper-V、macOSはAppleのHypervisor、LinuxはLinux KVMがエンジンとして使われるようです。 WindowsやmacOSについては設定を変更するとVirtualBoxをエンジンとして使うことができるようです。

イメージの検索

multipass find を実行すると、インスタンスの起動に使えるイメージを検索できます。

macOSで動かした場合

macOS + Multipass 0.8.0 の組み合わせでは、現在LTS版のUbuntuイメージのみが提供されています。イメージを指定しない場合はltsエイリアスが設定されているUbuntu 18.04イメージが使われます。

% multipass find
Image                   Aliases           Version          Description
snapcraft:core          core16            20191025         Snapcraft builder for Core 16
snapcraft:core18                          20191025         Snapcraft builder for Core 18
16.04                   xenial            20191024         Ubuntu 16.04 LTS
18.04                   bionic,lts        20191021         Ubuntu 18.04 LTS

Ubuntu/CentOS 7で動かした場合

Ubuntu + Multipass 0.8.1 Betaの組み合わせでは、macOS向けMultipassよりも多くのOSイメージが提供されています。Ubuntu Coreが使えるのもポイントです。

~$ multipass find
Image                   Aliases           Version          Description
snapcraft:core          core16            20191025         Snapcraft builder for Core 16
snapcraft:core18                          20191025         Snapcraft builder for Core 18
core                    core16            20190806         Ubuntu Core 16
core18                                    20190806         Ubuntu Core 18
16.04                   xenial            20191024         Ubuntu 16.04 LTS
18.04                   bionic,lts        20191021         Ubuntu 18.04 LTS
19.04                   disco             20191022         Ubuntu 19.04
19.10                   eoan              20191023         Ubuntu 19.10
daily:20.04             devel,focal       20191029         Ubuntu 20.04 LTS

コマンドオプションの一覧について

コマンドオプションの一覧は --help で確認できます。なんとなくオプションはLXDのlxcコマンドやDockerに似ている感じです。

% multipass --help
Usage: multipass [options] <command>
Create, control and connect to Ubuntu instances.

This is a command line utility for multipass, a
service that manages Ubuntu instances.

Options:
  -h, --help     Display this help
  -v, --verbose  Increase logging verbosity, repeat up to three times for more
                 detail

Available commands:
  delete    Delete instances
  exec      Run a command on an instance
  find      Display available images to create instances from
  get       Get a configuration option
  help      Display help about a command
  info      Display information about instances
  launch    Create and start an Ubuntu instance
  list      List all available instances
  mount     Mount a local directory in the instance
  purge     Purge all deleted instances permanently
  recover   Recover deleted instances
  restart   Restart instances
  set       Set a configuration option
  shell     Open a shell on a running instance
  start     Start instances
  stop      Stop running instances
  suspend   Suspend running instances
  transfer  Transfer files between the host and instances
  umount    Unmount a directory from an instance
  version   Show version details

Ubuntuインスタンスの起動

multipass launch コマンドを実行します。OSイメージを指定しない場合は現時点ではUbuntu 18.04 LTSが使われます。

% multipass launch --name foo  
% multipass launch --name bar                                                            
% multipass list
Name                    State             IPv4             Image
bar                     Running           192.168.64.3     Ubuntu 18.04 LTS
foo                     Running           192.168.64.2     Ubuntu 18.04 LTS

コマンドオプションは以下のようなものが使えます。

Options:
  -h, --help           Display this help
  -v, --verbose        Increase logging verbosity, repeat up to three times for
                       more detail
  -c, --cpus <cpus>    Number of CPUs to allocate
  -d, --disk <disk>    Disk space to allocate. Positive integers, in bytes, or
                       with K, M, G suffix. Minimum: 512M.
  -m, --mem <mem>      Amount of memory to allocate. Positive integers, in
                       bytes, or with K, M, G suffix. Mimimum: 128M.
  -n, --name <name>    Name for the instance
  --cloud-init <file>  Path to a user-data cloud-init configuration, or '-' for
                       stdin

例えば次のように実行することで、vCPUとメモリーを指定できます。

% multipass launch --name hoge -c2 -m2G

プロセスについて

macOS版MultipassでUbuntuインスタンスを起動したときに実行されたプロセスは次のような感じでした。macOSではインスタンスの実行にhyperkitが使われているのを確認できます。

% ps aux|grep multipass
root             13398   0.1  1.5  5430308 248528   ??  S    10:48AM   0:14.48 /Library/Application Support/com.canonical.multipass/bin/hyperkit -c 1 -m 1024M -u -A -H -U 37b51d19-4a75-33e4-9b56-f6524f2d51f2 -s 0:0,hostbridge -s 2:0,virtio-net -s 5,virtio-rnd -s 31,lpc -l com1,autopty=/var/root/Library/Application Support/multipassd/vault/instances/bar/pty,log=/Library/Logs/Multipass/bar-hyperkit.log -s 1:0,ahci-hd,file:///var/root/Library/Application Support/multipassd/vault/instances/bar/ubuntu-18.04-server-cloudimg-amd64.img?sync=os&buffered=1,format=qcow,qcow-config=discard=true;compact_after_unmaps=0;keep_erased=0;runtime_asserts=false -s 1:1,ahci-cd,/var/root/Library/Application Support/multipassd/vault/instances/bar/cloud-init-config.iso -f kexec,/var/root/Library/Application Support/multipassd/vault/instances/bar/ubuntu-18.04-server-cloudimg-amd64-vmlinuz-generic,/var/root/Library/Application Support/multipassd/vault/instances/bar/ubuntu-18.04-server-cloudimg-amd64-initrd-generic,earlyprintk=serial console=ttyS0 root=/dev/sda1 rw panic=1 no_timer_check

Ubuntuインスタンスへのアクセス

起動したインスタンスへのアクセスはshellオプションを使ったり、execオプションを使う方法があるようです。インスタンスに導入されているシェルを予測しないでも使えるので、shellオプションのほうが使いやすいと思います。

% multipass shell foo 
% multipass exec foo bash

ちなみに、execの使い方としては主にコマンドをVMで実行して、結果を標準出力するためにつかうようです。

% multipass exec foo -- uname -a
Linux foo 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Ubuntuインスタンスでmicrok8sの導入

インスタンスはハイパーバイザーの違いはあれど仮想マシン上で動いていますので、snapコマンドを使って導入できます。

% sudo snap install microk8s --classic

ただ、ホストの外からのアクセスはできない(NAT接続である)ため、複数台のマシン上でホストしたマシンをクラスター化することはできません。

あまり意味はないかと思いますが、同じマシン上でホストするMultipass VMを用意すれば同じネットワークに繋がるのでクラスター化できます。

Ubuntuインスタンスでk3sによるKubernetesの導入

microk8s同様に、k3sも通常のインストール通りにセットアップ可能です。制限もmicrok8sのときと同様です。

% curl -sfL https://get.k3s.io | sh -

Ubuntuインスタンスにホストパスをマウントする

multipass mountを使うことで、起動したUbuntuインスタンスにホストの任意パスをマウント可能です。 次のようにマウント先を省略した場合は、インスタンスに指定したパスと同じディレクトリーが生成され、マウントできます。このディレクトリー内のファイルについては当然読み書き可能です。

% multipass mount /Users/ytooyama/temp/ foo

次のようにマウント元とマウント先を指定すると、指定したインスタンスのパスにディレクトリーがマウントされてファイルの読み書きが可能になります。

% multipass mount /Users/ytooyama/temp/ bar:/home/multipass/temp

作成したUbuntuインスタンスを片付ける

インスタンスはmultipass deleteコマンドで削除状態にできます。

% multipass delete foo bar
% multipass list
Name                    State             IPv4             Image
bar                     Deleted           --               Not Available
foo                     Deleted           --               Not Available

削除状態のインスタンスはmultipass recoverで復元でき、multipass purgeコマンドで削除状態のインスタンスをすべて消去できます。

% multipass recover foo
% multipass list
Name                    State             IPv4             Image
foo                     Stopped           --               Ubuntu 18.04 LTS
bar                     Deleted           --               Not Available
% multipass start foo

使用感

microk8sを使う場合はデフォルト値よりも多くのCPUとメモリーを割り当てたほうが良いと感じました( multipass launch 実行時にオプションを指定)。一方で、k3sはデフォルトのまま起動しても仮想マシンで動いていることを意識することなく、Kubernetesをデプロイできました。

もともとk3sはかなりスペックが厳しいマシンでも動く設計だからかもしれません。当然ながらどちらを使う場合もデフォルトより多くのメモリーを割り当てたほうが快適に動かすことができます。

今回はKubernetesを動かすためにMultipassをつかいましたが、アプリケーションをちょっと動かしたいときとか、普段使っているOSでは使えないバージョンのソフトウェアを使いたいときとかに役立ちそうに思いました。