第 2 章 OpenStack 与网络

第 2 章 OpenStack 与网络

在OpenStack的各类技术群中,我经常碰到一个现象,搞OpenStack的人通常更熟悉软件,而在网络方面相对陌生一些。这也是让很多人头痛的地方,正是因为对网络知识了解不足,很多初学者在部署OpenStack时知其然而不知其所以然,即使出现问题也难以处理。

网络不仅对于初期部署OpenStack很重要,而且对整个线上运行的云系统更重要。如果网络规划不合理而使流量分布不合理,就会在云系统中形成很多瓶颈,云系统的性能就会受到很大的影响,特别是在很多初学者还不具备完全灵活应用OpenStack各个组件的情况下,如果沿用官方文档的部署方案设计线上系统,那么网络的情况会变得更为重要。

针对这种情况,我认为需要一个章节专门汇集一下与OpenStack相关的网络背景知识,使初学者不必多方查找,节省一些时间,这些内容有以下几个方面。

  • 网桥:用于OpenStack FlatDHCP部署模式。

  • VLAN:用于OpenStack VLAN部署模式。

  • GRE:用于OpenStack multi namespace部署模式。

  • VXLAN:用于OpenStack multi namespace部署及多数据中心迁移模式(后期版本)。

这里提及的VXLAN在OpenStack目前的G或H版中并没有完全使用,但我相信这个技术对后期大规模的线上系统有很大的影响。

当然,由于篇幅限制,这里我们也只能讲一些核心的网络知识,若要深入理解其中的某些细节,建议读者再多看一些资料。

2.1 网卡管理工具 ethtool

很多时候我们对网卡的配置都是直接写网卡配置文件或是使用ifconfig之类的命令,而实际上如果对网卡进行更多细微的调整,则需要使用ethtool网卡管理工具,比如设置网卡速率或者全双工等工作模式时就需要使用此工具。

2.1.1 安装与使用ethtool

在Ubuntu下安装ethtool非常简单,相关代码如下所示:

root@GCM1:~# apt-get install ethtool

在CentOS下安装ethtool也很简单,代码如下所示:

[root@localhost ~]# yum install ethtool

ethtool可用于设置一些特殊的网卡处理要求,如强制eth0网卡处于1000 MB、全双工状态,相关代码如下所示:

ethtool -s eth0 autoneg off speed 1000 duplex full

在Ubuntu系统使用ethtool工具查看网卡基础信息的代码如下所示:

root@GCM1:~# ethtool eth0
Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Supported pause frame use: No
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Speed: 100Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: Unknown
    Supports Wake-on: g
    Wake-on: d
    Link detected: yes

在CentOS系统下使用ethtool工具查看网卡信息的代码如下所示:

[root@localhost ~]# ethtool em1
Settings for em1:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes:  10baseT/Half 10baseT/Full
                        100baseT/Half 100baseT/Full
                        1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: g
Wake-on: d
Link detected: yes

注意,在Dell R710服务器下安装CentOS 6.2时,网卡名被标记为em1、em2、em3、em4等。

ethtool工具配置网卡的参数最终需要以文件的形式保存下来,这个文件在不同操作系统下保存的位置不同。

  • Ubuntu下:这个文件的位置为/etc/network/interfaces。

  • CentOS下:这个文件的位置为/etc/sysconfig/network-scripts/ifcfg-eth0。

在Ubuntu系统下重启网卡配置的代码如下所示:

root@GCM1:/etc/network# /etc/init.d/networking restart

在CentOS系统下重启网络服务的代码如下所示:

service network restart

2.1.2 网卡子接口

有时OpenStack实验环境中的机器只有一个网卡,但我们希望在连接同一个物理网络时,网卡能同时具有多个IP地址,此时我们需要创建一个或多个子接口,使本机能够接入多个IP网段之中。

在Ubuntu系统下网卡配置子接口的代码如下所示:

auto eth2
iface eth2 inet static
address 12.7.2.2
netmask 255.0.0.0

auto eth2:0
iface eth2:0 inet static
address 12.7.2.21
netmask 255.0.0.0

root@GCM1:/etc/network# ifconfig
eth2      Link encap:Ethernet HWaddr 78:2b:cb:43:5d:cc
          inet addr:12.7.2.2 Bcast:12.255.255.255 Mask:255.0.0.0
          inet6 addr: fe80::7a2b:cbff:fe43:5dcc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:10 errors:0 dropped:21514 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1251 (1.2 KB) TX bytes:1705 (1.7 KB)
          Interrupt:32 Memory:da000000-da012800

eth2:0    Link encap:Ethernet HWaddr 78:2b:cb:43:5d:cc
          inet addr:12.7.2.21 Bcast:12.255.255.255 Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          Interrupt:32 Memory:da000000-da012800

在CentOS系统下子接口需要另建一个网卡配置文件,如在em2网卡上创建一个子接口,配置文件/etc/sysconfig/network-scripts/ifcfg-em2:0的内容如下所示:

DEVICE=em2
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONPARENT=yes

由于子接口本身是一个物理网卡,因此可以单独配置IP地址。同样,如果用于实验的机器只有一个物理网卡,我们可以创建多个子接口来模拟多个网段的情况。

2.1.3 网卡信息文件

我们在OpenStack系统的搭建过程中安装控制服务的虚拟机时,有时为了简化操作,我们会直接以某个虚拟机为基础,用cp命令等方式复制出其他的虚拟机。但这样做会发生一个奇怪的现象,就是虚拟机启动后,虽然IP地址等都不与其他虚拟机冲突,但就是无法ping通其他节点。

