《跟唐老师学习云网络》 - OVS交换机
网络虚拟化-OVS交换机
搞网络虚拟化,一定要有个概念,就是虚拟网络都是照着物理世界去设计的。所以当我们进入虚拟化篇章,必须要先了解物理世界中网络长什么样。
本章节要介绍的网络设备叫做交换机。
一、什么是交换机
交换机长下图这样,特点是:可以插网线的口非常的多~
(当然,现在很多网线都升级换成光纤了)
它功能上比集线器高级多了,所以集线器的功能它肯定有(即连通各个插进来网线,这种只是基操勿溜了)。
之前你可能看到过,那种机房里面密密麻麻的连线,它其实就是由很多交换机放在一个机架里。
1. 交换机解读
现在,我们来单独看看一台交换机内部的功能实现:
首先,交换机的抽象如下:
有很多(非常多)的网口,每个网口都可以插网线。
然后,重点来了:它可以控制“从一个网口收到的报文,接下来从哪个网口出去”。
比如下图,设置规则:从1口进来的报文,从7口出去。 然后从2口进来的报文,从6口出去。
这种“报文哪里进,哪里出”的规则,交换机管理员可以自由控制。
设置了这种规则后,好处是什么?那就是:可以自由连接不同的网络(或者主机)。如下:
更高级一点,每个网口(又叫端口,英文会把交换机的端口叫Port),还可以控制要不要设置 VLAN头。如下红色字体:
加上 VLAN头 控制能力后,交换机的功能就可以做到:连通VLAN网络了。
如上,连通的网络不仅是普通子网,也可以是VLAN网络。而且,每个端口,还可以设置是不是只允许某个 VLAN号 的报文通过。
所以物理交换机总结一下:
- 端口贼多
- 各端口之间的报文转发路线,可以自由控制
- 每个端口,可以控制VLAN规则
二、虚拟交换机
既然物理世界有这么强的网络设备,那么虚拟世界里面,不得也有对应的“设备”,才能同样在虚拟空间中构筑和物理中一样丰富的网络嘛。
于是,OVS(Open vSwtich,虚拟交换机)就出现了。它在主机里面长这样:
它的作用,主要是用来连VM虚拟机,将VM分组。(容器连ovs的比较少,一般容器都连Bridge就完了)
还记得VLAN章节的内容不?忘记的可以回去看一眼。
里面让VM分组的实现,就是使用OVS来达成的:
这样,从左边主机上面的VM2,发送一个“你好”的报文出去。这个报文,就会到达右边主机上面的VM4。VM4收到一个原始的“你好”报文。并且和VM3是隔离的。如下:
通过给端口配置规则,这就完成了物理服务器上面,各种VM的互联和分组的目的。其中每一个分组,可以相当于OpenStack里面的一个用户:即张三的VM(上图vm1和vm3)和李四的VM(上图vm2和vm4)网络互相隔离。
三、OVS的基本操作
首先我们要安装ovs,这个在ubuntu里面,执行
apt-get install -y openvswitch-switch
就行。其他OS的安装命令自己搜一下。
可用的cmd命令使用 -h 查询
ovs-vsctl -h
平时使用,咱们主要是看ovs的那些网口信息,以及网口所连接的网线,所以以下为常用命令:
1. 交换机相关的:
添加交换机(虚拟的)
ovs-vsctl add-br br-tsj
查询交换机(虚拟的)列表
ovs-vsctl list-br
查询交换机(还是虚拟的)详情
ovs-vsctl show
删除交换机
ovs-vsctl del-br br-tsj
2. ovs自带的网卡
需要知道的是:
当一个新的交换机被创建的时候,会自带一个同名的端口,也会有一个同名的网卡插到这个口子上,并且这个网卡也会加入到Host中。所以你在Host里面是可以看到这个网卡的,只是它默认是down的。
比如我新增了一个叫做 br-tsj 的ovs的时候,可以看到ovs,port,interface 都叫 br-tsj。
然后给这个叫 br-tsj 的网卡 up 之后,它就是主机里面的正常网卡了。
3. 网口相关的:
ps:为了演示,这里先创建一根虚拟网线(忘记的可以回顾一下Veth章节)
ip link add tsj-0 type veth peer name tsj-1
把网线的一个水晶头(tsj-1),给插到交换机的网口上面:
ovs-vsctl add-port br-tsj tsj-1
查询交换机上面的端口信息
ovs-vsctl list-ports br-tsj
给某个网口设置VLAN标签
ovs-vsctl set Port tsj-1 tag=100
移除某个网口上面的VLAN tag配置
ovs-vsctl remove Port tsj-1 tag 100
设置某个网口为Trunk模式
ovs-vsctl set Port tsj-1 trunks=100,200
移除某个网口允许通过的的VLAN tag配置
ovs-vsctl remove Port tsj-1 trunks 100,200
查询交换机的各个端口信息
ovs-vsctl show
移除交换机上的某根网线头子
ovs-vsctl del-port br-tsj tsj-1
了解以上操作,基本上可以在你自己的网络环境中,看明白你自己的虚拟交换机的各种网线的连线方式了。
1. Patch网线
两个ovs互联,可以使用一种新的“网线”,直接叫patch网线。就是一种特殊的端口类型,专门用来连接2个ovs的端口的。Interface的type显示为patch。
比如,连接ovs1和ovs2,可以按如下cmd:
ovs-vsctl add-br ovs1
ovs-vsctl add-br ovs2
然后,新建一条 patch网线,将两者连在一起。
ovs1这边:
ovs-vsctl add-port ovs1 patch-to-ovs2 -- set Interface patch-to-ovs2 type=patch -- set Interface patch-to-ovs2 options:peer=patch-to-ovs1
ovs2这边:
ovs-vsctl add-port ovs2 patch-to-ovs1 -- set Interface patch-to-ovs1 type=patch -- set Interface patch-to-ovs1 options:peer=patch-to-ovs2
最终如下:
查询详情如下:
root@tsjsdbd:~# ovs-vsctl show
05b2d66a-5eec-458e-b6cf-8f860ca98117
Bridge "ovs2"
Port "patch-to-ovs1"
Interface "patch-to-ovs1"
type: patch
options: {peer="patch-to-ovs2"}
Port "ovs2"
Interface "ovs2"
type: internal
Bridge "ovs1"
Port "ovs1"
Interface "ovs1"
type: internal
Port "patch-to-ovs2"
Interface "patch-to-ovs2"
type: patch
options: {peer="patch-to-ovs1"}
ovs_version: "2.5.9"
四、操作实战一个
首先,咱们新建一个叫 br-tsj 的ovs
ovs-vsctl add-br br-tsj
然后给它自带的网卡设置ip地址
ip link set br-tsj up
ip addr add 192.168.0.3/24 dev br-tsj
接着创建一个虚拟网线
ip link add tsj-0 type veth peer name tsj-1
新建一个虚拟网络空间
ip netns add ns-tsj
把网线的一个水晶头(tsj-1),给插到交换机的网口上面:
ovs-vsctl add-port br-tsj tsj-1
记得把网卡也UP一下
ip link set tsj-1 up
把网线另一头放入这个ns(可以把这个ns假装看作是一台VM)
ip link set tsj-0 netns ns-tsj
给VM(上图那个ns里面的网卡 tsj-0)设置好IP
ip netns exec ns-tsj ip link set tsj-0 up
ip netns exec ns-tsj ip addr add 192.168.0.2/24 dev tsj-0
然后从(模拟VM)中发发报文,
ip netns exec ns-tsj ping 192.168.0.3
给VM加上路由规则,那么它就可以访问主机的网络了。
ip netns exec ns-tsj ip route add default via 192.168.0.3
ip netns exec ns-tsj ping 172.17.169.146
Ps:上图是VM访问本主机Host的IP。你要真的访问其他主机,记得给对方主机配置回来的路由。不然报文能过去到达对方主机,但对方报文不知道怎么回来(即对方Host不知道怎么给这个192.168.0.2的VM地址,找路由。)。
五、等等,还有OpenFlow
既然(虚拟的)网线可以自由从插拔到(虚拟的)交换机上,那么当交换机上面有大量的网口&并且设置了各种转发规则后,是不是该交换机需要维护的转发规则会很多?
比如:
网口1收到的报文,从网口5转出去。
网口1收到的报文,去掉VLAN头 100
从网口1发出去的报文,带上VLAN头 100
网口2收到的报文,源IP换成xx,然后从网口6转出去。
网口3收到的报文,目的端口换成xx,然后从网口xxx转发出去。
……
这样大量的规则,总的有个表记录着吧?这个就是 OpenFlow规则了。基本上ovs使用了一个数据库来记录这些规则。
这里,咱们就不研究数据库的细节了(等准备从事ovs开发,再深入研究不迟),咱们这里就是了解下怎么查看这些转发规则信息。
使用 ovs-ofctl 命令行
查询各个端口信息
ovs-ofctl show br-tsj
查询各个端口的转发规则
ovs-ofctl dump-flows br-tsj
会得到类似下面这样的规则:
cookie=0x0, duration=145616.013s, table=0, n_packets=160, n_bytes=10664, priority=0 actions=NORMAL
可以看到,除了优先级和统计信息之外。有2个关键的字段:table 和 action
根据上面的背景,可以知道,这个规则都是用来控制报文的接下来的行为(从哪个口出去),所以规则基本长这样:符合xx条件 ==》执行zz动作。
并且这样的“判断门槛”会有很多道(跟iptables类似),小小报文经过ovs也是翻山越岭的。
1. 常见ovs流表条件
xx条件基本有以下几类:
(注,这里只列了常见的,详细的需要自己去深入。因为咱们的目的主要是能看懂)
- 哪个ovs端口
如:
in_port=port
举例:
priority=100,tcp,in_port=1 actions=resubmit:4000
- MAC地址(dl_xxx, 即data link 的缩写)
如:
dl_src=xx:xx:xx
dl_dst=xx:xx:xx:xx
举例:
priority=8,in_port=4,dl_dst=52:4b:14:90:74:46 actions=output:1
- IP地址(nw_xxx, 即network的缩写)
如:
nw_src=ip[/netmask]
nw_dst=ip[/netmask]
举例:
priority=5,in_port=1,ip,nw_dst=192.168.0.2,actions=output:2
- 端口号(tcp_xxx/udp_xxx)
如:
tcp_src=port
udp_dst=port
举例:匹配tcp端口号179
tcp,tcp_src=179/0xfff0,actions=output:2
2. 常见ovs流表动作
zz动作(Action)常见有以下几类:
- 从哪个ovs端口出去
output:port
举例:
priority=8,in_port=4,dl_dst=52:4b:14:90:74:46 actions=output:1
- 将包丢弃
drop
举例:
条件=xx,yy actions=drop
- 修改VLAN头
如:
修改vlanID:
mod_vlan_vid:vlan_vid
剥离vlan头
strip_vlan
- 修改源/目的IP+端口等
如:
修改源IP
mod_nw_src:ip
修改目的IP
mod_nw_dst:ip
修改目的端口
mod_tp_dst:port
六、总结
咱们今天,学习了物理交换机的主要特点:“各种连线”。
然后知道了虚拟出来的交换机,是怎么造出来的(ovs-vsctl add-br),还有怎么给虚拟交换机(ovs)插拔网线(ovs-vsctl add-port)。以及怎么给网口设置门派(VLAN)。
同时,我们也基本能看懂一台复杂的虚拟交换机内部报文控制规则。即:符合xx条件 ==》执行zz动作。
另,提一下,一般OVS在虚拟机相关平台用的比较多,容器平台使用较少。可能是因为OpenStack管理的VM可以有多个网络平面(多个网卡),而Kubernetes管理的容器,只能接一个网络(容器里面只有1个网卡)有关吧。
- 点赞
- 收藏
- 关注作者
评论(0)