分享

[问题]openstack的网络隔离

shanyj 发表于 2016-4-8 15:14:19 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 14698
大致理解openstack有三个层次的隔离:
(1)租户之间的网络隔离
(2)一个租户内的不同网络之间隔离
(3)一个网络内的不同子网隔离

其中(2)租户内的不同网络之间隔离获取资料得知是根据vxlan、vlan或gre的segmentid来进行隔离的

问题:
1。是不是可以理解为这个租户下的vm,分别拥有各自租户内网络的vlan号,而这些vlan合起来组成了一个租户的整体网络?
2。既然租户内的网络是根据vlan等来隔离的,那各个租户又是靠什么隔离的呢?是namespace嘛?是的话那么一个namespace的vlan是独立计数的吗?

3。租户网络和网络子网的关系又是怎样的呢?一个租户网络下的子网是怎样隔离的?每个子网有自己的dhcpserver?


4。br-int 上的本地vlan和 br-tun上的全局id号是一一对应的?还是多个本地vlan可以指向一个br-tun上的全局id?

180951l6nim69zttw6m15w.jpg

已有(1)人评论

跳转到指定楼层
atsky123 发表于 2016-4-9 19:57:43
感觉楼主想的有点复杂。
其实我们现实网络是一样的。
只不过openstack是通过软件来实现定义的。

租户之间的网络是通过namespace来隔离的。
这样租户自己可以随便定义自己的网络,如果别的租户也和另外租户定义相同的网络是没有关系的。
既然我们可以自己定义网络,剩下的假如你来架设网络,你会如何设计。
肯定需要路由,路由又可以分不同的网络给别的私有网络,私有网络可以自己定义ip地址,当然也可以通过DHCPserver。这是整体的概念。
至于楼主说的那些vxlan、vlan或gre的segmentid,这些都是细节性的概念,是租户内定义网络所用的概念。

对于第三个问题:
租户网络和网络子网的关系又是怎样的呢?一个租户网络下的子网是怎样隔离的?每个子网有自己的dhcpserver?
楼主肯定陷进去了,这是最基本的网络常识,租户网络你是可以细分的,租户下的子网,可以通过路由划分。就像你们公司上网,你们是如何划分网络的。所以只要明白,租户隔离是通过namespace隔离即可,就像你们公司的网络和其它公司的网络是通过namespace隔离的,至于你们公司网络是如何隔离和划分的,在于你们公司自己。
其它细节性的概念,都是对公司网络划分的时候用的,下面楼主可以自己参考



(1)DHCP

为什么会有个DHCP Server呢,是同一个private network里的虚拟机得到IP都是通过这个DHCP Server来的,这个DHCP Server也是连接到br-int上和虚拟机进行通信的。

(2)qbr

既然qbr和br-int都是网桥,为什么不直接连到br-int,还要通过qbr,qvb,qvo岂不是多余,为什么会有qbr呢?这是和security group的概念有关。简单说就是OVS网桥br-int没有设置iptables规则的功能,但openstack又要提供安全组服务,就借助了Linux bridge(qbr)的功能,虽然OVS的br-int和linux bridge (qbr)都是二层网桥,但是为了功能互补就同时出现了。具体了解,openstack中的security group开通哪些端口,屏蔽哪些端口是用iptables来实现的,然而br-int这些虚拟bridge都是openvswitch创建的,openstack的Kernel mode和netfilter的kernel mode不兼容。一个IP包进来要么走iptables规则进行处理,要么走openvswitch的规则进行处理,br-int上有很多openvswitch的规则,比如vlan tag等,所以iptables必须要另外建立一个linux bridge(qbr)来做,因而就有了qbr,在了解拓扑结构的时候,可以将qbr忽略,看到VM直接连接到br-int上就可以了。

(3)namespace

为什么会有namespace呢,java的namespace是为了在不同namespace下有相同类名,openstack也想做到这一点。不同Tenant都创建自己的router和private network,彼此不知道别人指定了哪些网段,很有可能两个tenant都指定了192.168.0.0/24,这样不同的private network的路由表,DHCP Server就需要隔离,不然就乱了,因而就有了namespace。

(4)OVS一体化网桥br-int

每个机器上都有了自己的br-int,但是对于虚拟机和虚拟router来说,它们仍然觉得自己连接到了一个大的L2的br-int上,通过这个br-int相互通信的,它们感受不到br-int下面的虚拟网卡br-tun。所以对于多节点结构,我们可以想象br-int是一个大的,横跨所有compute和network节点的二层switch,虚拟机之间的通信以及虚拟机和Router的通信,就像在一个寝室一样的。这是一种很重要的抽象思维,好像openstack环境中所有虚拟机都连接到了一个巨型的虚拟交换机上。

然而br-int毕竟被物理的割开了,需要有一种方式将他们串联起来,openstack提供了多种方式,可以用GRE tunnel将不同机器的br-int连接起来,也可以通过VLAN将br-int连接起来,当然还可以使用vxlan。

这就是为什么openstack有了br-int这个bridge,但是不把所有的openvswitch的规则都在它上面实现。就是为了提供这种灵活性,对于虚拟机来讲,看到的是一大整个br-int,不同机器的br-int可以有多种方式连接,这在br-int下面的网卡上面实现。

(5)OVS通道网桥br-tun

br-tun也是OVS创建的虚拟网桥,它是一个中间层,接收br-int的网络数据,然后在通过特定网络协议与各个节点的br-tun相连构成一个通道层。如果所有的br-int构成的抽象层定义为虚拟二层网络,那么所有的br-tun构成的抽象层边上虚拟三层网络了。

(6)网络数据包隔离

如果有不同的Tenant,创建了不同的private network,为了在data network上对包进行隔离,创建private network的时候,需要指定vlanid或者segmentid。

从ovs-vsctl show我们可以看到,不同的tenant的private network上创建的虚拟机,连接到br-int上的时候是带tag的,所以不同tenant的虚拟机,即便连接到同一个br-int上,因为tag不同,也是不能相互通信的。然而同一个机器上的tag的计数是仅在本机有效的,并不使用我们创建private network的时候指定的全局唯一的vlanid或者segmentid,一个compute节点上的br-int上的tag 1和另一台compute节点上的br-int的tag1很可能是两码事。全局的vlanid和segmentid仅仅在br-int以下的虚拟网卡和物理网络中使用,虚拟机所有能看到的东西,到br-int为止,看不到打通br-int所要使用的vlanid和segmentid。

从局部有效的taging到全局有效的vlanid或者segmentid的转换,都是通过openvswitch的规则,在br-tun或者br-eth1上实现。







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条