《跟唐老师学习云网络》 - OVS交换机

举报
tsjsdbd 发表于 2022/06/02 17:20:54 2022/06/02
【摘要】 跟唐老师学习云网络, 之 网络虚拟化的关键设备虚拟交换机(Open VSwitch)介绍,也是最后一个需要介绍的被人类虚拟出来的网络设备了。搞云网络的人必须跳过的门槛,走过路过不要错过。

网络虚拟化-OVS交换机

 

搞网络虚拟化,一定要有个概念,就是虚拟网络都是照着物理世界去设计的。所以当我们进入虚拟化篇章,必须要先了解物理世界中网络长什么样。

本章节要介绍的网络设备叫做交换机。

 

一、什么是交换机

交换机长下图这样,特点是:可以插网线的口非常的多~

(当然,现在很多网线都升级换成光纤了)


它功能上比集线器高级多了,所以集线器的功能它肯定有(即连通各个插进来网线,这种只是基操勿溜了)。

 之前你可能看到过,那种机房里面密密麻麻的连线,它其实就是由很多交换机放在一个机架里。


 

1.   交换机解读

现在,我们来单独看看一台交换机内部的功能实现:

首先,交换机的抽象如下:


有很多(非常多)的网口,每个网口都可以插网线。

然后,重点来了:它可以控制“从一个网口收到的报文,接下来从哪个网口出去”。

 

比如下图,设置规则:从1口进来的报文,从7口出去。 然后从2口进来的报文,从6口出去。


这种“报文哪里进,哪里出”的规则,交换机管理员可以自由控制。

设置了这种规则后,好处是什么?那就是:可以自由连接不同的网络(或者主机)。如下:


更高级一点,每个网口(又叫端口,英文会把交换机的端口叫Port),还可以控制要不要设置 VLAN头。如下红色字体:


加上 VLAN头 控制能力后,交换机的功能就可以做到:连通VLAN网络了。


如上,连通的网络不仅是普通子网,也可以是VLAN网络。而且,每个端口,还可以设置是不是只允许某个 VLAN号 的报文通过。

 

所以物理交换机总结一下:

  1. 端口贼多
  2. 各端口之间的报文转发路线,可以自由控制
  3. 每个端口,可以控制VLAN规则

 

二、虚拟交换机

既然物理世界有这么强的网络设备,那么虚拟世界里面,不得也有对应的“设备”,才能同样在虚拟空间中构筑和物理中一样丰富的网络嘛。

于是,OVSOpen vSwtich,虚拟交换机)就出现了。它在主机里面长这样:

它的作用,主要是用来连VM虚拟机,将VM分组。(容器连ovs的比较少,一般容器都连Bridge就完了)

还记得VLAN章节的内容不?忘记的可以回去看一眼。

里面让VM分组的实现,就是使用OVS来达成的:

这样,从左边主机上面的VM2,发送一个“你好”的报文出去。这个报文,就会到达右边主机上面的VM4VM4收到一个原始的“你好”报文。并且和VM3是隔离的。如下:

通过给端口配置规则,这就完成了物理服务器上面,各种VM的互联和分组的目的。其中每一个分组,可以相当于OpenStack里面的一个用户:即张三的VM(上图vm1vm3)和李四的VM(上图vm2vm4)网络互相隔离。

 

三、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的时候,可以看到ovsportinterface 都叫 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网线。就是一种特殊的端口类型,专门用来连接2ovs的端口的。Interfacetype显示为patch

比如,连接ovs1ovs2,可以按如下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访问本主机HostIP。你要真的访问其他主机,记得给对方主机配置回来的路由。不然报文能过去到达对方主机,但对方报文不知道怎么回来(即对方Host不知道怎么给这个192.168.0.2VM地址,找路由。)。

 

五、等等,还有OpenFlow

既然(虚拟的)网线可以自由从插拔到(虚拟的)交换机上,那么当交换机上面有大量的网口&并且设置了各种转发规则后,是不是该交换机需要维护的转发规则会很多?

比如:

网口1收到的报文,从网口5转出去。

网口1收到的报文,去掉VLAN100

从网口1发出去的报文,带上VLAN100

网口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_xxxdata 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_xxxnetwork的缩写)

如:

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个网卡)有关吧。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。