Ubuntu/KVM/OVSでOpenFlowテスト環境をつくる(7)

一連のシリーズで見てきていますが中身が変わるのでちょっとタイトル変更。連番は継続。

これまでは、ポータブルな環境を、という考え方で

  • vmware player
    • 1 KVM Server (OVS+KVM で複数ブリッジ接続環境を模擬)
    • 1 Controller Server (Trema)

みたいな構成でどこまでできるか…を見てきました。が、ここからはポータブルってところをいったん捨てて、"N KVM Servers" に変えてみます。単一物理ハードウェアから複数物理ハードウェアへ。

で、計算機リソースの載るプラットフォームを物理的に分割する場合、各計算機リソースを仮想的に接続してやる必要があります。今回は VXLAN を使います。というより、もともと VXLAN 使ってみたくてこういう環境にしようとしているのですが…。

参照:

Goal

細かいアレコレは後回しにして、こういう環境を作っていく手順を載せます。

  • Ubuntu Server 13.04
  • Open vSwitch 1.11.90 (2013/07/14時点のhead)
  • VXLAN Tunnel

VXLAN Tunnel は Linux OS そのものでも設定することができます(Linux kernel 3.7 以降, 参考: Network Plumber's Journal: VXLAN for Linux)。そっちもちょっと見ているのですが、今回は OVS の機能でトンネルを張るようにしています。ちなみに Linux OS は Multicast VXLAN 対応, OVS は Unicast VXLAN 対応という感じですね。まあそのうち見ていきましょう。

Linux (KVM Host) Install

インストール後に apt-get update, apt-get dist-upgrade しておきます。
KVM までインストールもやっておきます。

あと、ESXi の VM 上 (今回は KVM Host が ESXi 上の VM として立てられている) で vt-x とか有効になっていないと KVM とか泣きそうになるので有効化しておきましょう。

Open vSwitch

OVS 1.10 release noteによれば、vxlan tunnel support は 1.10 以降のようです。Ubuntu 13.04 apt-get ではいる OVS Package は 1.9 でした。1.9 でも man に tunnel type vxlan の記述はあるし、コンフィグ自体は設定できるのですが、vxlan tunnel が enable になりません…*1。今回は git head をソースからビルドしてインストールしています。

OVSのインストールも含めて以下の記事を参考に作業をしています。

OVS Build & Install
stereocat@vnwt11:~$ git clone git://openvswitch.org/openvswitch
stereocat@vnwt11:~$ cd /openvswitch
stereocat@vnwt11:~/openvswitch$ ./boot.sh
stereocat@vnwt11:~/openvswitch$ ./configure --with-linux=/lib/modules/`uname -r`/build
stereocat@vnwt11:~/openvswitch$ make && make install

openvswitch.ko を組み込む必要があるのですが、

stereocat@vnwt11:~/openvswitch$ sudo insmod datapath/linux/openvswitch.ko
Error: could not insert module datapath/linux/openvswitch.ko: Unknown symbol in module
stereocat@vnwt11:~/openvswitch$

となってしまう場合は、ログが裏で出ています。

Jul 14 22:58:40 vnwt11 kernel: [ 1494.509502] openvswitch: Unknown symbol gre_del_protocol (err 0)
Jul 14 22:58:40 vnwt11 kernel: [ 1494.509521] openvswitch: Unknown symbol gre_add_protocol (err 0)

gre kernel module を先にロードしておけ、とのこと。

stereocat@vnwt11:~/openvswitch$ sudo modprobe gre
stereocat@vnwt11:~/openvswitch$ sudo insmod datapath/linux/openvswitch.ko
OVS Initial Settings

初期設定です。DBファイルとか作ります。いつものアレですね。

stereocat@vnwt11:~/openvswitch$ sudo touch /usr/local/etc/openvswitch/ovs-vswitchd.conf
stereocat@vnwt11:~/openvswitch$ sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema

サーバの起動

stereocat@vnwt11:~/openvswitch$ sudo ovsdb-server /usr/local/etc/openvswitch/conf.db \
> --remote=punix:/usr/local/var/run/openvswitch/db.sock \
> --pidfile --detach --log-file
2013-07-14T14:10:26Z|00001|vlog|INFO|opened log file /usr/local/var/log/openvswitch/ovsdb-server.log
stereocat@vnwt11:~/openvswitch$
stereocat@vnwt11:~/openvswitch$ sudo ovs-vsctl --no-wait init
stereocat@vnwt11:~/openvswitch$ sudo ovs-vswitchd --pidfile --detach
2013-07-14T14:11:26Z|00001|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connecting...
2013-07-14T14:11:26Z|00002|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connected
stereocat@vnwt11:~/openvswitch$
stereocat@vnwt11:~/openvswitch$ sudo ovs-vsctl show
6df77158-d02e-48dc-b81e-02551e12151bj
stereocat@vnwt11:~/openvswitch$

OVS Configuration and Interface Settings

OVS が起動したら OVS bridge configuration を入れます。あと各 Interface のIPアドレス設定をやります。

vnwt11

OVS Config

  • 今回のキモは tunnel type=vxlan なところです。
    • type=vxlan
    • remote_ip: OVS はここでマルチキャスト系の設定が入らないので、Unicast vxlan のみ対応の模様。
    • key: VNI が設定できます。
# bridge の作成
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ovs-vsctl add-br br2

# 物理I/Fは br0 へ。(KVM Host用)
ovs-vsctl add-port br1 eth0

# br1/br2 を kvm domain 用に使います。

# patch port の設定
ovs-vsctl add-port br1 patch1-2 -- set interface patch1-2 type=patch options:peer=patch2-1
ovs-vsctl add-port br2 patch2-1 -- set interface patch2-1 type=patch options:peer=patch1-2

# vxlan tunnel の設定
ovs-vsctl add-port br1 vxlan11 -- set interface vxlan11 type=vxlan options:remote_ip=192.168.1.92 options:key=11
ovs-vsctl add-port br1 vxlan12 -- set interface vxlan12 type=vxlan options:remote_ip=192.168.1.92 options:key=12
ovs-vsctl add-port br2 vxlan22 -- set interface vxlan22 type=vxlan options:remote_ip=192.168.1.92 options:key=22

# OpenFlow Controller の設定
ovs-vsctl set-controller br1 tcp:192.168.1.90:6633
ovs-vsctl set-controller br2 tcp:192.168.1.90:6633
ovs-vsctl set bridge br1 other-config:datapath-id=0000000000000011
ovs-vsctl set bridge br2 other-config:datapath-id=0000000000000012


設定確認

root@vnwt11:~# sudo ovs-vsctl show
6df77158-d02e-48dc-b81e-02551e12151b
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "eth0"
            Interface "eth0"
    Bridge "br1"
        Controller "tcp:192.168.1.90:6633"
            is_connected: true
        Port "vxlan11"
            Interface "vxlan11"
                type: vxlan
                options: {key="11", remote_ip="192.168.1.92"}
        Port "br1"
            Interface "br1"
                type: internal
        Port "vxlan12"
            Interface "vxlan12"
                type: vxlan
                options: {key="12", remote_ip="192.168.1.92"}
        Port "tap1"
            Interface "tap1"
        Port "patch1-2"
            Interface "patch1-2"
                type: patch
                options: {peer="patch2-1"}
    Bridge "br2"
        Controller "tcp:192.168.1.90:6633"
            is_connected: true
        Port "br2"
            Interface "br2"
                type: internal
        Port "tap2"
            Interface "tap2"
        Port "vxlan22"
            Interface "vxlan22"
                type: vxlan
                options: {key="22", remote_ip="192.168.1.92"}
        Port "patch2-1"
            Interface "patch2-1"
                type: patch
                options: {peer="patch1-2"}
root@vnwt11:~#

IPアドレスの設定。

  • eth0 には IP を持たせません。
  • br0, br1 に IP アドレスを設定します。
    • br0 はホスト管理(リモートアクセスとか)用: outer network
    • br1(br2) は OpenFlow Network 用: inner network
# network config
ip addr flush dev eth0
ip addr flush dev br0
ip addr flush dev br1
ip addr add 192.168.1.91/24 dev br0
ip addr add 192.168.11.11/24 dev br1
ip route add default via 192.168.1.1 dev br0

今回、KVM Host の NIC 1個だけでやったので、上の設定ミスると即リモートアクセス(ssh)が落ちます。やっぱりリモート用 NIC と、仮想環境 (KVM Domain)用 NIC を分けて作るべきだった…。

KVM Domain (VM) を起動したとき、AppArmor をとめておかないと tap interface が ovs に作れない、といってエラーが出たので

stereocat@vnwt11:~$ sudo virsh start ofvm01
error: Failed to start domain ofvm01
error: Unable to add port tap1 to OVS bridge br1: Operation not permitted

stereocat@vnwt11:~$

とめておきます(実験用なのでそこは大目に見てしまう方向で…)

# stop apparmor
service apparmor stop
service apparmor teardown
vnwt21

vnwt11 同様なので省略。tunnel remote_ip の宛先と、vxlan12 が br2 に設定されるところくらいです違うのは。OFS DPID は以下のようにしてあります。

sudo ovs-vsctl set bridge br1 other-config:datapath-id=0000000000000021
sudo ovs-vsctl set bridge br2 other-config:datapath-id=0000000000000022

動作確認

いつもの Trema/MyRoutingSwitch を使ってトポロジの確認と動作確認をしていきます。

VM(ofvmXX)間で ping 撃ってみたときのキャプチャ; Windows7 Host 上でキャプチャしていて、KVM Hots (vnwt11/21) のアドレスの物だけ出しています。

ちなみに、Wireshark(1.10.0 on windows, 1.8.2 on Linux)は VXLAN 対応していましたが、最初は単なる UDP Packet として表示されます。右クリックして "Decode As" から、destination port = 4789 で VXLAN を選択してください。(4789 は vxlan にアサインされたポート番号ですね)

余談ですが、Linux で vxlan interface 作ったときは port 8472 でした。これは OTV (Overlay Transport Virtualization) に割り当てられている番号ですね…。

まとめ

VXLAN Tunnel を使って複数スイッチ環境を組み直してみました。とりあえずそこそこ動くんだな…というのが感想。Unicast VXLAN Tunnel だと感覚的には patch port 使うのとそんなに違いがないですね。

  • MTU問題
  • Performance 系の話

といったあたりの考慮はまた別途必要でしょう。あとは、Multicast VXLAN と Unicast VXLAN の話か…。Linux で VXLAN I/F 作れば KVM + multicast vxlan を構成できる (linux 上で作った vxlan interface を ovs bridge に add してやれば良いので) のだけど、その場合どういう風にコントローラからは見えるんだろう? というのと、underlay 側で multicast をどうコントロールしてやるか、だな…。Multicast 系はやったことないからよくわからん。

*1:設定できるから使えるんだと思ってやってたら動かなくて無駄に時間食ったりした。