これまで本ブログではKubeVirtを何回か取り上げてきましたが、今回はマルチノードのKubernetesクラスターでKubeVirtを動かしてみます。
まずKubeadmでKubernetesのマルチノードクラスターを作る
KubeVirtをセットアップする前に、公式のドキュメントなどを参考にKubeadmなどでクラスターを作成します。
以下は概要をセットアップする順に並べています。
ランタイムのインストール
まだ1.21なので、一番使い慣れているDockerを選択しました(が、containerdでもCRI-Oでも動くと思います。手元環境で動かせているのは他にCRI-Oの構成です)。
Kubernetesツールのインストール
kubeadm, kubelet, kubectlを、以下に従って導入します。
クラスターの作成
いつもの流れでセットアップします。
- Masterで
kubeadm init
を実行 - Workerで
kubeadm join
を実行 - 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