造成这个现象的原因与虚拟机中的/etc/udev/rules.d/70-persistent-net.rules文件有关,此文件记录了虚拟机在第一次创建时系统学习到的网卡信息及MAC地址。通过复制产生的虚拟机如果不删除这个文件,就算我们在虚拟机的XML描述文件中更改了MAC的地址,但由于虚拟机启动后Linux内核仍从此文件中读取网卡与MAC信息,因此外部更新后的网卡地址等信息内核还是无法学习到。所以,如果新创建的虚拟机是从其他虚拟机复制而来的,那么需要将虚拟机中的70-persistent-net.rules文件删除,这样虚拟机启动后就可以得到新的网卡配置信息了。以下是这个文件的信息,供读者了解:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key

# PCI device 0x14e4:/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.1 (bnx2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="78:2b:cb:43:5d:ce",
    ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"

# PCI device 0x14e4:/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0 (bnx2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="78:2b:cb:43:5d:cc",
    ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

# PCI device 0x14e4:/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1 (bnx2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="78:2b:cb:43:5d:ca",
    ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# PCI device 0x14e4:/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 (bnx2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="78:2b:cb:43:5d:c8",
    ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

2.1.4 OpenStack:运用网卡子接口模拟多网卡

由于一个网卡可以创建多个子接口,而每个子接口又可以加入不同的网桥,这样虽然我们在安装OpenStack时只有一张网卡,但实际上可以模拟一个多网卡、多网桥的网络环境,这在配置FlatDHCP安装模式时很有用。

2.2 网桥及网桥管理工具 bridge-utils

很多人刚开始学习OpenStack时,难以理解网桥的概念。不同于物理机,虚拟机没有硬件设备,我们在虚拟机中配置了网卡,但这些网卡连接到哪里呢?

网桥就是为了解决虚拟机的网卡连接问题。创建网桥后,就像网络交换机具有物理网络接口一样,我们就可以进一步在网桥上创建多个虚拟的物理接口,然后再将每个接口与虚拟机的网卡连接。在Linux操作系统的KVM虚拟化环境内,为挂载虚拟机,网桥接口的标识通常会是vnet0、vnet1等符号。

图2-1展示了虚拟机、网桥、物理机网卡以及外部交换机间的关系。在本书的实验环境中我们使用的是Dell服务器,物理机网卡标识为em1、em2、em3和em4。

{%}

图 2-1 虚拟机、网桥、物理机网卡以及外部交换机间的关系

图2-1共有3个网桥,其中br1与br2分别与宿主机的em1与em2物理端口连接,且宿主机的em1连接到互联网上。br800虽然连接虚拟机D,但却不与任何宿主机的物理端口连接,因此与br800连接的虚拟机是无法访问外网的。

vnet0通过uml-utilities工具生成虚拟机的物理接口,最终这些接口会被加入到网桥上,从而完成虚拟机与网桥的接连。而bridge-utils工具则用于在操作系统中创建网桥。由于很多虚拟机特别是OpenStack使用的qemu-kvm环境,其网卡的标识都是自动创建的,因此我们不会讲解uml-utilities工具,而是将重点集中于如何使用该工具在系统中创建网桥。

2.2.1 安装与使用bridge-utils

CentOS系统下的网桥管理工具是bridge-utils包。安装该工具后,可以使用brctl命令创建、查看与管理网桥,相关代码如下所示:

[root@localhost network-scripts]# yum install bridge-utils
[root@localhost network-scripts]# brctl
Usage: brctl [commands]
commands:
    addbr           <bridge>                add bridge
    delbr           <bridge>                delete bridge
    addif           <bridge> <device>       add interface to bridge
    delif           <bridge> <device>       delete interface from bridge
……

使用brctl命令创建网桥br1,并将em1端口加入此网桥,例如:

[root@localhost network-scripts]# brctl addbr br1
[root@localhost network-scripts]# brctl addif em1
[root@localhost network-scripts]# ifconfig em1 0.0.0.0
[root@localhost network-scripts]#ifconfig br1 172.21.1.3 netmask 255.255.0.0

在上述配置中,同时将em1的IP地址去除了,并创建了网桥的IP地址。

网桥包括的端口信息如下所示:

[root@localhost ~]# brctl show br1
bridge name     bridge id               STP enabled     interfaces
br1             8000.d4ae52640406       no              em1
                                                        vnet0
                                                        vnet12
                                                        vnet16
                                                        vnet20
                                                        vnet24
                                                        vnet28
                                                        vnet32
                                                        vnet36
                                                        vnet4
                                                        vnet40
                                                        vnet44
                                                        vnet8

上述信息表示,br1网桥上除了连接有宿主机的物理端口em1外,还有一系列以vnet××命名的网桥端口,每个虚拟机的网卡都连接到不同的vnet端口上。

2.2.2 理解网桥的IP地址与虚拟机的IP地址

如同交换机和平时家用的ADSL上网设备都有一个管理用的IP地址一样,配置了网桥的IP地址后,即可通过Telnet或SSH以此IP地址访问宿主机。比如在下面的例子中可以使用SSH连接172.21.1.3的IP地址,通过em1物理端口登录到宿主机的CentOS操作系统:

[root@localhost ~]# ifconfig
br1        Link encap:Ethernet HWaddr D4:AE:52:64:04:06
           inet addr:172.21.1.3 Bcast:172.21.255.255 Mask:255.255.0.0
           inet6 addr: fe80::d6ae:52ff:fe64:406/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
           RX packets:2029839 errors:0 dropped:0 overruns:0 frame:0
           TX packets:66524 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:111721520 (106.5 MiB) TX bytes:6409933 (6.1 MiB)

与网桥连接的虚拟机IP地址可以设置为与网桥处于同一个IP网段,也可以设置为不相同的IP网段。比如,我们可以将虚拟机的IP地址设置为192.168.1.0/24,而外部的交换机设置为192.168.1.1的网关地址,这样虚拟机就可以通过外部交换机访问互联网,虽然此时br1桥的IP地址是172.21.1.3。

