![]()
はじめに
みなさん、こんにちは!Red Hat OpenShift(以下OpenShift)の構築を担当している立古です。
さっそくですが、「脱VM」や「クラウドネイティブ」という言葉が広がる中、仮想化のあり方も大きく変わりつつあります。そんな中で注目されているのが、OpenShift Virtualization(以下OCP-Virt)です。これは、OpenShift上で仮想マシンを動かせる機能で、コンテナとVMを同じ環境で一元管理できるのが大きな特徴です。
OCP-Virtを使えば、今までの仮想化環境からスムーズに移行できるだけでなく、目的に応じたVM環境を簡単に作り分けることができます。
本記事では、OCP-VirtでVMを作成し、VM専用ネットワークを構築する手順を紹介します。
導入前の課題
OCP-Virtとは
OCP-Virtの主要コンポーネント
OCP-Virtの重要なコンポーネントを説明します。
KubeVirt
OCP-Virtの中核を担う仮想化エンジンで、KVMベースのVMをKubernetesのPodとして扱えるようにします。VMのライフサイクル管理、リソース割り当て、ネットワーク設定などをKubernetesの仕組みで制御できます。
Containerized Data Importer(CDI)
VMのディスクイメージを外部から取り込むための仕組みです。ISOやQCOW2などのイメージを、KubernetesのPVC(永続ボリューム)として取り込む際に使用されます。MTVでもこのコンポーネントが活用されます。
Multus CNI
VMに複数のネットワークインターフェースを割り当てるための仕組みです。Podネットワークとは別に、専用ネットワークやVLANを割り当てることで、環境分離やセキュリティ強化が可能になります。
OCP-Virtのエディション
OCP-VirtはOpenShiftの一部として提供されますが、コンテナを使わずVMのみを運用したいユーザー向けに、Red Hat OpenShift Virtualization Engine Editionという専用エディションも用意されています。
このエディションでは、OpenShiftのコンテナ機能を最小限に抑え、仮想化機能に特化した構成で運用することが可能です。VMベースのインフラを維持しつつ、将来的なコンテナ移行にも備えられる柔軟な選択肢です。
OCP-Virt導入
環境情報
| OpenShiftバージョン |
4.18.15 |
|
Operatorバージョン |
OpenShift Virtualization 4.18.2 NMState 4.18.0-202505150334 |
| OpenShiftクラスター情報リソース |
SNO(シングルノード) 16vCPU/32GBMem/500GBストレージ |
| ネットワーク |
NIC4個 NIC0/NIC1:machiNetwork NIC2/NIC3:VM専用ネットワーク |
構成図

OCP-Virt 構築手順
OCP-Virt Operatorインストール
まずは、OCP-Virtを使えるようにするためのOperatorをインストールします。
1.OpenShiftにログインし、左メニューから「Operators」→「OperatorHub」を開きます。
2.検索バーに「Virtualization」と入力し、「OpenShift Virtualization」を選択します。

3. チャネルは ”stable” 、バージョンは最新のものを選択し、[インストール]をクリックします。

4.以下のデフォルトの設定で[インストール]します。
- 更新チャネル:stable
- バージョン:4.18.2
- インストールモード:クラスターの特定のnamespace
- インストール済みのnamespace:Operator推奨のnamespace:openshift-cnv
- 更新の承認:自動

インストールが完了すると、「Installed Operators」に表示されます。
HyperConverged作成
1.Webコンソールのメニューから「Operator>インストール済みのOperator > OpenShift Virtualization」を選択して表示される画面上の、OpenShift Virtualization Deployment の[インスタンスの作成]をクリックします。

2. パラメータは全てデフォルトのままで、一番下までスクロールし[作成]をクリックします。


3.作成後、表示に従いWEBコンソールを更新します。

WEBコンソールのメニューに Virtualization の項目が追加されます。

ストレージ設定
Hostpath Provisioner (HPP) 設定
Hostpath Provisioner (HPP)
HPP は、OpenShift ノードのローカルディスク領域を使って、仮想マシンのディスク(PVC)を動的に作成・管理するために使用されます。
HPP は、ホストの特定ディレクトリ(パス)をストレージプールとして登録し、OCP-VのVMが PVCを要求すると、HPP がそのパス内にディスクファイルを作成します。
これにより、外部ストレージがなくても VM 用のディスクを簡単に提供できます。
1.Webコンソールのメニューから「Operator>インストール済みのOperator > OpenShift Virtualization」を選択して表示される画面上の、HostPathProvisioners Deployment の[インスタンスの作成]をクリックします。

