在Ubuntu 12.04 上安裝Open vSwitch


雲計算時代我們已經虛擬化了服務器硬件,現在我們有無數的虛擬機跑在服務器硬件上,看上去很美好,但是任務還沒有完成,這麼多的虛擬機都依賴物理服務器(所在)的網絡端口、網絡和交換機(除了物理依賴還依賴這些物理硬件上的軟件配置),這讓底層變動成為一個大問題,比如我們想改變服務器A 上的網絡設置(192.168.2.0 改成172.16.2.0)或者物理移動服務器A 到另一機房,那麼服務器A 上運行的虛擬機怎麼辦呢?逐個改動配置很麻煩。有沒有一種辦法把虛擬機所在的網絡和物理服務器的網絡隔開呢(雖然可以用VLAN,但是還是不夠)?這正是網絡虛擬化正在做的,通過軟件的方式形成交換機部件(vSwitch),讓各個虛擬機和虛擬交換機連接起來而不用去理會真實物理機和物理交換機。比如,讓Host A 上的VM02 和Host B 上的虛擬機VM10 連成一個網絡而不用理會虛擬機(VM)所在服務器(Host)的網絡設置。

網絡虛擬化或者軟件定義網絡(Software Defined Network, SDN)的應用遠不止這些,任何理解SDN 的技術人員都不應該懷疑SDN 的未來,優勢是如此的明顯以致於沒辦法懷疑,這也是為啥VMware願意花12億美金買Nicira(軟件定義網絡的先驅)。

要使用SDN/OpenFlow 就必須有支持OpenFlow 協議的物理(或軟件)交換機,OpenvSwitch 就是這麼一個支持OpenFlow 協議的開源虛擬交換機。我們從安裝虛擬交換機Open vSwitch 開始來慢慢了解網絡虛擬化吧。

安裝必要軟件包:

$ sudo -i
# apt-get install kvm libvirt-bin openvswitch-controller openvswitch-brcompat openvswitch-switch openvswitch-datapath-source
啟動Open vSwitch 服務,如果報錯FATAL: Error inserting brcompat_mod 模塊錯誤則需要編譯和加載brcompat_mod 這個模塊,這個模塊是openvswitch 為了兼容linux bridge 而來的,有些程序使用Linux bridge(比如brctl),這些程序為了能在openvswitch 下繼續使用將需要這個brcompat_mod 兼容模塊,這個模塊為那些慢慢遷移到openvswitch 的程序提供了方便:

# service openvswitch-switch start
FATAL: Error inserting brcompat_mod (/lib/modules/3.2.0-30-generic/updates/dkms/brcompat_mod.ko): Invalid module format
 * Inserting brcompat module
Module has probably not been built for this kernel.
For instructions, read
/usr/share/doc/openvswitch-datapath-source/README.Debian
FATAL: Error inserting brcompat_mod (/lib/modules/3.2.0-30-generic/updates/dkms/brcompat_mod.ko): Invalid module format
 * Inserting brcompat module

# module-assistant auto-install openvswitch-datapath
編譯模塊後再次嘗試啟動服務:

# service openvswitch-switch restart
 * Killing ovs-brcompatd (1606)
 * Killing ovs-vswitchd (1603)
 * Killing ovsdb-server (1594)
 * Starting ovsdb-server
 * Configuring Open vSwitch system IDs
 * Starting ovs-vswitchd
 * Starting ovs-brcompatd
 * iptables already has a rule for gre, not explicitly enabling

 # service openvswitch-controller restart
 * Restarting ovs-controller ovs-controller Sep 12 13:46:46|00001|stream_ssl|INFO|Trusting CA cert from /etc/openvswitch-controller/cacert.pem (/C=US/ST=CA/O=Open vSwitch /OU=switchca/CN=OVS switchca CA Certificate (2012 Sep 12 13:42:19)) (fingerprint 46:5b:14:1f:13:56:b0:b0:a7:4d:10:39:ee: 68:18:d4:39:3c:4b:d0)
                                                                                  [ OK ]
編輯配置文件,取消註釋並設置BRCOMPAT 為yes 以便啟動後能使用brcompat_mod 模塊:

# vi /etc/default/openvswitch-switch
# This is a POSIX shell fragment -*- sh -*-

# FORCE_COREFILES: If 'yes' then core files will be enabled.
# FORCE_COREFILES=yes

# BRCOMPAT: If 'yes' and the openvswitch-brcompat package is installed, then
# Linux bridge compatibility will be enabled.
BRCOMPAT=yes
重啟一下系統,驗證一下是否模塊被自動加載:

# reboot

# lsmod | grep brcom
brcompat_mod 13512 0 
openvswitch_mod 83993 1 brcompat_mod
使用openvswitch 增加網橋br0 並把網絡接口eth0 加入br0:

# ovs-vsctl add-br br0
# ovs-vsctl add-port br0 eth0

# ovs-vsctl show          
a23c503b-bfbe-4646-8738-a7f69e5d69a0
    Bridge "br0"
        Port "eth0"
            Interface "eth0"
        Port "br0"
            Interface "br0"
                type: internal
    ovs_version: "1.4.0+build0"
配置網橋br0 和網絡接口eth0(和用bridge-utils 工具配置的時候一樣,不同的是這裡用更先進的openvswitch/brcompat_mod 替換了bridge-utils):

# ifconfig eth0 0
# ifconfig br0 192.168.2.45 netmask 255.255.255.0
# route add default gw 1​​92.168.1.1 br0
為了保存網絡設置,最好把上面的配置寫到/etc/network/interfaces 裡:

# vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 192.168.2.45
netmask 255.255.255.0
gateway 192.168.2.1

auto eth0
iface eth0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

Docker容器日誌查看與清理

利用 Keepalived 提供 VIP