2.2.3 Ubuntu系统下网桥的配置文件

Ubuntu系统下网卡、网桥等的配置信息都会汇集到一个/etc/network/interfaces文件中,例如:

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    bridge_ports eth0

2.2.4 CentOS系统下网桥的配置文件

brctl命令对网桥的配置需要以文件的形式保存下来,这样系统再次启动后所有配置仍能生效。br1网桥的配置文件ifcfg-br1的信息如下所示:

DEVICE="br1"
TYPE=Bridge
BOOTPROTO=static
IPADDR=172.21.1.3
NETMASK=255.255.0.0
NETWORK=172.21.0.0
GATEWAY=172.21.1.1
DNS1=61.139.2.69
ONBOOT="yes"

而此时em1网卡的配置文件ifcfg-em1的内容如下所示:

DEVICE="em1"
HWADDR="D4:AE:52:64:04:06"
#NM_CONTROLLED="yes"
ONBOOT="yes"
BRIDGE="br1"

2.2.5 将虚拟机与某个网桥连接

我们在创建虚拟机时,在CentOS系统下可以通过virt-manager图形化工具将虚拟机挂接到指定的网桥上,或者增加虚拟机的网卡数量,分别挂到不同的网桥上。如图2-2所示,当前虚拟机(共4块网卡)的第一个网卡与网桥br1连接。

{%}

图 2-2 虚拟机网卡与网桥的连接

2.3 虚拟局域网 VLAN

虽然我们可以使用网桥的办法连接很多虚拟机,但它的局限性也很清晰。网桥上的其他虚拟机可以收到某个虚拟机发出的二层广播包,当多个虚拟机都挂载在同一个网桥上时,由每个虚拟机发出的广播包而引起的广播风暴会使网桥的通信吞吐能力大幅度下降,从而使虚拟机的网络性能急剧下降。因此需要某种机制,使得某个或某几个虚拟机的广播包能限制在一定范围内,这样就不会影响其他的虚拟机。这种技术就是802.1Q机制,或者我们说的VLAN。

当多台虚拟机被划分到不同的VLAN后,同一VLAN中的机器相当于连接在一个网桥中,而不同VLAN之间的通信是被隔离的。当今的很多企业在内网的交换机上已经广泛应用了VLAN技术,以隔离不同的网络,在提高安全性的同时也提升了性能。

在Linux操作系统内部的虚拟化环境中,我们通常会将网桥与VLAN对应起来,即A网桥划分到VLAN A中,B网桥划分到VLAN B中。下面我们将更进一步阐述VLAN方面的知识。

2.3.1 VLAN协议 802.1Q

如果不过多地引用理论,只从便于理解的角度来看,802.1Q的作用是将每个虚拟机发出的包加一个标签,一个局域网内共有4096个标签,每个标签可以看做一个独立的网络(Virtual LAN),每个虚拟机只能接收与自身VLAN号码相同的数据包,如图2-3所示。

{%}

图 2-3 虚拟机、桥与VLAN

虚拟机A与虚拟机A1虽然分处于不同的宿主机,但这两台机器中每个二层数据包均有一个VLAN 1的号码标签,因此虚拟机A与虚拟机A1可以互相收到对方发出的数据包,并且虚拟机A与虚拟机A1的广播包也被限定在这两台机器之间,不会扩散到其他机器上。

2.3.2 接入端口与中继端口

我们将数据包打上VLAN号码标记的端口称为接入端口(access port),而将不处理标签,只是转发数据包的端口称为中继端口(trunk port)。图2-3中各个虚拟机在桥上的接口vnet××等就是接入端口,而宿主机的物理网卡em1以及交换机的s1端口则为中继端口。

2.3.3 VLAN管理工具vconfig

在Linux系统下,VLAN的管理工具是vconfig。结合运用bridge-utils与vconfig工具,我们可以创建网桥并将其与VLAN关联。

1. vconfig的安装

在Ubuntu系统下安装vconfig以及加载802.1Q很简单。安装完VLAN包后,vconfig工具也一同安装完毕,相关代码如下所示:

apt-get install vlan
modprobe 8021q

为了使机器下次启动时能自动加载802.1Q包,我们将其加入到/etc/modules文件中,相关代码如下所示:

8021q

2. 创建VLAN接口与网关IP地址

Linux的VLAN机制是,如果物理机器只有一个网卡,我们可以在这个网卡上建立多个VLAN,也就是说多个 VLAN 的数据可以通过这个物理网卡对外转发。而每个 VLAN 以独立的接口(interface)体现,比如我们打算在eth2上创建2、3、4号VLAN,那么就需要创建eth2.2、eth2.3、eth2.4这3个不同的接口。

同时,我们也可以为每个VLAN接口分配不同的IP地址,让每个IP地址成为每个VLAN内部的对外访问网关,如我们可以将eth2.2设置为192.168.2.1,以此作为此VLAN内的网关地址。

在下面的示例中,我们在eth2上分别创建2、3、4号VLAN的接口,分别赋予这些接口IP地址,并加入到主机路由表中:

vconfig add eth2 2
vconfig add eth2 3
vconfig add eth2 4
ifconfig eth2.2 192.168.2.1 netmask 255.255.255.0 up
ifconfig eth2.3 192.168.3.1 netmask 255.255.255.0 up
ifconfig eth2.4 192.168.4.1 netmask 255.255.255.0 up
ip route add 192.168.1.0/24 dev eth2.2
ip route add 192.168.2.0/24 dev eth2.3
ip route add 192.168.3.0/24 dev eth2.4

如果要删除已创建的VLAN 2接口eth2.2,则可以使用以下语句:

vconfig rem eth2.2

这些VLAN接口的作用是将其加入到桥中,使得某个桥与VLAN关联起来。

3. 虚拟化环境中网桥与VLAN的结合