2.必須項目の storagePool のパラメータを入力します。
n name:任意のストレージプール名(今回は vm-storage-pool)
n path:PV作成用のローカルディレクトリのパス(今回は /data/vm-volume)

注意:ストレージプールは OS と同じパーティションに置かないこと。
OS と同じパーティションに置くと、OS の領域を圧迫してしまい、ノードが不安定になる可能性があるため。
3.その他のパラメータはデフォルトで[作成]をクリックします。

4.ローカルディスクのstoragePoolを使用するストレージクラスを作成します。
n metadata.name:任意のストレージクラス名(今回は hostparh-csi)
n provisioner:kubevirt.io.hostpath-rovisioner
n volumeBindingMode:WaitForFirstConsumer
n parameters.storagePool:HPPで設定したストレージプール名
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: hostpath-csi
provisioner: kubevirt.io.hostpath-rovisioner
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
parameters:
storagePool: my-storage-pool
クラスターにyamlを適用します。
$ oc create -f storageclass_csi.yaml [Enter]デフォルトストレージクラス設定
デフォルトストレージクラスとは複数のストレージクラスが存在する場合にデフォルトで使用されるストレージクラスです。 今回の環境ではストレージクラスは1つですが、設定しておきます。また設定すると、仮想マシンを効率的に作成できるブートソースを自動的に更新します。
$ oc patch storageclass hostpath-csi -p '{"metadata":
{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' [Enter]
$ oc patch storageclass hostpath-csi -p '{"metadata":
{"annotations":{"storageclass.kubevirt.io/is-default-virt-class":"true"}}}' [Enter]ネットワーク設定~VM専用ネットワークを作成~
NMState Operatorインストール
OpenShiftクラスター上で ノードのネットワーク設定を管理するためのオペレーターです。
VMへの外部アクセスを設定するには、Kubernetes NMState Operator をインストールする必要があります。
1.OpenShiftにログインし、左メニューから「Operators」→「OperatorHub」を開きます。
2.検索バーに「NMState」と入力し、「Kubernetes NMState Operator」を選択します。

3.チャネルは ”stable” 、バージョンは最新のものを選択し、[インストール]をクリックします。

4.以下のデフォルトの設定で[インストール]します。
■更新チャネル:stable
■バージョン:4.18.0-202505150334
■インストールモード:クラスターの特定のnamespace
■インストール済みのnamespace:Operator推奨のnamespace:openshift-nmstate
■更新の承認:自動

5.Webコンソールのメニューから「Operator>インストール済みのOperator > Kubernetes NMState Operator」を選択してNMStateのタブをクリックします。
6. [NMStateの作成]をクリックします。

7. パラメータは全てデフォルトのままで、一番下までスクロールし[作成]をクリックします。

8.作成後、表示に従いWEBコンソールを更新します。

WEBコンソールのメニューのネットワーク の項目に関連リソースが追加され、GUIで設定できるようになります。

bondingの作成
NNCP(NodeNetworkConfigurationPolicy)はノードのネットワーク設定を定義するカスタムリソースです。NMStateOperator が読み取り、ノードに適用します。
物理NICの冗長化と可用性向上のために、bonding を作成します。

1.OpenShiftにログインし、左メニューから「ネットワーク」→「NodeNetworkConfigurationPolicy」を開きます。
2.NodeNetworkConfigurationPolicyの画面で〔Create〕をクリックします。

[From Form]を選択します。

3.パラメータを入力し、〔Create〕をクリックします。
■Policy name:任意のポリシー名(今回はcreate-bond1)
■Interface name:任意のインターフェース名(今回はbond1)
■Network state:Up
■Type:Bonding
■IP configuration:チェックしない(IPアドレスは割り当てない)
■Port:VMネットワーク用の物理インターフェースをカンマ区切りで指定
(RHCOSにログインし事前に確認しておく。今回はens2f0,ens2f1)
■Aggregation mode:active-backup

