软件定义网络(SDN)
- 控制与转发分离。转发平面是一个个虚拟或物理的网络设备。控制平面是统一的控制中心。
- 控制平面与转发平面之间的开放接口。控制器向上提供接口,被应用层调用,向下调用接口,控制网络设备。
- 逻辑上的集中控制。逻辑上集中的控制平面可控制多个转发设备,即控制整个物理网络,可获得全局的网络状态视图,并根据网络全局网络状态视图实现对网络的优化控制。
OpenFlow 和 OpenSwitch
OpenFlow 是 SDN 控制器和网络设备之间互通的南向接口协议。
OpenvSwitch 用于创建软件的虚拟交换机,支持 OpenFlow 协议。
两者被统一的 SDN 控制器管理,从而实现物理机和虚拟机的网络连通。
SDN 控制器如何通过 OpenFlow 协议控制网络?
在 OpenvSwitch 里,有一个流表规则,任何通过这个交换机的包,都会经过这些规则进行处理,从而接收、转发、放弃。流表里有多个表格,每个表格有多行,每行是一条规则,每条规则有优先级。
通过流表,可对收到的网络包进行处理。
OpenvSwitch 实现 VLAN 功能
OpenvSwitch 端口 port 分两种:
1、access port
- 配置 tag,从此端口进来的包会被打上这个 tag。
- 如果网络包本身带有的 VLAN ID 等于 tag,则会从这个 port 发出。
- 从 access port 发出的包不带 VLAN ID。
2、trunk port
- 不配置 tag, 配置 trunks。
- 如果 trunks 为空,允许所有的包通过。
- 如果 trunks 不空,则仅仅 带着 trunks 允许的 VLAN ID 的包通过。
创建环境:
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 vnet2 tag=102
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
- 从 192.168.100.102 ping 192.168.100.103,first_if、sencond_br 可收到包。first_br 出去的包没有 VLAN ID,second_br 是 trunk port,出来的包头有 VLAN ID。
- 从 192.168.100.100 ping 192.168.100.105,second_if、third_if 可收到包,包头里 VLAN ID = 101。但 ping 不通,因为 third_if 不属于某个 VLAN。
- 从 192.168.100.101 ping 192.168.100.104,second_if、third_if 可收到包,包头里 VLAN ID = 102。
用 OpenvSwitch 模拟网卡绑定,连接交换机
bond_mode 可设置如下三个值:
- active-backup:active 失效时,backup 顶替。
- blance-slb:流量安装源 MAC 和 output VLAN 进行负载均衡。
- blance-tcp:在支持 LACP 协议的情况下,可根据 L2, L3, L4 进行负载均衡。
环境:
建立 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
1、默认 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,包都从 first_br 通过。
如果把 first_if 设成 down,则 second_if 开始有流量。
2、bond_mode 设为 balance-slb。
从 192.168.100.100 ping 192.168.100.102,从 192.168.100.101 ping 192.168.100.103,包会分流。
ovs-vsctl set Port bond0 bond_mode=blance-slb
ovs-vsctl set Port bond1 bond_mode=blance-slb
OpenvSwitch 如何做到这些?架构图如下
(1)在用户态,有两个重要的进程,两个重要的命令行工具。
- OVSDB 进程。ovs-vsctl 命令行与之通信,创建虚拟交换机、端口,将端口添加到虚拟交换机,OVSDB 将这些拓扑信息保存在一个本地文件中。
- vswitchd 进程。ovs-ofctl 命令行与之通信,下放流表规则,vswitchd 将流表放在用户态 Flow Table 中。
(2)在内核态,
- 内核模块 OpenvSwitch.ko,为图中的 Datapath 部分。在网卡上注册一个函数,每当有网络包到达此网卡时,该函数被调用,提取各个层的重要信息。
- 内核态 Flow Table。内核模块在这个内核流表中匹配规则,如果匹配上,则执行操作、修改包,或转发或丢弃。如果内核没有匹配上,则进入用户态,用户态和内核态之间通过 Netlink 通信。
内核通过 upcall,告知用户态进程 vswitchd 在用户态 Flow Table 匹配规则,内核 Flow Table 里只保留部分规则,过一阵会过期。
用户态匹配了流表规则后,在用户态执行操作,同时将匹配成功的流表通过 reinject 下发到内核。
调用 openflow 协议的,是本地命令行工具或远程的 SDN 控制器。一个重要的 SDN 控制器是 OpenDaylight。可通过 OpenDaylight,将两个交换机之间配置通,或不通,还可配置虚拟 IP 地址,在不同机器之间实现负载均衡。
如何在云计算中使用 OpenvSwitch?
1、OpenvSwitch 本身支持 VLAN,所有的虚拟机可放在一个网桥 br0 上,通过不同的用户配置不同的 tag,就能实现隔离。
如图中,用户 A、B 的虚拟机都可在 br0 上,只是设置了不同的 tag。
2、创建一个虚拟交换机 br1,将物联网络和虚拟网络隔离。物理网络有物理网的 VLAN 规划,虚拟机在一台物理机上,所有的 VLAN 都从 1 开始,一般不会超过 4096。
如图中,上面的物理机中,用户 A 的 tag 是 1,B 的 tag 是 2,下面的物理机中,A 的 tag 是 7,B 的 tag 是6。