在虚拟化环境下,虚拟机连接在不同的网桥接口上,而如果将已经创建好的各个VLAN接口加入到不同的网桥中,则不同的网桥流量就会进入到不同的VLAN中。

如我们准备创建br1网桥,且br1网桥将eth2.2 VLAN接口加进来,这样br1上的虚拟机就都处于VLAN 2中。注意,此时的eth2.2端口是中继端口,可以转发此网桥中所有的流量:

vconfig add eth2 2
ifconfig eth2.2 up
brctl addbr br1
brctl addif br1 eth2.2

br1网桥创建后,桥下就自动生成一个br1接口。将eth2.2加进来后,这个桥就有了两个接口,即br1与eth2.2。为了给此桥上的虚拟机创建一个网关,通常情况下我们会将br1作为VLAN 2的接口赋予其IP地址。相较于将eth2.2作为VLAN 2的接口的做法,这样好记一些:

ifconfig br1 192.168.2.1 netmask 255.255.255.0 up
ip route add 192.168.1.0/24 dev br1

我们可以将上述配置写入网卡配置文件/etc/network/interface中,相关代码如下所示:

atuo eth2
auto eth2.2
auto br1

iface eth2.2 inet static
ifconfig eth2.2 0.0.0.0 up
vlan-raw-device eth2

iface br1 inet static
address 192.168.2.1
netmask 255.255.255.0
bridge-ports eth2.2
bridge_stp off
bridge_fd 0

4. 交换机中的VLAN IP接口

在上述的操作中,我们将VLAN 2的网关192.168.2.1创建在Linux主机中,这对于一或两台机器的简单应用来说是可以满足的,但如果几十台机器都通过交换机连接,更好的办法是将VLAN 2的网关都创建到交换机中。如图2-3所示,我们在物理机中只创建桥与VLAN,而VLAN 2的网关IP则创建在交换机中,同时不同的VLAN间的互访也通过交换机中的路由表来实现。比如图2-3中,不同物理机中的VLAN 2若要访问VLAN 3,则要通过交换机来完成。当然,有时需要限制不同VLAN间的互访,因此还需要在交换机配置不同的访问控制规则。

由于OpenStack系统在计算节点中自动处理VLAN,不需要人工干涉,这减少了我们的工作量。

2.4 主机多网卡静态路由配置

在实际的OpenStack安装过程中,特别是在生产类系统的处理中,为了使网络流量更加均衡,我们通常会使用多块网卡连接多个不同的网段,此时就需要通过建立路由表的形式处理网络路径。

例如服务器中有6个可用的网卡,其中eth0的IP地址是20.1.1.6,eth5的IP地址是25.1.1.6。我们期望上网时走eth5,即eth5与网关25.1.1.1的交换机连接;而若是访问30.1.0.0的网段时则能够走eth0,原因是20.1.1.6的网段连接到了交换机上,交换机上同时有20.1.1.1和30.1.1.1的IP接口。同样,如果访问80.1.0.0网段时,我们也希望能通过eth5,因为eth5连接的交换机中有25.1.1.1与80.1.1.1的网关地址,透过这个网关地址可以访问到80网段。以下代码是配置信息,并可放入rc.local中,开机启动即可:

route del default
route add default gw 25.1.1.1 dev eth5
route add -net 30.1.0.0 netmask 255.255.0.0 gw 20.1.1.1 dev eth0
route add -net 80.1.0.0 netmask 255.255.0.0 gw 25.1.1.1 dev eth5

上述的代码表明,如果上网等流量通过default gw完成,即通过eth5走出去,若要访问计算节点的30网段,则通过端口eth0从20.1.1.1的路由器转至30.1.0.0网段。

2.5 Open vSwitch 简介与实验

Open vSwitch是OpenStack在操作系统中使用的虚拟交换机插件,了解它的基本操作对后期安装非常有帮助。

2.5.1 Open vSwitch简介

随着虚拟化技术的发展,是否能够用软件在宿主机内构成一台与硬件交换机具备相同特性的软件交换机,以更好地服务宿主机的虚拟机内外通信呢?这就催生了Open vSwitch。

Open vSwitch即开放的软件虚拟交换机,能够达到产品级质量,也就是说可以部署在一些生产环境中使用。它的出现更多是满足虚拟化技术的要求。因为在虚拟化环境中,主机都是创建在操作系统中的,而多个主机间的连接除了可以使用Linux的网桥、VLAN等传统做法来实现外,还可以通过虚拟交换机Open vSwitch来连接。Open vSwitch不仅支持基本的二层交换,还支持标准的管理接口和协议(如NetFlow、sFlow、SPAN、RSPAN、CLI、LACP、802.1ag),同时也支持OpenFlow,可以很好地与SDN体系融合。

由于Open vSwitch开放且能够满足各类应用的要求,OpenStack也在F、G等版本中提供了对Open vSwitch的支持,因此了解Open vSwitch是如何运作的对于后期OpenStack系统的安装与管理非常有帮助。本节中,我们将多花一点文字介绍Open vSwitch的独立安装与管理。

以下内容是在单独一台机器上安装Open vSwitch及相关操作的实验记录。分享这些记录的目标是为了方便读者理解它的各方面操作,特别是相较于Linux的相关工具而言。实验中,我们会将Open vSwitch简称为OVS。

2.5.2 安装Open vSwitch

在安装完Ubuntu 12.04并完成所有的更新后,我们可按如下步骤开始在Ubuntu 12.04上安装Open vSwitch。

1. 安装KVM包

我们可按如下步骤完成KVM虚拟化环境的准备工作,确保操作系统支持802.1Q VLAN。

1. 安装软件包的代码如下所示:

apt-get install kvm libvirt-bin virtinst

2. 检查系统是否支持KVM,相关代码如下所示:

kvm-ok
modprobe kvm
modprobe kvm-intel

