KubeVirtを使ってみる
KubeVirtをお試ししてみたので、その際のメモを残しておきます。
KubeVirtとは
KubeVirtはRed Hat社が主に開発している、CNCF MemberプロダクトのOSSです。KubeVirtを使うとKubernetes上で仮想マシンを管理することができるようになります。これによりコンテナよりも隔離レベルの高い仮想マシンを使いながら、KubernetesのCloud Nativeな機能であるPodネットワーク、Service、サービスディスカバリを仮想マシンに対し適用することができるようになります。
KubeVirtのインストール
インストールは至極簡単です。Kubernetesクラスタを用意したら、以下のコマンドを実行するだけです。
export VERSION=v0.11.0 kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/$VERSION/kubevirt.yaml
もし、Workerノードが仮想化支援機構(IntelでいうVT-x)に対応しておらず、ハードウェアエミュレーションを使いたい場合は、事前に以下のコマンドを実行します。
kubectl create configmap -n kube-system kubevirt-config --from-literal debug.useEmulation=true
KubeVirtを使ってみる
KubeVirtで仮想マシンを操作するには、専用のCLIツールであるvirtctl
があると便利です。virtctl
をインストールしましょう。
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/$VERSION/virtctl-$VERSION-linux-amd64 chmod +x virtctl sudo chown root:root virtctl sudo mv virtctl /usr/bin
インストールしたらまずは超軽量OSであるCirrOSを起動してみましょう。仮想マシンオブジェクトをKubernetes上に作成します。
kubectl apply -f https://raw.githubusercontent.com/kubevirt/demo/master/manifests/vm.yaml
kubectl get vm
コマンドを実行すると、以下のような出力が得られると思います。
NAME AGE RUNNING VOLUME testvm 6s false
RUNNIG
がfalse
とあるように、この時点ではまだ仮想マシンは起動していません。起動にはvirtctl
コマンドを使って以下のようにします。
virtctl start testvm
すると、RUNNING
がtrue
に変わります。
NAME AGE RUNNING VOLUME testvm 1m true
実は仮想マシンオブジェクトはコンテナで言うReplicaSet
のようなもので、仮想マシンの起動定義情報が格納されているだけです。実際の仮想マシンのポインタ情報は「仮想マシンインスタンスオブジェクト」に格納されています。仮想マシンインスタンスオブジェクトを一覧するにはkubectl get vmi
コマンドを実行します。
NAME AGE PHASE IP NODENAME testvm 3m Running 10.100.0.6 kubevirt-test-jbsl2irizcpz-minion-1
すると、上記のように仮想マシンの現在の状態やIP情報などを手に入れることができます。
仮想マシンのコンソール画面(CUIベース or GUIベース)にアクセスするには、またvirtctl
コマンドを使います。
virtctl console testvm
virtctl vnc testvm
しかし、Cloudイメージを使う場合、通常パスワード認証できないので、これらのコマンドを使う機会は少ないでしょう。
仮想マシンにSSHログインするにはコンテナと同様に仮想マシンを Service で外部公開する必要があります。これもvirtctl
コマンドで簡単に行なえます。
virtctl expose vm testvm --name testvm --port 22 --type NodePort
kubectl get svc -o wide
すると、確かにNodePort
Serviceが作成されてますね!
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 18m <none> testvm NodePort 10.254.20.5 <none> 22:30296/TCP 64s kubevirt.io/domain=testvm,kubevirt.io/size=small
どこかのNodeの30296
番ポートをsshで突っついてみましょう。ユーザ名はcirros
、パスワードはgocubsgo
です。
ssh -p 30296 cirros@<NodeのIP> $
無事ログインできましたか?
仮想マシンの停止にもvirtctl
を使います。
virtctl stop testvm
仮想マシンの削除にはkubectl delete vm
コマンドです。これを実行すると該当の仮想マシンインスタンスも一緒に消えます。
kubectl delete vm testvm
最後に
いかがでしたでしょうか。仮想マシンの隔離レベルを担保しなくてはいけないけれど、コンテナは使えないといったケースや、コンテナネットワークに仮想マシンを直接繋いでレイテンシを改善したい場合などに使えそうかなと思っています。 時間を見つけて任意の仮想マシンイメージを起動する方法も書こうと思いますので、お楽しみに!