今天跟大家唠唠我这几天折腾OVS(Open vSwitch)的那些事儿。之前只是听过,没真正上手玩过,这回算是赶鸭子上架,边学边干,踩不少坑,也算有点心得,分享出来大家一起探讨。
起初,接个活儿,需要在虚拟机里搭建一个复杂的网络环境,各种VLAN、网桥啥的。一开始想着直接用Linux自带的`brctl`命令搞,但折腾两天,发现这玩意儿功能太有限,配置起来也麻烦,而且扩展性不行。后来一哥们儿推荐我用OVS,说这玩意儿才是专业的,功能强大,配置灵活。
得,那就上OVS!第一步,当然是安装。我用的是CentOS 7,直接`yum install openvswitch`就完事儿。装完之后,启动服务:`systemctl start openvswitch`,然后`systemctl enable openvswitch`,让它开机自启。一切看起来都很顺利。
接下来就是配置。我要创建一个网桥,相当于一个虚拟的交换机。命令很简单:`ovs-vsctl add-br br0`。然后,我要把几个虚拟机的网卡(比如`eth0`、`tap0`)添加到这个网桥上:`ovs-vsctl add-port br0 eth0`,`ovs-vsctl add-port br0 tap0`。看起来很简单,对?
但是,问题来!我需要把`tap0`这个网卡配置成VLAN 9的访问端口(access port)。按照网上搜到的教程,直接加上`tag=9`就完事儿:`ovs-vsctl add-port br0 tap0 tag=9`。信心满满地执行,结果... 报错!说`tag`不是一个有效的参数。
What? 难道是版本问题? 我又重新看几遍文档,发现`tag`确实是用来设置VLAN ID的。 后来我仔细研究`ovs-vsctl`的命令帮助,才发现正确的姿势是这样的:
`ovs-vsctl set Port tap0 tag=9`
也就是先添加端口,然后再用`set`命令来设置VLAN ID。 真是细节决定成败!
解决VLAN的问题,我又遇到另一个坑。我在容器里安装OVS,然后把容器打包成镜像,创建多个容器。结果,除`ovs-vsctl show`命令,其他的命令,比如`add-br`、`add-port`啥的,都不能用! 提示各种权限错误。
这下把我搞懵。容器里OVS服务明明已经启动,为什么会这样? 查半天资料,发现是容器的权限问题。容器默认的安全策略限制OVS的某些操作。解决办法也很简单,就是在运行容器的时候,加上`--privileged`参数,让容器拥有更高的权限。
不过虽然这样解决问题,但我总觉得不太安全。 后来我又研究一下Docker的capabilities,发现可以只给容器添加OVS需要的capabilities,而不是直接赋予所有权限。 具体怎么操作,这里就不细说,大家可以自行搜索。
- 还有一个比较常见的问题是环路。 如果你的OVS网桥和物理交换机之间存在二层环路,就会导致网络风暴,整个网络瘫痪。
- 解决办法也很简单,就是启用STP(Spanning Tree Protocol)。
- OVS默认是关闭STP的,需要手动开启:`ovs-vsctl set Bridge br0 stp_enable=true`。
折腾OVS的过程还是挺有意思的。虽然遇到不少坑,但也学到很多东西。 OVS的功能确实强大,配置也很灵活,但同时也需要对网络协议和OVS的原理有一定的解,才能更好地使用它。
提醒大家一句,OVS的配置一定要仔细,尤其是VLAN和环路的问题,一不小心就会导致网络故障。 多看文档,多做实验,才能真正掌握OVS。
希望我的经验能对大家有所帮助, 咱们下次再见!
还没有评论,来说两句吧...