Ubuntu/KVM/OVSでOpenFlowテスト環境をつくる(7)
一連のシリーズで見てきていますが中身が変わるのでちょっとタイトル変更。連番は継続。
これまでは、ポータブルな環境を、という考え方で
みたいな構成でどこまでできるか…を見てきました。が、ここからはポータブルってところをいったん捨てて、"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 なところです。
# 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:設定できるから使えるんだと思ってやってたら動かなくて無駄に時間食ったりした。