3. 加载802.1Q,相关代码如下所示:

apt-get install vlan
modprobe 8021q

4. 将上述配置写入modules文件。以下是此文件的相关内容:

# /etc/modules: kernel modules to load at boot time
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored

kvm
kvm-intel

loop
lp
rtc
8021q

2. 安装OVS对KVM的支持包及脚本

首先,安装用于虚拟机网卡处理的uml-utilities软件包,如下所示:

apt-get install uml-utilities

接着创建以下两个脚本文件——/etc/ovs-ifup和/etc/ovs-ifdown,它们用于虚拟机启动时创建虚拟机网卡。

/etc/ovs-ifup的内容如下所示:

#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1

/etc/ovs-ifdown的内容如下所示:

#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1

让这两个脚本文件可以运行的代码如下所示:

Chmod +x /etc/ovs*

3. 删除virbr0网桥及ebtables

如果存在virbr0及ebtables则需要删除,相关代码如下所示:

virsh net-destroy default
virsh net-autostart --disable default
apt-get purge ebtables

4. 安装OVS包及brcompat_mod

安装OVS包的代码如下所示:

apt-get install kvm libvirt-bin openvswitch-controller openvswitch-brcompat openvswitch-switch openvswitch-datapath-source

brcompat_mod是Open vSwitch为了兼容bridge_utils而提供的,也就是说当OVS运行时,仍可使用brctl等工具处理桥的相关参数。

接着设置brcompat_mod与OVS一同启动。编辑/etc/default/openvswitch-switch,允许brcompat启动,相关代码如下所示:

……
BRCOMPAT=yes

然后编译安装brcompat。执行以下命令,加载brcompat_mod:

module-assistant auto-install openvswitch-datapath

最后检查是否加载了brcompat:

root@CM214:~# lsmod | grep brcom
brcompat               13512 0
openvswitch            84038 1 brcompat

5. 启动OVS服务

使用service openvswith-switch start/stop方式来启动或关闭OVS,相关代码如下所示:

root@CM214:/home/romi# service openvswitch-switch start
 * Inserting openvswitch module
 * /etc/ openvswitch /conf.db does not exist
 * Creating empty database /etc/ openvswitch /conf.db
 * Starting ovsdb-server
 * Configuring Open vswitch system IDs
 * Starting ovs-vswitchd
 * Enabling gre with iptables

2.5.3 使用ovs-vsctl管理OVS

OVS提供了几个不同的管理工具,其中最常用的是ovs-vsctl,本节就来简要介绍一下如何使用它管理OVS。

1. 网桥相关操作

增加网桥的代码如下所示:

# ovs-vsctl add-br br0

将网卡加入网桥的代码如下所示:

# ovs-vsctl add-port br0 eth0

查看OVS中所有网桥及端口信息的代码如下所示:

# 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"

将eth0加入到br0网桥后,eth0网卡不再需要配置IP地址,我们将其IP地址重新配置为0,如下所示:

root@CM214:~# ifconfig eth0 0
root@CM214:~# ifconfig
eth0      Link encap:Ethernet HWaddr d4:ae:52:66:70:02
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:1319 errors:0 dropped:45 overruns:0 frame:0
          TX packets:517 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:125684 (125.6 KB) TX bytes:67143 (67.1 KB)
          Interrupt:36 Memory:d6000000-d6012800

eth0没有IP地址,我们该如何通过eth0所在的网段访问服务器呢?答案是我们给eth0归属的br0网桥配置IP地址及网关,这里我们将br0网桥的地址配成10.2.1.4,然后就可以通过此地址访问服务器了,代码如下所示:

root@CM214:~# ifconfig br0 10.2.1.4 netmask 255.0.0.0
root@CM214:~# ifconfig
br0       Link encap:Ethernet HWaddr d4:ae:52:66:70:02
          inet addr:10.2.1.4 Bcast:10.255.255.255 Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:397 errors:0 dropped:31 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:32354 (32.3 KB) TX bytes:174 (174.0 B)

eth0      Link encap:Ethernet HWaddr d4:ae:52:66:70:02
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:1421 errors:0 dropped:45 overruns:0 frame:0
          TX packets:520 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:133774 (133.7 KB) TX bytes:67365 (67.3 KB)
          Interrupt:36 Memory:d6000000-d6012800

2. 保存OVS的配置

保存OVS的配置有两种办法,一种办法是将上述配置指令写到/etc/rc.local中,如下所示:

ovs-vsctl add-br br0
ovs-vsctl add-br br3
ovs-vsctl add-port br0 eth0
ovs-vsctl add-port br3 eth3
ifconfig eth0 0 && ifconfig br0 10.2.1.4 netmask 255.0.0.0
ifconfig eth3 0 && ifconfig br3 13.2.1.4 netmask 255.0.0.0
route add default gw 13.1.1.1 br3

另一种办法是将配置直接写到/etc/network/interfaces中,如下所示:

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 10.2.1.4
netmask 255.0.0.0

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

auto eth1
iface eth1 inet dhcp

auto eth2
iface eth2 inet dhcp

auto br3
iface br3 inet static
address 13.2.1.4
netmask 255.0.0.0
gateway 13.1.1.1
dns-nameservers 61.139.2.69

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

2.5.4 OVS的数据库配置与网络配置文件的关系

有时我们想弄清OVS本身的配置与/etc/network/interface文件的关系,这里我们详细介绍一下。

OVS的配置写在一个ovsdb数据库中。ovsdb是一个非常轻量级的数据库,与其说它是一个数据库,不如说它是一个提供增删查改等功能的临时配置缓存。之所以这么说,是因为ovsdb数据库根本就未使用多少数据库技术,如SQL语言查询、存储过程等。

ovsdb数据库操作的一般格式为:

