Ubuntu 16.04 LTS で KVM 仮想マシンを Open vSwitch に接続して使用するための方法について、現時点でやったことや調べたことを記載しておく。
Open vSwitch on KVM
普段KVMでは Linux Kernel の macvlan 機能を使用した macvtap を使うことがパフォーマンス上良いということで使っているが(※実際に自分自身でパフォーマンス検証したわけではない)、Open vSwitchではvlanも使え、KVMでより柔軟なネットワークが構成できるのではないかと思い試し始めた。
なお、macvlanは仮想的なMACアドレスを持つ仮想的なNICを作成する機能で、macvtapはmacvlanで作成された仮想NICを物理NICに論理的に直接接続させて通信させることができるようにする機能…という程度の個人的な雑な認識。 この機能自体は上述の通りLinux Kernelの機能であり、KVMのものではない。
では、Open vSwitchを使って以下のようになるようKVMのネットワーク環境構築してみる。 まずはVLANなどは設定せず、ブリッジ(単なる中継点)として使えるように設定する。 KVM仮想マシンに割り当てるIPアドレスはDHCPではなく固定のIPとする。
Open vSwitch on KVM環境構築
Ubuntu 16.04 LTS上でKVMとOpen vSwitchの環境を構築する。
利用OSバージョン
利用パッケージバージョン
- openvswitch-switch 2.5.4-0ubuntu0.16.04.1
- openvswitch-common 2.5.4-0ubuntu0.16.04.1
- qemu-utils 1:2.5+dfsg-5ubuntu10.26
- qemu-system-common 1:2.5+dfsg-5ubuntu10.26
- qemu-system-x86 1:2.5+dfsg-5ubuntu10.26
- qemu-kvm 1:2.5+dfsg-5ubuntu10.26
- qemu-block-extra:amd64 1:2.5+dfsg-5ubuntu10.26
Open vSwitchのインストール
続いてOpen vSwitchをインストールする。
$ sudo apt install openvswitch-switch
Open vSwitchの設定
Open vSwitchを起動してみる。
$ sudo systemctl start openvswitch
ovs-vsctl show
コマンドで設定の概要を確認できる。
$ sudo ovs-vsctl show ********-****-****-****-************ ovs_version: "2.3.1"
ブリッジを作成する。
ovs-vsctl
コマンドのadd-br
やadd-port
を使って作成することもできるが、Ubuntuのネットワーク設定に任せてしまうこともできるので、ここではbr-ex
という名称の仮想ブリッジを作成するようUbuntuのネットワーク設定を行う。
/etc/network/interfaces.d/br-ex
というファイルを作成し、以下のような内容を記述する。
auto br-ex iface br-ex inet static address 172.16.1.129 netmask 255.255.255.0 gateway 172.16.1.255 dns-nameservers 8.8.8.8 ovs_type OVSBridge ovs_port eth1
仮想ブリッジインタフェースそのものに割り当てるIPアドレスはとりあえず何でも良い。
ブリッジさせるためにovs_type
にはOVSBridge
を設定する。
ovs_port
にはKVMホストOSの物理インタフェースを割り当てる。今回はeth1
とする。
仮想ブリッジに割り当てる物理インタフェース eth1 のネットワーク設定は、/etc/network/interfaces.d/eth1
というファイルを作成し、以下のような内容を記述する。
auto eth1 iface eth1 inet static address 0.0.0.0 ovs_bridge br-ex ovs_type OVSPort
物理インタフェースと仮想ブリッジインタフェースをアップする。
$ sudo ifup eth1
$ sudo ifup br-ex
この時点で以下のように仮想ブリッジに eth1 というインタフェースが割り当てられている。
$ sudo ovs-vsctl show ********-****-****-****-************ Bridge br-ex Port "eth1" Interface "eth1" Port br-ex Interface br-ex type: internal ovs_version: "2.5.4"
KVMのインストール
続いてKVM環境を構築する。必要なパッケージをインストールする。
$ sudo apt install qemu-kvm libvirt-bin libvirt0 python-libvirt virtinst
とりあえずはこれだけでOK。
KVMのネットワーク周りの設定
KVM(libvirt)側で、上記で設定した仮想インタフェースを扱えるようにネットワークを定義する。
以下のような内容で、/etc/libvirt/qemu/networks/ovs-br0.xml
というファイルを作成する。
[terminal]
ファイル名やXML内の /etc/network/interfaces.d/br-ex
で設定したものと同様の名称を記載する。
uuidはuuidgenコマンドで生成するか、uuid属性そのものを記載しなくても設定を登録(define)したときに自動で記入される。
仮想ネットワークの設定を登録する。
$ sudo virsh net-define /etc/libvirt/qemu/networks/ovs-br0.xml
登録された仮想ネットワークを確認する。
$ sudo virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active yes yes ovs-br0 inactive no yes
登録したネットワークを起動する。
$ sudo virsh net-start ovs-br0 Network ovs-br0 started
登録した ovs-br0 が active になっていることを確認する。
$ sudo virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active yes yes ovs-br0 active no yes
確認
dev01,dev02 というKVMの仮想マシンを作成し、双方で通信できることを確認する。
virt-install で network の指定に上記で作成したovs-br0を指定すればOpen vSwitchの仮想ブリッジを使用して仮想マシンが起動する。 OSインストールに使うISOイメージとかは所定の場所にあらかじめ設置しておく。 2台の仮想マシンのIPアドレスは固定のもの(static)で設定する。ここでは192.168.10.1, 192.168.10.2 とする。
$ sudo virt-install --connect qemu:///system -n dev01 --ram 1024 --vcpus 1 --network network=ovs-br0 --location '/var/lib/libvirt/iso/ubuntu-16.04.4-server-amd64.iso' --graphics vnc,listen=0.0.0.0,port=15991 --disk size=10,path=/var/lib/libvirt/images/dev01.img --extra-args='console=tty0 console=ttyS0,115200n8 serial' --debug
$ sudo virt-install --connect qemu:///system -n dev02 --ram 1024 --vcpus 1 --network network=ovs-br0 --location '/var/lib/libvirt/iso/ubuntu-16.04.4-server-amd64.iso' --graphics vnc,listen=0.0.0.0,port=15992 --disk size=10,path=/var/lib/libvirt/images/dev02.img --extra-args='console=tty0 console=ttyS0,115200n8 serial' --debug
仮想マシン作成後、仮想ブリッジに vnet0, vnet1 というインタフェースが作成される。
$ sudo ovs-vsctl show ********-****-****-****-************ Bridge br-ex Port "eth1" Interface "eth1" Port br-ex Interface br-ex type: internal Port "vnet0" Interface "vnet0" Port "vnet1" Interface "vnet1" ovs_version: "2.5.4"
KVM仮想マシン定義ファイル上のネットワーク設定は以下のようになっている。
[terminal]
$ sudo virsh dumpxml dev01 | awk '/
$ ping 192.168.10.2
まとめ
Open vSwitchをインストールして仮想ブリッジを作成し、KVMから利用する方法について書いた。 最初は仮想ブリッジの概念やイメージがつかみづらく、KVMのネットワーク設定と合わせるととっつきづらいところではありましたが、ちゃんと調べているうちにだんだんわかってきた。参考
- 5.3. 物理ネットワークのブリッジ - Red Hat Customer Portal
- 仮想化の導入および管理ガイド - Red Hat Customer Portal
- Virtual switching technologies and Linux bridge
- 極める!KVM
- 21.39. 仮想ネットワークの管理 - Red Hat Customer Portal
- Open vSwicthでVLAN構築 - Qiita
- UbuntuでOpen vSwitchを使うときに/etc/network/interfacesが使える
- OpenvSwitch関連コマンドのチートシート的な何か - ぽぽぽぽーんのネットワークとOSS
- 第6回 Linuxカーネルのコンテナ機能[5] ─ネットワーク:LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術|gihyo.jp … 技術評論社
- openvswitchのvxlanで、KVM(libvirt)ホストの仮想ネットワークを接続する - Qiita