先日、Cloud Native Taiwan User Group で久しぶりに KubeVirt 101 のセッションを行いました。触れば触るほど、このプロジェクトの面白さを実感しています。ここでは、KubeVirt 101 でお話しした内容を少し凝縮し、アーキテクチャに焦点を当てた紹介記事を書きたいと思います。Kubernetes 上で VM ワークロードを実行するためのこのオペレーターを、ぜひ皆さんも試してみてください。
目次
基本紹介
公式サイトの原文:
KubeVirt は Kubernetes 用の仮想マシン管理アドオンです。その目的は、Kubernetes 上で仮想化ソリューションのための共通基盤を提供することにあります。
簡単に言うと、KubeVirt は Kubernetes 上で仮想マシン(VM)を実行できるようにする Kubernetes オペレーターです。これにより、まだコンテナ化されていないアプリケーションや、特定のカーネルを必要とするアプリケーションを実行できるようになります。最大のメリットは、運用面での概念が一般的な Kubernetes コンテナアプリケーションとほぼ同じであるため、運用担当者の学習コストを大幅に抑えられる点にあります。
CRD
まず、KubeVirt でよく使われる CRD について簡単に紹介します。
仮想マシン
- VirtualMachine
- 仮想マシンインスタンス
- VMI ReplicaSet
- VMI プリセット
VirtualMachineInstance(VMI)は、インスタンスの最も基本的なビルディングブロックです。ほとんどの場合、ユーザーがこの CRD を直接作成することはなく、VirtualMachine や VMI ReplicaSet といった、より上位の CRD によって作成されます。
VirtualMachine(VM)は通常、ステートフルな VM を定義するために使用され、停止・起動後もデータが保持されます。ただし、ステートレスな VM を作成するために使用することも可能です。
VMI ReplicaSet は Kubernetes の ReplicaSet に似ており、同様の設定を持つステートレスな VM 群を提供するための CRD です。
VMI Preset はインスタンスの「フレーバー(Flavor)」にあたります。VM に必要な CPU や RAM などのリソースをあらかじめ定義しておき、再利用することができます。
主要コンポーネント
全体的なアーキテクチャ図は以下のようになります:
KubeVirt は以下のコンポーネントで構成されています:
- virt-api
- virt-controller
- virt-handler
- virt-launcher
- libvirtd
virt-api
virt-api は、以下のような KubeVirt 固有の API を提供する役割を担います。 など。console, vnc, startvm, stopvm
virt-controller
virt-controller は、主に VMI (CRD) の状態を監視し、VMI に関連する Pod を管理します。Pod のライフサイクル(作成、削除)はこのコンポーネントによって処理されます。また、VMI オブジェクト内のノード名を更新することも virt-controller の役割の一つです。
virt-handler
virt-handler はワーカーノード上で動作する DaemonSet です。主な目的は Kubernetes API サーバー内の VM オブジェクトの変更を監視し、VM を期待される状態に同期することです。VM の起動時、virt-handler は VMI オブジェクトを参照して virt-launcher に VMI の起動を指示(シグナル)します。その後の処理は、次に紹介する virt-launcher に引き継がれます。
virt-launcher
各VMIオブジェクトは1つのPodに対応し、そのPodのコンテナではvirt-launcherというコンポーネントが実行されます。virt-launcher Podは、VMIプロセスの実行に必要なcgroupsとnamespacesを提供する役割を担います。また、主にlibvirtdと通信するコンポーネントでもあり、virt-launcherからのシグナルを受け取るとlibvirtdを通じてVMIを起動し、VMIプロセスの状態を監視して、プロセスが終了した際に停止(terminate)させます。
libvirtd
libvirtdはその名の通りlibvirtデーモンであり、仮想マシンを作成するためのAPIを提供します。
まとめ
KubeVirtの全体構成はそれほど複雑ではなく、使い方も非常に簡単です。Kubernetes環境でVMワークロードを動かす必要がある読者の方は、ぜひ試してみてください。今後、ネットワーク構成や使用方法についてもいくつか記事を書く予定です。待ちきれない方は、先に... CNTUGのYouTubeチャンネル 当時のオンライン勉強会の録画をご覧ください。
参考文献
https://github.com/kubevirt/kubevirt/blob/master/docs/architecture.md
https://kubernetes.io/blog/2018/05/22/getting-to-know-kubevirt/
https://github.com/kubevirt/kubevirt/blob/master/docs/components.md
著作権表示:特に断りのない限り、本ブログのすべての記事はCC BY-NC-SA 4.0ライセンスの下で提供されています。