ovs-vsctl list/set/get/add/remove/clear/destroy table record column [value]

默认情况下,ovsdb中有以下数据表:bridgecontrollerinterfacemirrornetflowopen_vswitchportqosqueuesslsflow。即table可为其中的任意一个,record为数据表中name字段的值,column为数据表中任意一个字段的字段名,即value字段值。

比如,我们可以使用ovs-vsctl list bridge命令查询ovsdb的bridge表中关于桥与网卡的信息,如下所示:

root@CM214:~# ovs-vsctl list bridge
_uuid               : 0645823c-613c-492b-8322-527840797260
name                : "br3"
ports               : [76ca46d6-6d29-4f0c-9086-7c094856d321, 794e2a41-7692-49da-aae0-cc7eb12aa16c]

_uuid               : 23de99d6-8c02-4016-aff1-471155d469c7
name                : "br0"
ports               : [a55577e6-d173-4bbe-9957-41a6d0566b52, e5a14d8a-be98-454e-9824-631a9517dc99]

查看port表中的信息:

root@CM214:~# ovs-vsctl list port
    _uuid               : 794e2a41-7692-49da-aae0-cc7eb12aa16c
    interfaces          : [9b63edb8-4a5f-4c39-89ce-e24f3549a4ac]
    name                : "eth3"

    _uuid               : 76ca46d6-6d29-4f0c-9086-7c094856d321
    interfaces          : [e97a975b-6745-4af0-8c7c-e6bc1c645cc3]
    name                : "br3"

    _uuid               : a55577e6-d173-4bbe-9957-41a6d0566b52
    interfaces          : [b9b16633-60df-4a90-b255-649b4f58bb60]
    name                : "br0"

    _uuid               : e5a14d8a-be98-454e-9824-631a9517dc99
    interfaces          : [1381f041-6516-46a9-974a-86774e1521bb]
    name                : "eth0"

由上面的信息可以看到,bridge数据表中br3的桥包括了br3和eth3端口的UUID,这样就完整地记录了桥与端口的关系。同时我们也可以看到每个桥会“隐含”地建立同名的端口。但是,数据库中并不记录每个桥的IP地址,即IP地址仍由/etc/network/interface文件记录。这就是ovsdb与/etc/network/interface文件间的关系。

2.5.5 VLAN的设置及VLAN接口IP地址

那么,OVS如何设置中继与接入端口,以及如何创建VLAN及设置VLAN接口IP地址呢?

将eth0作为中继端口加到br0桥中,代码如下所示:

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

在br0中增加vlan1与vlan2端口,分别属于VLAN 1与VLAN 2,代码如下所示:

ovs-vsctl add-port br0 vlan1 tag=1
ovs-vsctl add-port br0 vlan2 tag=2

设置vlan1端口的IP地址,相关代码如下所示:

ovs-vsctl set Interface vlan1 type=internal
ifconfig vlan1 192.168.1.1 netmask 255.255.255.0

ovs-vsctl set Interface vlan2 type=internal
ifconfig vlan2 192.168.2.1 netmask 255.255.255.0

2.5.6 OVS支持OpenFlow的SDN模式

在SDN模式下,交换机通过OpenFlow协议与控制器(controller)连接,控制器确定转发表后下发到交换机中,交换机根据转发表在各个端口间转发数据。

在OVS安装完成后,OVS控制器会自动安装。控制器工作在操作系统中的6633端口,若要将OVS与控制器连接,那么需要在OVS中创建一个网桥,此网桥包含物理网卡,并透过物理网卡与操作系统中的OVS OpenFlow控制器连接,代码如下所示:

ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0
ifconfig eth0 0
ifconfig br0 192.168.88.101 netmask 255.255.255.0

确保br0与OVS控制器能ping通,完成与OVS控制器的连接,代码如下所示:

ovs-vsctl set-controller br0 tcp: 192.168.88.100:6633

执行ovs-vsctl show命令,可以看到如下信息:

controller "tcp:192.168.88.100:6633"
ts_connected: true

在OVS控制器上操作OVS时,可以使用ovs-ofctl命令来处理。

2.6 构建 OpenStack 云中的网络 GRE

我们早前通常用VLAN的方法将局域网络内多个租户的网络切分开,以确保租户间的网络隔离,但只能划分出4096个VLAN的特点,限制了整个云系统的规模。因此,自F版开始,OpenStack引入GRE的方法来突破这一限制。

2.6.1 VLAN的局限

为了建设较高安全性的OpenStack云系统,必须将其中的租户之间完全隔离。使用VLAN虽然能实现这个目标,但由于一个网络管理域中最大只有4096个VLAN,因此一套OpenStack系统如果按每个租户分配一个VLAN网络的模式,最多只能支持4096个租户。这对企业私有云来说可能够用了,但对公共云来说,规模明显地受到限制。

OpenStack在F、G等版本提供了GRE隧道的方法,将一个租户下所有的网络封装在不同的隧道中进行通信,而每个租户则可以创建多个IP网段,云中的租户与网段数量不再受到限制,这就突破了原来VLAN的4096个租户的数量限制。若使用VXLAN作为云中的网络技术,则可进一步允许用户在租户中创建多个VLAN,且同一个租户下的VLAN可以通过VXLAN隧道透传。

为了将租户在云中的计算和网络资源与GRE通道结合起来,在G、H等版本中又使用了命名空间(namespace)的方法实现资源隔离。

通过使用命名空间方法,除了虚拟机以外,我们还可以为不同的租户建立不同的网络域,而多个网络域间相互隔离。使用网络域后,多个不同的网络域中可以有相同的IP网段与VLAN号码,也就是说云系统管理员不再担心云中网络地址重叠的问题,可以允许租户随意定义租户的内部网络,云系统的管理工作量大大减轻。

2.6.2 GRE隧道在OpenStack中应用的不足

