仮想化通信

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

KubeVirtをマルチノードクラスターで利用する

これまで本ブログではKubeVirtを何回か取り上げてきましたが、今回はマルチノードのKubernetesクラスターでKubeVirtを動かしてみます。

まずKubeadmでKubernetesのマルチノードクラスターを作る

KubeVirtをセットアップする前に、公式のドキュメントなどを参考にKubeadmなどでクラスターを作成します。

以下は概要をセットアップする順に並べています。

ランタイムのインストール

まだ1.21なので、一番使い慣れているDockerを選択しました(が、containerdでもCRI-Oでも動くと思います。手元環境で動かせているのは他にCRI-Oの構成です)。

Kubernetesツールのインストール

kubeadm, kubelet, kubectlを、以下に従って導入します。

クラスターの作成

いつもの流れでセットアップします。

  1. Masterでkubeadm initを実行
  2. Workerでkubeadm joinを実行
  3. Masterでkubectl taint nodes --all node-role.kubernetes.io/master-を実行(masterノードもスケジューリングする)

今回の例は3台で構成します。4台用意できるのであればMasterノード1台、Workerノード3台の構成の構成にして、Masterノードで1を、Workerノードで2を実行します(3は実施する必要はありません)。

なぜここで3台スケジューリングできるノードを用意したかというと、ストレージとしてLonghornを使おうと考えたからです。

Kubernetesにアドオンを追加

構築したKubernetesにネットワークとストレージ機能を追加します。

CNIのセットアップ

今回はCalicoを使います。手順は以下の通りです。

ストレージのセットアップ

KubeVirtではなんらかのストレージが実質要件になっています。シングルノードではLocal Path Provisionerというストレージを使いましたがマルチノードでは適切ではないため、今回はLonghornのバージョン1.1.1を使いました。

セットアップ方法はいくつかありますが、kubectlを使ってデプロイする方法でインストールします。Longhorn Dashboardはオプションであるため、今回はセットアップを省略します。

KubeVirtを導入する

Kubernetesにネットワークとストレージが用意できたら、次にKubeVirtをセットアップします。

KubeVirtのセットアップとVM作成

ここは以前記事にしましたので、そちらを参照ください。

マルチノードクラスターでKubeVirtを使ってみる

以下の記事の後半で、CDIでVMイメージボリュームを作成する方法と、仮想マシンを作成する方法を取り上げています。それに従ってイメージと仮想マシンを作成します。以下はいくつかの仮想マシンを作成済み前提で、動作をチェックしてみたいと思います。

動作をチェック

次を実行するとノードの状態が確認できます。

$ kubectl get no
NAME              STATUS   ROLES                  AGE   VERSION
bay10-gen9.maas   Ready    <none>                 61m   v1.21.1
bay13-gen9.maas   Ready    <none>                 61m   v1.21.1
bay5-gen9.maas    Ready    control-plane,master   64m   v1.21.1

次はKubeVirtプロセスの状態です。

$ kubectl get po -n kubevirt
NAME                              READY   STATUS    RESTARTS   AGE
virt-api-f8cddd7bd-c57h9          1/1     Running   0          49m
virt-api-f8cddd7bd-m4f27          1/1     Running   1          49m
virt-controller-68bc589cf-clvxb   1/1     Running   2          49m
virt-controller-68bc589cf-vgskz   1/1     Running   1          49m
virt-handler-8schw                1/1     Running   1          49m
virt-handler-pcvdc                1/1     Running   0          49m
virt-handler-vzqzg                1/1     Running   0          49m
virt-operator-59997bd4d-clzkd     1/1     Running   0          50m
virt-operator-59997bd4d-zs4lr     1/1     Running   1          50m

CDIでイメージを作り、VMを起動しておきました。リソースは十分空いているため、bay10で全部のVMが動いています。

$ kubectl get po -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP              NODE              NOMINATED NODE   READINESS GATES
virt-launcher-vm1-tnspw   1/1     Running   0          21m     10.244.30.211   bay10-gen9.maas   <none>           <none>
virt-launcher-vm2-bcdt2   1/1     Running   0          18m     10.244.30.212   bay10-gen9.maas   <none>           <none>
virt-launcher-vm3-scnt6   1/1     Running   0          14m     10.244.30.213   bay10-gen9.maas   <none>           <none>
virt-launcher-vm4-4gpc5   1/1     Running   0          9m23s   10.244.30.214   bay10-gen9.maas   <none>           <none>
virt-launcher-vm5-fpgqd   1/1     Running   0          3m37s   10.244.30.215   bay10-gen9.maas   <none>           <none>

さて、鬼なことでもしてみますか。先程VMが動いていたノードを再起動してみます。

$ sudo reboot

しばらくすると別のノードでVMが再作成されます。IPアドレスは変わってしまいます。これが嫌な場合はKubernetesサービスなどでNodePortやIngressサービスなどをSSHポートに対して追加するなどで対応します。

$ kubectl get po -o wide
NAME                      READY   STATUS              RESTARTS   AGE   IP       NODE              NOMINATED NODE   READINESS GATES
virt-launcher-vm1-ss5d7   0/1     ContainerCreating   0          18s   <none>   bay13-gen9.maas   <none>           <none>
virt-launcher-vm2-r8r77   0/1     ContainerCreating   0          14s   <none>   bay13-gen9.maas   <none>           <none>
virt-launcher-vm3-4kpjd   0/1     ContainerCreating   0          31s   <none>   bay13-gen9.maas   <none>           <none>
virt-launcher-vm4-wn77j   0/1     ContainerCreating   0          24s   <none>   bay13-gen9.maas   <none>           <none>
virt-launcher-vm5-q29j4   0/1     ContainerCreating   0          12s   <none>   bay13-gen9.maas   <none>           <none>
...
$ kubectl get po -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP              NODE              NOMINATED NODE   READINESS GATES
virt-launcher-vm1-ss5d7   1/1     Running   0          25m   10.244.32.154   bay13-gen9.maas   <none>           <none>
virt-launcher-vm2-r8r77   1/1     Running   0          25m   10.244.32.155   bay13-gen9.maas   <none>           <none>
virt-launcher-vm3-4kpjd   1/1     Running   0          25m   10.244.32.152   bay13-gen9.maas   <none>           <none>
virt-launcher-vm4-wn77j   1/1     Running   0          25m   10.244.32.153   bay13-gen9.maas   <none>           <none>
virt-launcher-vm5-q29j4   1/1     Running   0          25m   10.244.32.156   bay13-gen9.maas   <none>           <none>

というわけでKubernetesのマルチノード構成でも、KubeVirtを使ってVMの実行が問題なくできることが確認できました。 特にハマることなく動作したので安心しました。

ソフトウェア構成

今回の内容は以下のソフトウェアとバージョンで動作を確認しました。

  • CentOS 7.9 および Ubuntu Server 20.04.2
  • Docker v20.10.6
  • Kubernetes v1.21.1
  • Calico v3.19.1
  • Longhorn v1.1.1
  • KubeVirt v0.40.0
  • CDI v1.34.0