Neutron的Vnet

Neutron里在创建port的时候,通常都是通过Network ID来创建,在请求创建port的RESTful的API中,body里会通过指定network_id字段来指明创建port对应的network

在这种情况下,创建PORT似乎仅仅只与某一个Network相关,如果是后续每次想用到这个network,可以每次获取一下这个network id,稍微偷懒一点的可能就直接将这个network写入到配置文件中,最难以接受的可能还会有人直接源代码里将这个network id写死,结果就导致不同的环境用到的network id会不同,甚至假如有两个network可用,但是其中一个network的port用尽,相关人员不知,出错后,又去查询该network的相关信息,可见从开始到现在,围绕在耳边最多的是network id,它不是一串辨识度高的东西,而且弄不好还容易查错或者贴错,但又不可或缺,为此抽象出了vnet的概念,通过我们耳熟能详的vnetwork和az的组合彻底代替了network id的效果

先看下vnet的这张表

+--------------------------------------+----------+--------------------------------------+----+
| id                                   | vnetwork | network_id                           | az |
+--------------------------------------+----------+--------------------------------------+----+
| 58af0bc5-0166-49d6-90d3-00c8ea9a483b | public   | 78763287-e904-426a-b2b3-9b180830c77e | yz |
| 50503eea-1ac3-4b86-8bce-d0281f4b3672 | public   | dae73933-9e60-4ad7-b48c-046aca96343f | zw |
+--------------------------------------+----------+--------------------------------------+----+

以前,我们都是通过network_id这项的一串来创建port,或者在创建云主机的时候,指定network_id,说得更具体一点,需要添加选项network_id=xxxxxxxxxx;而从表里可以看出来一个vnetwork+一个az=决定了一个network_id,因此优化的结果就是,创建port和云主机的时候,不需要指定network_id,而是用vnetwork+az两项来代替,相比一长串需要查询的ID,vnetwork(private,idc,public的命名一目了然),az(基本调接口都会用到)基本谁都明白是啥,简洁明了

看到这里,也许会想,vnetwork+az与network_id是否是一一对应的关系,这点也是否定的,我们公有云每个环境,外网都有扩容,但它们拥有共同的az,比如xiaoshan1,比如yiqiao1,再比如上面的例子中yz这个az下,扩容了一个外网段,变成了如下的状况

+--------------------------------------+----------+--------------------------------------+----+
| id                                   | vnetwork | network_id                           | az |
+--------------------------------------+----------+--------------------------------------+----+
| 58af0bc5-0166-49d6-90d3-00c8ea9a483b | public   | 78763287-e904-426a-b2b3-9b180830c77e | yz |
| ab83856e-2935-40fb-87e8-dd9ae98457eb | public   | 961fcd33-34b6-440e-b1f8-1c431f0e0691 | yz |
| 50503eea-1ac3-4b86-8bce-d0281f4b3672 | public   | dae73933-9e60-4ad7-b48c-046aca96343f | zw |
+--------------------------------------+----------+--------------------------------------+----+

眼尖的你,可能立马发觉了,此时public+yz并不仅仅与一个network_id对应,而是两个,那么以vnet这种方式如何选择来创建port呢,会根据这两个network名下的port数量的多少进行筛选调度,宗旨就是尽可能地先用尽一个network,然后再去用另一个network;也就是在你并不知道两段network的使用量的情况下,你完全不太清楚此刻会通过哪段network来创建port,当然你也完全没必要知道(需要验证新扩容的network除外)

到这里,应该基本能明白vnetwork+az取代network_id的过程了,私有网private+az,机房网idc+az,外网public+az,通过vnetwork+az筛选出所有的network_id,直到所有满足要求的network用完为止,根本再也不用担心某一个network创建不出来port导致出错

以上说的这些,都是在vnet已经创建好,能够直接使用,其实对于vnet的创建,有几个关键地方

1:vnetwork的命名,目前是以private,idc,public来命名,同样的网络类型,比如外网不可能弄一个public-1,public-2,这样上面说的优势又白搭了

2:az的绑定,这是比较重要的,以公有云为例,在用户注册审批了之后,默认会初始化用户网络,但这里初始化的是租户的私有网络,初始化的过程其实就是给租户创建私有网络,然后创建了私有网vnet,将private+az和私有网network id绑定建立了这样一层关系(也就是上面表中每行的关系);像外网则需要管理员来进行绑az,所以很多新注册了用户,外网没有绑az,就直接带外网来创建云主机,往往就直接返回一个错误;说得更直白一些,产品管理页面,前端网络管理,每个网络类型都有一个下拉框,下拉的每行代表的就是不同的network_id,如果租户的某network没有绑az,这个下拉框里不会将这个network显示出来,也就是绑了az才能用

 

啰嗦了这么久,最后总结下vnet的优势:

首先,在使用姿势方面,yiqiao1+public比network_id=xxxxxxxxx(其中某一个外网id,还需要查)轻松顺眼,无忧无虑的多

其次,在舒适程度方面,yiqiao1+public会调度筛选完yiqiao1的所有network,network_id方式只有某段network(用完了咋办,换?)

最后,在其它扩展方面,比如新增加一段network,只需要给用户都绑上这段,丝毫不影响他们yiqiao1+public的使用,一定条件下自然会调度到这段network上,network_id的方式?可参考前两条

发表回复