由于GRE是一个点对点的隧道技术,因此,当有3个节点时,就需要在两两节点之间分别建立GRE通道。而若虚拟机的创建计划策略(scheduler)不合理,极端情况下会出现一个租户内的近百台虚拟机可能刚好分配到了云中不同的计算节点服务器上,此时一个租户内的通信会分散到整个云系统中,所有计算节点两两间均需建立GRE通道的后果是所有计算节点服务器间形成一个接近网状的GRE通道,从性能、维护、管理及故障恢复的角度来说是一个很大的问题。

所以,在我们的实验中,以OpenStack为基础的计划策略是将一个租户的虚拟机尽可能地创建在一台计算节点中。我个人的看法是,尽可能减少多个计算节点间的通信量,以弥补GRE通道的不足。当然,这只是我的看法,不一定成熟,还望读者参看更多资料研究这个问题。

2.6.3 VXLAN的优势

对于习惯于传统网络技术的人员来说,对于生产类OpenStack系统来说,我更倾向于直接使用成熟的交换机、路由器等方案作为云系统中网络通信的枢纽,而支持VXLAN功能的交换机使得我们有机会将更多的数据交换通过交换机完成,而非GRE模式的多个计算节间点对点的流量模式。

RFC草案所描述的VXLAN标准使用一个名为VXLAN网络标识符(VNI)的24位标识符,将与应用程序关联的VLAN分组到一个片段中。每一个管理域能够定义多达1600万个VNI,而每一个VNI可能最多包含4096个VLAN。客户数据会保证分离,因为只有运行在同一个VNI的VM可以进行通信。这样,同一租户的VM不仅可以跨多数据中心部署,而且也使得整个云系统能够支持的租户数量不受限制,完全突破了原来VLAN的限制。

目前,一些网络厂商也纷纷推出了支持VXLAN功能的数据中心交换机,透过VXLAN的技术可以将所有的OpenStack计算节点服务器均连接到VXLAN交换机上,利用交换机的强大包处理功能与成熟的代码,使OpenStack系统获得比GRE更好的系统稳定性。

2.6.4 Open vSwitch对VXLAN的不足

当前,Open vSwitch对VXLAN的支持仅限于点对点之间。与GRE相差不大,Open vSwitch不支持组播建立VXLAN,如以下命令在OVS中无法执行:

ovs-vsctl add-port brvm vx14 -- set interface vx14 type=vxlan options:mcast_ip=239.1.1.2
ovs-vsctl add-port brvm vx15 -- set interface vx15 type=vxlan options:mcast_ip=239.1.1.2

2.7 Linux 内核的 VXLAN 功能实验记录

为了让读者对VXLAN有一些基本了解,这里我们将我们基于Linux内核的VXLAN实验记录展示出来。Linux内核支持VXLAN的组播功能,可以让我们将来有机会进一步与支持VXLAN的交换机结合,设计出集稳定与性能俱佳的云网络系统。

2.7.1 实验环境及目标

在实验环境中,我们使用了两台安装了Ubuntu 13.04操作系统的虚拟机,原因是13.04的内核版本为3.8,而VXLAN内核要求至少支持3.7,本书中使用的Ubuntu12.04版本达不到这项实验的要求。

我们的实验环境采用两台机器,名为vxlangateway14的IP地址是10.7.1.14,名为vxlangateway15的IP地址是10.7.1.15。Linux VXLAN功能实验如图2-4所示。

{%}

图 2-4 Linux VXLAN功能实验

实验环境说明如下几点。

  • 在vxlangateway14上创建名为vxlan0、包含了eth0物理接口的VXLAN接口。

  • 将vxlan0加入到内部创建的br0桥中(注:br0本身并不包含eth0物理接口)。

  • 在br0上创建100、101这两个VLAN接口,并赋予不同接口的IP地址。

  • 在vxlangateway15上也做类似的配置。

实验目标是验证VXLAN的机制能否正常工作:如果VXLAN机制工作正确,两台机器内具有相同的VLAN号码、不同的IP地址的接口之间就可以通过VXLAN封包互相ping通。

2.7.2 配置与测试VXLAN

安装桥与8021q模块,相关代码如下所示:

apt-get install -y vlan bridge-utils
modprobe 8021q

增加VXLAN端口、VLAN端口及IP地址,在vxlangateway14上执行如下命令:

ip link add vxlan0 mtu 1500 type vxlan id 42 group 239.1.1.1 local 10.7.1.14 dev eth0

ip link set dev vxlan0 up

brctl addbr br0
brctl addif br0 vxlan0
ifconfig br0 192.168.1.14 netmask 255.255.255.0 up

vconfig add vxlan0 100
ifconfig vxlan0.100 up
ifconfig vxlan0.100 172.16.1.14 netmask 255.255.255.0 up

vconfig add br0 101
ifconfig br0.101 192.192.1.14 netmask 255.255.255.0 up

之后通过ifconfig命令可以看到网络配置情况,具体如下所示:

br0       Link encap:Ethernet HWaddr ce:b5:ca:9e:39:03
          inet addr:192.168.1.14 Bcast:192.168.1.255 Mask:255.255.255.0
          inet6 addr: fe80::ccb5:caff:fe9e:3903/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B) TX bytes:566 (566.0 B)

br0.101   Link encap:Ethernet HWaddr ce:b5:ca:9e:39:03
          inet addr:192.192.1.14 Bcast:192.192.1.255 Mask:255.255.255.0
          inet6 addr: fe80::ccb5:caff:fe9e:3903/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B) TX bytes:328 (328.0 B)

eth0      Link encap:Ethernet HWaddr 52:54:00:80:ab:90
          inet addr:10.7.1.14 Bcast:10.255.255.255 Mask:255.0.0.0
          inet6 addr: fe80::5054:ff:fe80:ab90/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:313 errors:0 dropped:14 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:21091 (21.0 KB) TX bytes:2160 (2.1 KB)

