こんにちは。サイオステクノロジーの塙です。
今回は、OpenShift(以下、OCP)上で、VMを実行するための機能となるOpenShift Virtualization(以下、OCP Virt)について説明したいと思います。
前提情報
本記事では、現時点では、以下のバージョンを対象としています。
■バージョン
OpenShift v4.15
OpenShift Virtualization v4.15 *1
*1 OCP Virt のバージョンは、v4.8 から OCP と同じになり、OCPと同様に推移していきます。
https://access.redhat.com/support/policy/updates/openshift_operators
概要
OCP Virt は、OCP 上で VM を動作、管理するためのコンポーネントとなります。
OCP Virt は OCP v4.5 から GA となり、OCP WebUI の OperatorHub から OCP Virt の Operator をインストールすることで利用可能となります。
サブスクリプションは、OCP のサブスクリプションで利用できるようになります。
また、OCP Virt は CNCF の Incubating Project である KubeVirt を利用して開発されているようです。
https://www.cncf.io/projects/kubevirt/
アーキテクチャ
アーキテクチャの基礎部分
VM を動作させる仕組みとして KVM を使用します。
KVM が RHCOS のカーネルで実行され、QEMU、libvirt はコンテナの内部で実行される形式となります。
概要では、Kubernetes の他の Pod と同様に、以下の枠組みを使用します。
- CNI
- CSI
- CRD
内部のコンポーネント
VM を動作させるには、主に3つのコンポーネントがあります。
(Building a unified hybrid cloud strategy with Red Hat OpenShift Virtualization より引用)
- virt-controller :CRD で定義された VM リソースを監視し、VM リソースの Pod をノードに割り当てる
- virt-handler :各 Worker ノードで実行される DaemonSet。API や virt-controller と連携して、Pod の作成などの操作を、virt-launcher に指示する役割がある
- virt-launcher :libvirtd と連携し、VM の作成や削除を制御する
VM のリソース
VM のリソースは Kubernetes の CRD を用いて定義を行う形となります。
# VMリソースの例
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
label:
app: demo
name: test-vm
spec:
dataVolumeTemplates:
- metadata:
name: example-dv
spec:
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
source:
http:
url: ""
running: false
template:
spec:
domain:
devices:
disks:
- name: containerdisk
disk:
bus: virtio
interfaces:
- masquerade: {}
name: default
resources:
requests:
memory: 1024M
networks:
- name: default
pod: {}
volumes:
- name: containerdisk
containerDisk:
image: kubevirt/fedora-cloud-container-disk-demo
- VirtualMachine(VM)リソース:VMIを作成するためのテンプレートを構成するリソース
- VirtualMachineInstance(VMI) リソース:VM リソースの定義の、稼働中の実態を表すインスタンスのリソース
- VirtualMachineInstanceMigration リソース:VM をライブマイグレーションするときに構成するリソース
- DataVolume(DV) リソース:VM のディスクイメージなどのストレージ側の設定を定義するリソース
サポート対象のノードと OS
サポート対象のノード
VM を動作させるノードは、ベアメタルになります。
OCP Virt のサポート対象のクラスターノードは以下のとおりです。
- ブレインメタルサーバー
- AWS ベアメタル インスタンス
- IBM Cloud ベアメタルサーバー (TechPreview機能)
サポート対象のOS
VM の OS としてサポート対象となっている OS が確認できます。
https://access.redhat.com/articles/973163#ocpvirt
参考までに、rhel OS のライセンスは OCP に含まれており、Windows は別途ライセンスが必要になります。
利用のポイント
OCP Virt の利用を考える時のポイントを以下に記載していきます。
1. VM管理のメリット
VM のディスク、ネットワークなどのリソース定義は、OCP の Pod と同様に、yaml ファイルのマニフェストで管理出来る形になっています。VM 自体を IaC で管理することで、ある程度 VMの管理自体もしやすく、自動化出来る部分もあるのではないでしょうか。
例えば、現在コンテナ環境も運用されており、コンテナ運用を見据えた取り組みをしたいという考えがある場合は、VM と コンテナの運用管理を統一することができ、効率化を図ることができます。
2. コンテナ環境とシームレスに接続
Kubernetes の仕組みとして CSI(Container Storage Interface)*1、CNI(Container Network Interface)*2 を他のPodと同じように使用できます。
これは、VM と Pod 間で通信を行いたいときに、ネットワークがクラスター内で完結できることを意味します。
そして、他のPodの通信方法と同じように、通信の際のVMのIPを意識せずに良いという所もポイントとなります。ただ、IPを指定して通信を行いたいといった要件の場合は、少し難点があるかもしれません。
*1 CSI(Container Storage Interface):異なるストレージ技術を利用してコンテナに永続的なストレージを提供する仕組み
*2 CNI(Container Network Interface): コンテナ間でのネットワーク接続を管理するためのプラグインを提供する仕組み
3. 他環境からのマイグレーションや、稼働中の変更時のダウンタイム
OCP Virt は、MTV というツールを用いて、他の VM 環境から VM をマイグレーションすることが可能です。
これは非常に便利な機能ですが、注意点が一つあります。
現時点では、他環境からマイグレーションをするときに VM のダウンタイムが発生します。移行規模にもよりますが、ダウンタイムを考慮した移行を計画する必要があります。
また、OCP Virt で稼働中のリソースを変更する場合、マニフェストを変更、適用する形となります。マニフェスト適用後に Pod の再起動が発生するので、VM のリブートでダウンタイムが発生することを考慮する必要があります。
まとめ
今回は、OpenShift(以下、OCP)上で、VMを実行するための機能となるOpenShift Virtualization(以下、OCP Virt)について説明しました。
また、より詳細のOCP Virt の機能について紹介出来ればと思います。
本書の記載が読者のお役に立てば幸いです。
参考文献
OpenShift Virtualization ( Kubevirt ) でVM管理もCloud Nativeに (1)