上一节我们说到,使用原生的 VLAN 和 Linux 网桥的方式来进行云平台的管理,但是这样在灵活性、隔离性方面都显得不足,而且整个网络缺少统一的视图、统一的管理。 可以这样比喻,云计算就像大家一起住公寓,要共享小区里面的基础设施,其中网络就相当于小区里面的电梯、楼道、路、大门等,大家都走,往往会常出现问题,尤其在上班高峰期,出门的人太多,对小区的物业管理就带来了挑战。 物业可以派自己的物业管理人员,到每个单元的楼梯那里,将电梯的上下行速度调快一点,可以派人将隔离健身区、景色区的栅栏门暂时打开,让大家可以横穿小区,直接上地铁,还可以派人将多个小区出入口,改成出口多、入口少等等。等过了十点半,上班高峰过去,再派人都改回来。 软件定义网络(SDN)这种模式就像传统的网络设备和普通的 Linux 网桥的模式,配置整个云平台的网络通路,你需要登录到这台机器上配置这个,再登录到另外一个设备配置那个,才能成功。 如果物业管理人员有一套智能的控制系统,在物业监控室里就能看到小区里每个单元、每个电梯的人流情况,然后在监控室里面,只要通过远程控制的方式,拨弄一个手柄,电梯的速度就调整了,栅栏门就打开了,某个入口就改出口了。 这就是软件定义网络(SDN)software define network。它主要有以下三个特点。
OpenFlow 和 OpenvSwitchSDN 有很多种实现方式,我们来看一种开源的实现方式。 OpenFlow 是 SDN 控制器和网络设备之间互通的南向接口协议,OpenvSwitch 用于创建软件的虚拟交换机。OpenvSwitch 是支持 OpenFlow 协议的,当然也有一些硬件交换机也支持 OpenFlow 协议。它们都可以被统一的 SDN 控制器管理,从而实现物理机和虚拟机的网络连通。
SDN 控制器是如何通过 OpenFlow 协议控制网络的呢?
在 OpenvSwitch 里面,有一个流表规则,任何通过这个交换机的包,都会经过这些规则进行处理,从而接收、转发、放弃。 那流表长啥样呢?其实就是一个个表格,每个表格好多行,每行都是一条规则。每条规则都有优先级,先看高优先级的规则,再看低优先级的规则。
对于每一条规则,要看是否满足匹配条件。这些条件包括,从哪个端口进来的,网络包头里面有什么等等。满足了条件的网络包,就要执行一个动作,对这个网络包进行处理。可以修改包头里的内容,可以跳到任何一个表格,可以转发到某个网口出去,也可以丢弃。 通过这些表格,可以对收到的网络包随意处理。
具体都能做什么处理呢?通过上面的表格可以看出,简直是想怎么处理怎么处理,可以覆盖 TCP/IP 协议栈的四层。 对于物理层:
对于 MAC 层:
对于网络层:
对于传输层:
总而言之,对于 OpenvSwitch 来讲,网络包到了我手里,就是一个 Buffer,我想怎么改怎么改,想发到哪个端口就发送到哪个端口。 OpenvSwitch 有本地的命令行可以进行配置,能够实验咱们前面讲过的一些功能。我们可以通过 OpenvSwitch 的命令创建一个虚拟交换机。然后可以将多个虚拟端口 port 添加到这个虚拟交换机上。 ovs-vsctl add-br ubuntu_br
实验一:用 OpenvSwitch 实现 VLAN 的功能 下面我们实验一下通过 OpenvSwitch 实现 VLAN 的功能,在 OpenvSwitch 中端口 port 分两种。 第一类是 access port:
第二类是 trunk port:
我们通过以下命令创建如下的环境: ovs-vsctl add-port ubuntu_br first_br ovs-vsctl add-port ubuntu_br second_br ovs-vsctl add-port ubuntu_br third_br ovs-vsctl set Port vnet0 tag=101 ovs-vsctl set Port vnet1 tag=102 ovs-vsctl set Port vnet2 tag=103 ovs-vsctl set Port first_br tag=103 ovs-vsctl clear Port second_br tag ovs-vsctl set Port third_br trunks=101,102 另外要配置禁止 MAC 地址学习。 ovs-vsctl set bridge ubuntu_br flood-vlans=101,102,103
创建好了环境以后,我们来做这个实验。
通过这个例子,我们可以看到,通过 OpenvSwitch,不用买一个支持 VLAN 的交换机,你也能学习 VLAN 的工作模式了。 实验二:用 OpenvSwitch 模拟网卡绑定,连接交换机 接下来,我们来做另一个实验。在前面,我们还说过,为了高可用,可以使用网卡绑定,连接到交换机,OpenvSwitch 也可以模拟这一点。 在 OpenvSwitch 里面,有个 bond_mode,可以设置为以下三个值:
我们搭建一个测试环境。
我们使用下面的命令,建立 bond 连接。 ovs-vsctl add-bond br0 bond0 first_br second_br ovs-vsctl add-bond br1 bond1 first_if second_if ovs-vsctl set Port bond0 lacp=active ovs-vsctl set Port bond1 lacp=active 默认情况下 bond_mode 是 active-backup 模式,一开始 active 的是 first_br 和 first_if。 这个时候我们从 192.168.100.100 ping 192.168.100.102,以及从 192.168.100.101 ping 192.168.100.103 的时候,tcpdump 可以看到所有的包都是从 first_if 通过。 如果把 first_if 设成 down,则包的走向会变,发现 second_if 开始有流量,对于 192.168.100.100 和 192.168.100.101 似乎没有收到影响。 如果我们通过以下命令,把 bond_mode 设为 balance-slb。然后我们同时在 192.168.100.100 ping 192.168.100.102,在 192.168.100.101 ping 192.168.100.103,我们通过 tcpdump 发现包已经被分流了。 ovs-vsctl set Port bond0 bond_mode=balance-slb ovs-vsctl set Port bond1 bond_mode=balance-slb 通过这个例子,我们可以看到,通过 OpenvSwitch,你不用买两台支持 bond 的交换机,也能看到 bond 的效果。 那 OpenvSwitch 是怎么做到这些的呢?我们来看 OpenvSwitch 的架构图。
OpenvSwitch 包含很多的模块,在用户态有两个重要的进程,也有两个重要的命令行工具。
在内核态,OpenvSwitch 有内核模块 OpenvSwitch.ko,对应图中的 Datapath 部分。在网卡上注册一个函数,每当有网络包到达网卡的时候,这个函数就会被调用。 在内核的这个函数里面,会拿到网络包,将各个层次的重要信息拿出来,例如:
在内核中,有一个内核态 Flow Table。接下来内核模块在这个内核流表中匹配规则,如果匹配上了,则执行操作、修改包,或者转发或者放弃。如果内核没有匹配上,则需要进入用户态,用户态和内核态之间通过 Linux 的一个机制 Netlink 相互通信。 内核通过 upcall,告知用户态进程 vswitchd 在用户态 Flow Table 里面去匹配规则,这里面的规则是全量的流表规则,而内核 Flow Table 里面的只是为了快速处理,保留了部分规则,内核里面的规则过一阵就会过期。 当在用户态匹配到了流表规则之后,就在用户态执行操作,同时将这个匹配成功的流表通过 reinject 下发到内核,从而接下来的包都能在内核找到这个规则。 这里调用 openflow 协议的,是本地的命令行工具,也可以是远程的 SDN 控制器,一个重要的 SDN 控制器是 OpenDaylight。 下面这个图就是 OpenDaylight 中看到的拓扑图。是不是有种物业管理员在监控室里的感觉?
我们可以通过在 OpenDaylight 里,将两个交换机之间配置通,也可以配置不通,还可以配置一个虚拟 IP 地址 VIP,在不同的机器之间实现负载均衡等等,所有的策略都可以灵活配置。 如何在云计算中使用 OpenvSwitch? OpenvSwitch 这么牛,如何用在云计算中呢?
我们还是讨论 VLAN 的场景。 在没有 OpenvSwitch 的时候,如果一个新的用户要使用一个新的 VLAN,还需要创建一个属于新的 VLAN 的虚拟网卡,并且为这个租户创建一个单独的虚拟网桥,这样用户越来越多的时候,虚拟网卡和虚拟网桥会越来越多,管理非常复杂。 另一个问题是虚拟机的 VLAN 和物理环境的 VLAN 是透传的,也即从一开始规划的时候,就需要匹配起来,将物理环境和虚拟环境强绑定,本来就不灵活。 而引入了 OpenvSwitch,状态就得到了改观。 首先,由于 OpenvSwitch 本身就是支持 VLAN 的,所有的虚拟机都可以放在一个网桥 br0 上,通过不同的用户配置不同的 tag,就能够实现隔离。例如上面的图,用户 A 的虚拟机都在 br0 上,用户 B 的虚拟机都在 br1 上,有了 OpenvSwitch,就可以都放在 br0 上,只是设置了不同的 tag。 另外,还可以创建一个虚拟交换机 br1,将物理网络和虚拟网络进行隔离。物理网络有物理网络的 VLAN 规划,虚拟机在一台物理机上,所有的 VLAN 都是从 1 开始的。由于一台机器上的虚拟机不会超过 4096 个,所以 VLAN 在一台物理机上如果从 1 开始,肯定够用了。 例如在图中,上面的物理机里面,用户 A 被分配的 tag 是 1,用户 B 被分配的 tag 是 2,而在下面的物理机里面,用户 A 被分配的 tag 是 7,用户 B 被分配的 tag 是 6。 如果物理机之间的通信和隔离还是通过 VLAN 的话,需要将虚拟机的 VLAN 和物理环境的 VLAN 对应起来,但为了灵活性,不一定一致,这样可以实现分别管理物理机的网络和虚拟机的网络。好在 OpenvSwitch 可以对包的内容进行修改。例如通过匹配 dl_vlan,然后执行 mod_vlan_vid 来改进进出出物理机的网络包。 尽管租户多了,物理环境的 VLAN 还是不够用,但是有了 OpenvSwitch 的映射,将物理和虚拟解耦,从而可以让物理环境使用其他技术,而不影响虚拟机环境,这个我们后面再讲。
小结
|
|