4.NNCPのステータスを確認します。
$ oc get nncp [Enter]
NAME STATUS REASON
create-bond1 Available SuccessfullyConfiguredRHCOSにログインして、$ nmcli connection show でbond1が作成されていることを確認してみてください。
Linuxブリッジ作成
VMが物理ネットワークに直接接続できるようにするためにLinuxブリッジを作成します。
こちらもNNCPで設定していきます。

1.OpenShiftにログインし、左メニューから「ネットワーク」→「NodeNetworkConfigurationPolicy」を開きます。
2.NodeNetworkConfigurationPolicy の画面で[Create]をクリックします。

[From Form]を選択します。
![]()
3.パラメータを入力し、[Create]をクリックします。
■Policy name:任意のポリシー名(今回はcreate-br-ex1)
■Interface name:任意のインターフェース名(今回はbr-ex1)
■Network state:Up
■Type:Linux bridge
■IP configuration:チェックしない(IPアドレスは割り当てない)
■Port:作成したbonding NIC を指定(今回はbond1)
4.NNCPのステータスを確認します。
$ oc get nncp [Enter]
NAME STATUS REASON
create-bond1 Available SuccessfullyConfigured
create-br-ex1 Available SuccessfullyConfiguredRHCOSにログインして、$ nmcli connection show でbr-ex1が作成されていることを確認してみてください。
NetworkAttachmentDefinitions(NAD)作成
VMがLinuxブリッジに接続できるようにするために、NADを作成します。
1.OpenShiftにログインし、左メニューから「ネットワーク」→「NetworkAttachmentDefinitions」を開きます。
2.NetworkAttachmentDefinitions の画面で[Create]をクリックします。
![]()
3.パラメータを入力し、[Create]をクリックします。今回はdefaultのプロジェクトに作成します。defaultのプロジェクトに作成すると、すべてのネームスペースのVMでNADを割り当て可能です。
■Name:任意のNAD名(今回はnad-br-ex1)
■Network Type:Linux bridge
■Bridge name:作成したbonding インターフェースを指定(今回はbr-ex1)

4.NADが作成されていることを確認します。
# oc get network-attachment-definitions.k8s.cni.cncf.io [Enter]
NAME AGE
nad-vr-ex1 1mOCP-Virt仮想マシン設定
仮想マシン作成
Webコンソールを使用して、RHEL 9.6の仮想マシンを作成します。
事前に、virtctl image-upload コマンドを用いて、RHEL 9.6のQCOW2イメージ(rhel-9.6-x86_64-kvm.qcow2)を、default ネームスペースのPVCにアップロード済みです。
このPVCのクローンを仮想マシンのディスクとして指定し、仮想マシンの作成を進めていきます。
1.「Virtualization」→「Virtual Machines」
2.OpenShiftにログインし、左メニューから「Virtualization」→「Virtual Machines」を開きます。
3.VirtualMachinesの画面で[Create VirtualMachine]をクリックします。

[From template]を選択します。

4. VirtualMachineのテンプレート画面で、RHEL9を選択します。

今回はdefaultのネームスペースに仮想マシンを作成してしまいましたが、用途ごとにネームスペースをわけて管理するのが好ましい運用です。
5.仮想マシンを作成するための各種設定を画面上で行います。以下は必須項目です。
■Storage > Disk source:PVC(clone PVC)
■PVC project:QCOW2イメージを格納するアップロード先PVCのネームスペース(今回はdefault)
■PVC name:QCOW2イメージを格納するアップロード先PVC名
■Disk size: rootdisk のサイズ
デフォルトストレージクラスが使用されます。
今回はQCOW2のPVCが30GiBで作成されているのでデフォルト値は切り上がりで31GiBが表示されていました。
■VirtualMachine name:任意の仮想マシン名(今回はtest-rhel9.6)

画面下部には、仮想マシンの作成方法として以下の2つのオプションが表示されます:
Quick create VirtualMachine:基本設定のみで素早く仮想マシンを作成します。
Customize VirtualMachine:リソース、ストレージ、ネットワークなどの詳細設定を行うことができます。
今回は、VM専用ネットワークに接続するためのNICを追加する必要があるため、[Customize VirtualMachine] を選択して、仮想マシンの詳細設定画面へ進みます。
仮想マシンのNIC追加
1.詳細設定のCustomize and create VirtualMachineの画面で Network interfaces のタブをクリックします。

