はじめに
最近、運営している Minecraft サーバーで新規に開発者を迎え入れました。
これを機に作成した成果物をすぐに公開できる環境があると良いなぁと思い、構築済みの ProxmoxVE クラスタへ最小限の労力で VM インスタンスをデプロイできないかと Cloud-Init に挑戦してみました。
環境
ProxmoxVE: 9.1.9
VM インスタンスの OS: Ubuntu Server 26.04
手順
Proxmox で Cloud-Init によって VM インスタンスを作成するにはいくつかの準備が必要になります。
主に
- OS のクラウドイメージの取得
- VM のテンプレート作成
- スニペットファイルの作成 (様々な部分をカスタマイズしたい場合のみ)
- VM テンプレートのクローン
- Cloud-Init の実行
となります。
クラウドイメージの取得
Cloud-Init を利用して VM を作成する際には、通常の VM インスタンス作成時に利用するインストーラー付きイメージとは異なる「クラウドイメージ」を利用する必要があります。
Linux 系であれば各ディストリビューション公式が用意していると思います。
今回は Ubuntu 26.04 のクラウドイメージを利用します。
上記のサイトから適切なイメージをダウンロードします。
ファイル名は <リリース名>-server-cloudimg-<アーキテクチャ>.<拡張子> となっています。
特別の理由がない限り Proxmox では QCow2 形式の .img ファイルを利用するのが良いと思います。
アーキテクチャは Proxmox を載せているマシンの CPU に合わせます。
私の Proxmox インスタンスのアーキテクチャはすべて amd64 ですが、モダンとは言い難い CPU を載せたノードが存在するので amd64v3 ではなく amd64 を選びました。
(一般的に 2015 年以降に発売された amd64 アーキテクチャ CPU であれば amd64v3 を選ぶとパフォーマンス向上が見込めるそうです)
最終的に選んだファイル名は resolute-server-cloudimg-amd64.img となりました。
このファイルをダウンロードして呼び出しやすい場所においておきます。
(どこにおいても良いですが、コマンドで呼び出す際に配置したパスを打ち込むので分かりやすいところが良いです)
VM テンプレートの作成
取得したクラウドイメージを適用した VM インスタンスを作成し、それをテンプレートへ変換するのですが、そこで1つやらなければいけない作業があります。
今回のような仮想化環境ではホストマシンがゲストマシンにアクセスするため QEMU Guest Agent というソフトウェアが必要になります。
このソフトウェアがインストールされており自動起動するように設定された VM でなければ、のちのち Cloud-Init で一部の設定を適用することができません。
そのため、このソフトウェアをクラウドイメージを適用した VM インスタンスへインストールする作業が必要になります。
まずは以下のコマンドで VM を作成します。
qm create <VM 番号> --memory <メモリサイズ (MB)> --net0 virtio,bridge=<ブリッジ名> --scsihw virtio-scsi-pci
ここでの <VM 番号> は VM インスタンスの番号です。 (例: 9000)
そして以下のコマンドで起動とソフトウェアインストールに必要な最低限の設定を行います。
qm set <VM 番号> --scsi0 <ディスク名>:0,import-from=<.img ファイルのパス>
qm resize <VM 番号> scsi0 <ディスクサイズ (例: 32G)> # やらなくてもよいがやったほうが良い
qm set <VM 番号> --ide2 <ディスク名>:cloudinit
qm set <VM 番号> --boot order=scsi0
qm set <VM 番号> --serial0 socket --vga serial0
qm set <VM 番号> --ipconfig0 ip=dhcp
qm set <VM 番号> --agent enabled=1
qm set <VM 番号> --ciuser user
qm set <VM 番号> --cipassword password
2 回目以降の qm set ... は引数部分を結合して 1 つのコマンドとして実行することもできます。
上記コマンドでの <ディスク名> は Proxmox の WebUI にある Datacenter -> Storage で確認することができるもののうち、 Content 列に Disk image が含まれているディスクの ID になります。
(local, local-lvm や CephPool-1 など)
上記のコマンドを打ち込んで作成された VM インスタンスの設定を見て、各項目が設定されていれば qm start <VM 番号> もしくは WebUI から起動します。
ユーザー名: user, パスワード: password を設定したのでそれらを入力して VM へログインします。
(ここで指定したユーザー名やパスワードなどの情報は Cloud-Init の実行時に上書きすることができます)
ログインしたら apt update && apt upgrade でパッケージの更新をしてから以下のコマンドを実行します。
sudo apt install qemu-guest-agent
sudo systemctl start qemu-guest-agent
sudo systemctl enable qemu-guest-agent
sudo cloud-init clean
上記のコマンドにより、 QEMU Guest Agent が自動起動する VM を作成することができました。
ここまで設定したら VM をシャットダウンします。
完全に停止したことを確認したら qm template <VM 番号> の実行、もしくは WebUI からの操作によって VM インスタンスをテンプレートへ変換します。
スニペットファイルの作成
Proxmox では Cloud-Init の User Data と呼ばれる設定ファイルをスニペット(ファイル)と呼びます。
このファイルにはユーザーの設定、パッケージインストール、コマンドの実行など Cloud-Init によって行われる設定を記述します。
詳細なフォーマットなどは以下のリンク先を参照してください。
Proxmox では VM 作成時とマイグレーション時にこのファイルを参照できない場合、それぞれの操作がキャンセルされます。
そのため複数台のノード間でマイグレーションなどを行う環境では、すべてのマシンからアクセスできる共有ストレージに配置することをおすすめします。
VM テンプレートのクローン
Cloud-Init を利用して初期設定を行う VM インスタンスは、ここまでの手順で作成した VM テンプレートをクローンすることによって作成します。
qm clone <VM テンプレート番号> <新規作成 VM 番号> --name <VM 名>
を実行します。
(--name は設定しなくても作成可能です。その場合は VM <新規作成 VM 番号> という名前になります)
作成した VM インスタンスで Cloud-Init を実行するにはもう少し準備を行う必要があります。
テンプレート作成時に設定したユーザー名、パスワード、ネットワーク設定などを上書きするには、ここでも qm set <新規作成 VM 番号> --ciuser <ユーザー名> ... のようにコマンドを実行します。
またスニペットファイルを適用する場合には qm set <新規作成 VM 番号> --cicustom "vendor=<スニペットファイルのパス>" を実行します。
--cicustom ... については以下のリンクを参照してください
Proxmox wiki Cloud-Init (cicustom)
ここまでの設定を適用することができたら qm cloudinit update <新規作成 VM 番号> を実行して、追加した設定を適用します。
Cloud-Init を実行する
ここまで設定を適用してきた VM を立ち上げます。
色々設定されます。やったぁ
おわりに
スクリプトを作成して開発者からもらった SSH 公開鍵などいくつかのパラメータを設定するだけで VM インスタンスが生えてくる環境を作れました。
とっても嬉しい。
外部からのアクセスに Cloudflare Tunnel を利用したり、内部からの IP アドレス変更を受け付けないようにするため Proxmox 側で FW を設定するなど色々したのでそれも記事にしたいと思います。