ブログ・コミュニティ

HOMEデベロッパー向け ブログ・コミュニティ SCSK技術者ブログ OCP-VirtでVMネットワーク構築!外部アクセスまでの手順紹介

OCP-VirtでVMネットワーク構築!外部アクセスまでの手順紹介

はじめに

みなさん、こんにちは!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導入

環境情報

Openshfitバージョン 4.18.15
Operatorバージョン OpenShift Virtualization 4.18.2
NMState4.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」を選択します。
  1. チャネルは "stable" 、バージョンは最新のものを選択し、[インストール]をクリックします。
  1. 以下のデフォルトの設定で[インストール]します。
  • 更新チャネル:stable
  • バージョン:4.18.2
  • インストールモード:クラスターの特定のnamespace
  • インストール済みのnamespace:Operator推奨のnamespace:openshift-cnv
  • 更新の承認:自動

インストールが完了すると、「Installed Operators」に表示されます。

HyperConverged作成

  1. Webコンソールのメニューから「Operator > インストール済みのOperator > OpenShift Virtualization」を選択して表示される画面上の、OpenShift Virtualization Deployment の[インスタンスの作成]をクリックします。
  1. パラメータは全てデフォルトのままで、一番下までスクロールし[作成]をクリックします。
  1. 作成後、表示に従い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 の[インスタンスの作成]をクリックします。
  1. 必須項目の storagePool のパラメータを入力します。
  • name:任意のストレージプール名(今回は vm-storage-pool)
  • path:PV作成用のローカルディレクトリのパス(今回は /data/vm-volume)

注意:ストレージプールは OS と同じパーティションに置かないこと。
OS と同じパーティションに置くと、OS の領域を圧迫してしまい、ノードが不安定になる可能性があるため。

  1. その他のパラメータはデフォルトで[作成]をクリックします。
  1. ローカルディスクのstoragePoolを使用するストレージクラスを作成します。
  • metadata.name:任意のストレージクラス名(今回は hostparh-csi)
  • provisioner:kubevirt.io.hostpath-rovisioner
  • volumeBindingMode:WaitForFirstConsumer
  • 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」を選択します。
  1. チャネルは "stable" 、バージョンは最新のものを選択し、[インストール]をクリックします。
  1. 以下のデフォルトの設定で[インストール]します。
  • 更新チャネル:stable
  • バージョン:4.18.0-202505150334
  • インストールモード:クラスターの特定のnamespace
  • インストール済みのnamespace:Operator推奨のnamespace:openshift-nmstate
  • 更新の承認:自動
  1. Webコンソールのメニューから「Operator > インストール済みのOperator > Kubernetes NMState Operator」を選択してNMStateのタブをクリックします。
  2. [NMStateの作成]をクリックします。
  1. パラメータは全てデフォルトのままで、一番下までスクロールし[作成]をクリックします。
  1. 作成後、表示に従いWEBコンソールを更新します。

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

bondingの作成

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

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

[From Form]を選択します。

  1. パラメータを入力し、[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
  1. NNCPのステータスを確認します。
$ oc get nncp [Enter]
NAME            STATUS    REASON
create-bond1      Available    SuccessfullyConfigured

RHCOSにログインして、$ nmcli connection show でbond1が作成されていることを確認してみてください。

Linuxブリッジ作成

VMが物理ネットワークに直接接続できるようにするためにLinuxブリッジを作成します。
こちらもNNCPで設定していきます。

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

NetworkAttachmentDefinitions(NAD)作成

VMがLinuxブリッジに接続できるようにするために、NADを作成します。

  1. OpenShiftにログインし、左メニューから「ネットワーク」→「NetworkAttachmentDefinitions」を開きます。
  2. NetworkAttachmentDefinitions の画面で[Create]をクリックします。
  1. パラメータを入力し、[Create]をクリックします。今回はdefaultのプロジェクトに作成します。defaultのプロジェクトに作成すると、すべてのネームスペースのVMでNADを割り当て可能です。
  • Name:任意のNAD名(今回はnad-br-ex1)
  • Network Type:Linux bridge
  • Bridge name:作成したbonding インターフェースを指定(今回はbr-ex1)
  • NADが作成されていることを確認します。
# oc get network-attachment-definitions.k8s.cni.cncf.io [Enter]
NAME                           AGEnad-vr-ex1                     1m

OCP-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]を選択します。

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

今回はdefaultのネームスペースに仮想マシンを作成してしまいましたが、用途ごとにネームスペースをわけて管理するのが好ましい運用です。

  1. 仮想マシンを作成するための各種設定を画面上で行います。以下は必須項目です。
  • 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 のタブをクリックします。
  1. Network interfaces の画面でタブをクリックします。
  1. この画面では、仮想マシンへのNICの追加や、既存NICの設定変更が可能です。

[Add network interface] ボタンからVM専用ネットワークに接続するためのNICを追加します。

  1. 設定後、[Save] をクリックすることで、NICの追加が完了します。
  • Name:インターフェース名(今回はvmnet)
  • Model:デバイスモデル(今回は推奨かつデフォルトのvirtio)
  • Network:仮想マシンのNICが接続されるNAD
    [Create VirtualMachine]でVMを起動します。
    仮想マシンがVM専用ネットワークのみを使用する場合はPod networking用のNICは削除しても問題ありません。
  1. 仮想マシンの作成直後は、ステータスが 「Provisioning」 となり、バックエンドでディスクの割り当てやネットワーク設定などの初期処理が行われます。この状態では、仮想マシンはまだ起動しておらず、準備中の段階です。

数分待つと、ステータスが 「Running」 に変わり、仮想マシンが正常に起動したことを示します。

RHEL VMのネットワーク設定

  1. 仮想マシン起動後、仮想マシンのweb コンソール にログインします。
  2. 仮想マシンに複数のNICが接続されている場合、各NICのMACアドレスを確認します。

この情報をもとに、OpenShift上で設定したNIC(今回は vmnet)に対応するデバイス名(例:eth1など)を特定します。

  1. 対象の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上での仮想化を気軽に試してみてください!

担当者紹介

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

選ぶなら業界をリードするコンテナプラットフォーム

OpenShiftならインフラ運用の効率化はもとよりアプリケーション開発者がソースコードの開発に専念できるように必要な機能までも提供してくれます