dshimizu/blog

アルファ版

Ubuntu 16.04.4 LTS の KVM の仮想ネットワークで Open vSwitch を使用する

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-bradd-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] ovs-br0 ----******** [/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 '//'

[/terminal] これでKVM仮想マシンは外部との通信が可能となる。 適当にPingでも打って応答があることを確認する。
$ ping 192.168.10.2

まとめ

Open vSwitchをインストールして仮想ブリッジを作成し、KVMから利用する方法について書いた。 最初は仮想ブリッジの概念やイメージがつかみづらく、KVMのネットワーク設定と合わせるととっつきづらいところではありましたが、ちゃんと調べているうちにだんだんわかってきた。

参考