2.Network interfaces の画面でタブをクリックします。

3.この画面では、仮想マシンへのNICの追加や、既存NICの設定変更が可能です。
[Add network interface] ボタンからVM専用ネットワークに接続するためのNICを追加します。

4.設定後、[Save] をクリックすることで、NICの追加が完了します。
■Name:インターフェース名(今回はvmnet)
■Model:デバイスモデル(今回は推奨かつデフォルトのvirtio)
■Network:仮想マシンのNICが接続されるNAD

5.[Create VirtualMachine]でVMを起動します。仮想マシンがVM専用ネットワークのみを使用する場合はPod networking用のNICは削除しても問題ありません。

6.仮想マシンの作成直後は、ステータスが 「Provisioning」 となり、バックエンドでディスクの割り当てやネットワーク設定などの初期処理が行われます。この状態では、仮想マシンはまだ起動しておらず、準備中の段階です。

数分待つと、ステータスが 「Running」 に変わり、仮想マシンが正常に起動したことを示します。
RHEL VMのネットワーク設定
1.仮想マシン起動後、仮想マシンのweb コンソール にログインします。
2.仮想マシンに複数のNICが接続されている場合、各NICのMACアドレスを確認します。

この情報をもとに、OpenShift上で設定したNIC(今回は vmnet)に対応するデバイス名(例:eth1など)を特定します。
3. 対象のNICに対して、nmcli や nmtui を使用して、静的IPアドレスを割り当てます。これにより、VM専用ネットワーク上での通信が可能になります。
※MACアドレスは、仮想マシン詳細画面でも確認できるため、VM内のMACアドレスと照合することで、正確にNICを識別できます。
(参考)VLANタグ付きネットワークのアクセス
OCP-Virtでは、VM専用ネットワークを構成する際に、VLANタグ付きネットワークへの接続も可能です。
代表的な構成方法は以下の2通りです。
| 項目 | 方法①:VLANブリッジフィルタリング |
方法②:VLANインターフェース+ブリッジ |
| 構成要素 |
1つのLinux bridgeに複数のVLANをフィルタリングして接続 |
VLANごとに専用のインターフェースとブリッジを作成 |
|
物理NICとの関係 |
1つの物理NICに対して1つのブリッジ | 物理NICに対してVLANインターフェース(例:eth0.100)を複数作成 |
| NADでのVLAN指定 | 必要(仮想NICにタグを付与) | 不要(物理的にタグ付きインターフェースに接続) |
| NNCP設定内容 |
‐bridgeの作成 ‐vlanFiltering:trueの指定 ‐interfaceに物理NICを指定 |
‐VLANインターフェース(例:eth0.100)の作成 ‐各VLANインターフェースに対するbridgeの作成 ‐interfacesにVLANインターフェースも指定 |
| NAD設定内容 |
‐vlanセクションでVLAN IDを指定 ‐bridge名を指定 |
‐bridge名のみ指定(VLAN IDの指定は不要) |
| NNCPのGUI設定対応可否 |
不可(YAMLでのみ設定可能) ※GUIではvlanFilteringやinterfacesの詳細設定は不可 |
不可(YAMLでのみ設定可能) ※GUIではVLANインターフェースの作成やブリッジの紐づけは不可 |
まとめ
OpenShift Virtualizationを使えば、コンテナと仮想マシンを同じ環境で動かせるだけでなく、VM専用ネットワークやVLANによる分離も柔軟に構成できます。
従来の仮想化環境からのステップアップや、クラウドネイティブな運用を目指す方にもぴったりの仕組みです。
「仮想化ってOpenShiftでもできるんだ!」という気づきのきっかけになれば嬉しいです。
ぜひこの機会に、OpenShift上での仮想化を気軽に試してみてください!
担当者紹介

担当者 立古
サーバ構築の経験をベースに、昨年よりコンテナ技術を学習し、案件に参画しています。
保有資格
-
Certified Kubernetes Administrator
-
Certified Kubernetes Application Developer












