🚀 Kubernetes上でVMを動かす?KubeVirtで“仮想マシン再発見”してみた話
🧠 はじめに
Kubernetesといえば「コンテナを動かすためのオーケストレーター」。
しかし最近は、そのKubernetes上で仮想マシンを動かすことが注目されています。
その技術的中心にあるのが KubeVirt です。
本記事では、KubeVirt を使って Kubernetes クラスタ上で VM を起動し、cloud-init を使って Ubuntu VM に nginx を自動展開するところまでをわかりやすく紹介します。
🌍 なぜ Kubernetes 上で VM?
"仮想マシンはもうコンテナで置き換えられる"と思われがちですが、実際の現場はそんなに簡単ではありません。
以下のようなケースでは VM が必須です:
🛠 レガシーな商用ソフト (systemd 依存や特定ライブラリ必須)
📆 特定OS上でしか動作しないアプリケーション
🧪 研究やテストでフルOS環境が欲しい
🔐 コンテナでは保証できないセキュリティ・カーネル管理
🥉 KubeVirtとは?
KubeVirt は Kubernetes の CRD (独自のリソース)を使って、仮想マシン (VM)を Pod のように操作できるようにする拡張機能です。
内部的には libvirt + QEMU + Kubernetes API を統合しています。
特徴
仮想マシンを YAML で管理
CNI/ストレージなど Kubernetes の基盤技術を残らず使用
Pod と同じようにスケジュールされる
🔧 KubeVirt の実装手順
1. オペレーターのインストール
kubectl create -f https://github.com/kubevirt/kubevirt/releases/latest/download/kubevirt-operator.yaml
kubectl create -f https://github.com/kubevirt/kubevirt/releases/latest/download/kubevirt-cr.yaml
2. Ubuntu VM (nginx付き) のデプロイ
vim kubevirt-vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: ubuntu-vm
namespace: default
spec:
runStrategy: Always
template:
metadata:
labels:
kubevirt.io/domain: ubuntu-vm
spec:
domain:
devices:
disks:
- name: containerdisk
disk:
bus: virtio
- name: cloudinitdisk
disk:
bus: virtio
resources:
requests:
memory: 1024Mi
cpu: "1"
volumes:
- name: containerdisk
containerDisk:
image: quay.io/containerdisks/ubuntu:22.04
- name: cloudinitdisk
cloudInitNoCloud:
userData: |
#cloud-config
users:
- name: ubuntu
plain_text_passwd: ubuntu
lock_passwd: false
sudo: ['ALL=(ALL) NOPASSWD:ALL']
shell: /bin/bash
ssh_pwauth: true
disable_root: false
chpasswd:
expire: false
kubectl apply -f kubevirt-vm.yaml
ポイント:cloud-init を使ってユーザー/パスワードを作らないと、コンソールからはログインできません。
3. VMの確認 & 接続
1. ステータス確認
kubectl get vm -n default
kubectl get vmi -n default
2. virtctl コマンドのインストール
VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | grep tag_name | cut -d '"' -f 4)
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-linux-amd64
chmod +x virtctl
sudo mv virtctl /usr/local/bin/
3. コンソール接続
virtctl console ubuntu-vm -n default
そして、次のようにログイン:
ubuntu login: ubuntu
Password: ubuntu
成功すると Ubuntu のテキストログインに入れます。
📖 参考リンク
KubeVirt 公式ドキュメント
NGINX公式: Content Caching
✍️ おわりに
KubeVirt は Kubernetes の基盤技術の利点を保ちつつ、VMの音も好きも取り入れられる便利な技術です。
例えば CDN/エッジ計算/レガシー資産を活用したインフラなど、Pod のみでは難しかった環境構築が、KubeVirt によって Kubernetes 上で簡単に実現できるようになります。さらにknative等と組み合わせれば、kubernetesでECSのようなクラウド基盤の構築も実現が可能となります。