前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >盗梦空间之VLAN in VLAN

盗梦空间之VLAN in VLAN

原创
作者头像
焱融科技
修改2020-07-17 14:30:49
1.2K0
修改2020-07-17 14:30:49
举报
文章被收录于专栏:焱融科技焱融科技

前言

只要做过软件开发,想必一定听说过“吃狗食”这样的说法,说的就是软件开发者应该使用自己开发的软件,这样便于理解你的系统,从而发现问题并解决问题。

从第一次做SaaS开始,当时还是订阅式经济(Subscription-Economy)方兴未艾的年代,我就被自己写的计费平台每月自动扣费(作为正直的攻城狮,没有给自己留下任何后门),到后来在IBM做OpenStack,可以在自己的OpenStack平台上通过创建All-In-One的虚拟机来获得历史版本产品,均是如此。

在OpenStack的实际应用中,对于非超大规模的环境,VLAN的网络模式是价格便宜量又足,大家都喜欢用。如何利用既有的基于VLAN的OpenStack环境进行OpenStack的深度开发(典型盗梦空间的感觉),核心就是如何才能做到VLAN in VLAN。然而大部分混迹于OpenStack多年的攻城狮们,对于OpenStack VLAN in VLAN(非All-in-one) ,却好像挂在头前的骨头一样,很少有人真正品尝过它的滋味。

来,让我们先展望一下美好的愿景。我们的目标就是在基于VLAN的OpenStack环境中,通过虚拟机,再搭建一个基于VLAN的OpenStack环境。

OpenStack的VLAN网络

首先我们来复习一下OpenStack下的VLAN网络,看看VLAN数据包是如何传递的。这里直接借用OpenStack官方著名的一个图片(原地址已经不可考了)。

在这个场景下,虚拟机的eth1发出的原始数据包在经过br-int,br-eth1后,会被附加上物理环境下的VLAN tag,例如VLAN101,然后交由物理机交换机进行转发。我们可以理解上图为一个OpenStack计算节点物理机的场景。那么我们需要解决的问题就是把其上的虚拟机作为新的OpenStack环境的控制节点,计算节点来部署基于VLAN网络的OpenStack环境。

设想一下把这个结构图缩小,压缩到vm01内,再去想从内到外的网络链路,有没有一种递归堆栈满stack overflow的感觉,瞬间头晕了。结合我们美好的愿景,Inner-VM 的VLAN数据包 在到达 Outer-VM的网卡后,由于是VLAN封包,直接就被抛弃掉了。怎么办?好在天无绝人之路。

相关的解决方案

[VLAN-trunking] (https://specs.openstack.org/openstack/neutron-specs/specs/kilo/nfv-vlan-trunks.html "VLAN-trunking"), 这个方案不支持VLAN 以及 OVS

[VLAN-aware-VMs] (https://specs.openstack.org/openstack/neutron-specs/specs/liberty/vlan-aware-vms.html "VLAN-aware-VMs"), 这个方案的看着不错,但至少我用的版本里面没有,如果要全部merge回来,工作量还好大。

有没有简单粗暴的方案呢,我要的只是能跑起来我自己的环境就好了啊。

曲线救国

自古以来,问题的解决从来都不是只有技术一条路,当技术走不通的时候,我们一样可以从工程学的角度去考虑,甚至可以有更适合当下的方案。不禁想起了用电风扇吹空皂盒(不知道这个梗的同学,自行搜索吧)的故事了。

让我们看看,问题的根源就是tag包不能从虚拟机的网卡发出来,那么虚拟机内的数据网不用OpenStack的网络,直接捅到物理网络上的Trunk网络,来个大大的飞线,不就可以了吗?

在上面的VLAN结构图中,我们知道物理机的eth1是trunk网络,被接到OVS网桥br-eth1上,那么我们让inner-compute1的数据网的数据发送到这里然后通过物理环境的交换机通信,只要两层虚拟化环境的Neutron VLAN range不冲突即可。直接上命令行搞定:

#ip link add name qvb-data type veth peer name qvo-data

#brctl addif br-data qvb-data

#ovs-vsctl add-port br0eth1 qvo-data

#ip link set qvb-data up && ip link set qvo-data up

假设inner-compute1的domain id为10, 直接用virsh命令从物理网桥给它增加一个网卡作为eth1

#virsh attach-interface 10 --type bridge --source br-data --model virtio --current

后续需要解决的问题

这种解决方案是糙快猛的,不需要对原有的代码,结构做改造,只需要从运维的角度做适当的维护。当然糙快猛就意味着存在很多不足的地方,例如:

  1. 办公网环境如何访问最内层虚拟机,以及最内层虚拟机如何访问外网,这个可以考虑在inner-controller的本地iptables,route上做手脚,做适当的端口转发。
  2. 配置的持久化。可以从功能角度直接支持给虚拟机透传物理网卡,例如Intel 82599支持的SRIOV等。

总结

本文给出了一个实现VLAN in VLAN的短平快的方案,仅从实际的角度出发,利用现有的技术解决实际中的客观的某一个需求,做了一个新的尝试,行文以及技术方面难免有遗漏,欢迎指正。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • OpenStack的VLAN网络
  • 相关的解决方案
  • 曲线救国
  • 后续需要解决的问题
  • 总结
相关产品与服务
私有网络
私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为您在云上的专属网络空间,您可以通过软件定义网络的方式管理您的私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。私有网络还支持多种方式连接 Internet,如弹性 IP 、NAT 网关等。同时,您也可以通过 VPN 连接或专线接入连通腾讯云与您本地的数据中心,灵活构建混合云。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档