eth3      Link encap:Ethernet HWaddr 52:54:00:83:dd:93
          inet addr:13.7.1.14 Bcast:13.255.255.255 Mask:255.0.0.0
          inet6 addr: fe80::5054:ff:fe83:dd93/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:293 errors:0 dropped:13 overruns:0 frame:0
          TX packets:196 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:22682 (22.6 KB) TX bytes:23799 (23.7 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1 Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING MTU:65536 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

vxlan0    Link encap:Ethernet HWaddr ce:b5:ca:9e:39:03
          inet6 addr: fe80::ccb5:caff:fe9e:3903/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B) TX bytes:1070 (1.0 KB)

vxlan0.100 Link encap:Ethernet HWaddr ce:b5:ca:9e:39:03
           inet addr:172.16.1.14 Bcast:172.16.1.255 Mask:255.255.255.0
           inet6 addr: fe80::ccb5:caff:fe9e:3903/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:0 (0.0 B) TX bytes:238 (238.0 B)

同样,在机器vxlangateway15上执行如下命令:

ip link add vxlan0 mtu 1500 type vxlan id 42 group 239.1.1.1 local 10.7.1.15 dev eth0

ip link set dev vxlan0 up

brctl addbr br0
brctl addif br0 vxlan0
ifconfig br0 192.168.1.15 netmask 255.255.255.0 up

vconfig add vxlan0 100
ifconfig vxlan0.100 up
ifconfig vxlan0.100 172.16.1.15 netmask 255.255.255.0 up

vconfig add br0 101
ifconfig br0.101 192.192.1.15 netmask 255.255.255.0 up

2.7.3 测试与结果

我们在vxlangateway14上ping vxlangateway15的IP地址,可以ping通,以下是相关信息:

root@vxlangateway14:/home/romi# ping 192.192.1.15
PING 192.192.1.15 (192.192.1.15) 56(84) bytes of data.
64 bytes from 192.192.1.15: icmp_req=1 ttl=64 time=1.22 ms
64 bytes from 192.192.1.15: icmp_req=2 ttl=64 time=0.493 ms
^C
--- 192.192.1.15 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.493/0.856/1.220/0.364 ms

root@vxlangateway14:/home/romi# ping 172.16.1.15
PING 172.16.1.15 (172.16.1.15) 56(84) bytes of data.
64 bytes from 172.16.1.15: icmp_req=1 ttl=64 time=0.705 ms
64 bytes from 172.16.1.15: icmp_req=2 ttl=64 time=0.251 ms
^C
--- 172.16.1.15 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.251/0.478/0.705/0.227 ms

实验结果表明,VXLAN机制工作正常,两台机器间VLAN的IP地址可以互相ping通。

2.8 Linux 内核 VXLAN 与 Open vSwitch 的结合

如果可以控制虚拟化环境的代码,则可以先在宿主机上创建一个VXLAN接口,然后将VXLAN接口加入Open vSwitch的一个桥中,这样就能让不支持VLAN组播功能的Open vSwitch拥有组播的能力:

ip link add vxlan0 mtu 1500 type vxlan id 42 group 239.1.1.1 local 10.7.1.15 dev eth0

ip link set dev vxlan0 up

ovs-vsctl add-br brvxlan
ovs-vsctl add-port brvxlan vxlan0

上述做法可以使OVS使用内核的VXLAN功能,并支持组播功能。

2.9 小结

本章中,我们介绍了网卡、网桥、VLAN、GRE以及VXLAN等OpenStack涉及的网络背景知识,并提供了大家不太熟悉的Open vSwitch与VXLAN的实验记录,以方便读者更好地理解这些知识。

本章中,我们没介绍qemu-kvm虚拟化环境及其管理工具virt-manager及virsh系列命令的用法,详情可以进一步参看其他资料。有了虚拟化与网络方面的基础知识,对于应用OpenStack有很大帮助。

我们没有深究的一个问题是网络命名空间,它是OpenStack G、H等版本中很重要的概念,只是OpenStack会帮助我们打理一切,无需我们手动操作,但同时也使得我们无法深入理解这个概念。为此,在2.10节中,我提供了“Introducing Linux Network Namespaces”这样一份可以查阅的网络资料,如果读者希望了解得更深,建议据此做更多的手动实验。

让我一直无法释怀的是,没有支持VXLAN的交换机能让我完成基于VXLAN的更多实验,因为我个人认为如果在生产环境中大规模部署G、H等版本,需要考虑基于VXLAN的基础网络,我一直担忧GRE模式下的性能与稳定性问题,因为它的流量在很大程度上处于云管理人员无法把握的点对点模式,很难管理与洞察。当然,这是我个人的看法,希望读者在部署生产环境时查阅更多资料,以设计出更好的云系统网络环境基础。

2.10 参考资源

本章的参考资源如下所示。

目录

  • 前言
  • 第 1 章 OpenStack 基本操作系统环境的 PXE 自动部署
  • 第 2 章 OpenStack 与网络
  • 第 3 章 OpenStack nova-network 多主机部署
  • 第 4 章 OpenStack 中小企业应用部署
  • 第 5 章 OpenStack Quantum VLAN 部署模式
  • 第 6 章 满足中型企业的 OpenStack 部署模式
  • 第 7 章 大型企业的 OpenStack GRE 部署模式
  • 第 8 章 OpenStack 卷服务——Cinder
  • 第 9 章 OpenStack 中央存储及虚拟机动态迁移
  • 第 10 章 OpenStack EC2 接口与 Quota 分配
  • 第 11 章 OpenStack Web 管理界面与云虚拟桌面
  • 第 12 章 OpenStack RabbitMQ 冗余处理
  • 第 13 章 OpenStack 的新组件