关于nova-network的fixed IP的扩容的初探
来源:互联网 发布:js设置option的默认值 编辑:程序博客网 时间:2024/05/12 06:42
最近遇到的问题是nova-network创建的网络,一旦使用后无法修改,若要删除重新建,还需要删除掉所有的虚拟机,甚是麻烦,由于创建时候设立了start和end,就想看看能不能通过修改END来扩容,最后发现无论用哪种接口,都无法查到某个网络的end IP,只好一步一步来看看到底是怎么回事。
当然,最后的结果是,发现根本就没有存end ip,不过还是把过程拿出来分享一下吧。这里网络是flatdhcp,单HOST
先找一下api中创建网络的接口,大概是这样子的:
nova_network.networks_create(request, label=data['name'], cidr=data['cidr'], allowed_start=data['startIP'], allowed_end=data['endIP'], bridge='br100')
继续查:
nova.novaclient(request).networks.create(**kwargs)
看/usr/lib/python2.7/site-packages/novaclient/v2/client.py
self.networks = networks.NetworkManager(self)
/usr/lib/python2.7/site-packages/novaclient/v2/networks.py
class NetworkManager(base.ManagerWithFind):"""Manage :class:`Network` resources."""resource_class = Network....... def create(self, **kwargs): """ Create (allocate) a network. The following parameters are optional except for label; cidr or cidr_v6 must be specified, too. :param label: str :param bridge: str :param bridge_interface: str :param cidr: str :param cidr_v6: str :param dns1: str :param dns2: str :param fixed_cidr: str :param gateway: str :param gateway_v6: str :param multi_host: str :param priority: str :param project_id: str :param vlan: int :param vlan_start: int :param vpn_start: int :param mtu: int :param enable_dhcp: int :param dhcp_server: str :param share_address: int :param allowed_start: str :param allowed_end: str :rtype: object of :class:`Network` """ body = {"network": kwargs} return self._create('/os-networks', body, 'network')
请求这就算发出去了
看看服务端代码:
[root@host81191 ~]# cat /usr/bin/nova-network#!/usr/bin/python# PBR Generated from u'console_scripts'import sysfrom nova.cmd.network import mainif __name__ == "__main__":sys.exit(main())
/usr/lib/python2.7/site-packages/nova/network/manager.py
def create_networks(self, context, label, cidr=None, multi_host=None, num_networks=None, network_size=None, cidr_v6=None, gateway=None, gateway_v6=None, bridge=None, bridge_interface=None, dns1=None, dns2=None, fixed_cidr=None, allowed_start=None, allowed_end=None, **kwargs):def _do_create_networks(self, context, label, cidr, multi_host, num_networks, network_size, cidr_v6, gateway, gateway_v6, bridge, bridge_interface, dns1=None, dns2=None, fixed_cidr=None, mtu=None, dhcp_server=None, enable_dhcp=None, share_address=None, allowed_start=None, allowed_end=None, **kwargs):
跟ALLOWED_END相关代码
if allowed_end: val = self._index_of(subnet_v4, allowed_end) top_reserved = subnet_v4.size - 1 - val
得到一个top_reserved
if cidr and subnet_v4: self._create_fixed_ips(context, net.id, fixed_cidr, extra_reserved, bottom_reserved, top_reserved)
继续看:
def _create_fixed_ips(self, context, network_id, fixed_cidr=None, extra_reserved=None, bottom_reserved=0, top_reserved=0): """Create all fixed ips for network.""" network = self._get_network_by_id(context, network_id) if extra_reserved is None: extra_reserved = [] if not fixed_cidr: fixed_cidr = netaddr.IPNetwork(network['cidr']) num_ips = len(fixed_cidr) ips = [] for index in range(num_ips): address = str(fixed_cidr[index]) if (index < bottom_reserved or num_ips - index <= top_reserved or address in extra_reserved): reserved = True else: reserved = False ips.append({'network_id': network_id, 'address': address, 'reserved': reserved}) objects.FixedIPList.bulk_create(context, ips)
大意似乎是按照最大值的IP然后把所有IP都存在了数据库,而没有存什么endIP具体是哪个
去数据库看看数据如何
例如添加网络
10.1.80.0/22
start:10.1.81.214
end:10.1.81.220
[root@host81191 mnt]# nova net-list+--------------------------------------+-------+--------------+| ID | Label | CIDR |+--------------------------------------+-------+--------------+| c163d2e7-a8a2-47b7-a84f-665ea84cda6b | net1 | 10.1.80.0/22 |+--------------------------------------+-------+--------------+[root@host81191 mnt]# nova network-show net1+---------------------+--------------------------------------+| Property | Value |+---------------------+--------------------------------------+| bridge | br100 || bridge_interface | eno1 || broadcast | 10.1.83.255 || cidr | 10.1.80.0/22 || cidr_v6 | - || created_at | 2016-02-26T08:15:22.000000 || deleted | False || deleted_at | - || dhcp_server | 10.1.81.214 || dhcp_start | 10.1.81.215 || dns1 | 8.8.4.4 || dns2 | - || enable_dhcp | True || gateway | 10.1.81.214 || gateway_v6 | - || host | - || id | c163d2e7-a8a2-47b7-a84f-665ea84cda6b || injected | False || label | net1 || mtu | - || multi_host | False || netmask | 255.255.252.0 || netmask_v6 | - || priority | - || project_id | - || rxtx_base | - || share_address | False || updated_at | - || vlan | - || vpn_private_address | - || vpn_public_address | - || vpn_public_port | - |+---------------------+--------------------------------------+
查nova数据库里的fixed_ips;
MariaDB [nova]> select count(*) from fixed_ips;
+----------+| count(*) |+----------+| 1024 |+----------+1 row in set (0.00 sec)
发现创建了从10.1.80.0到10.1.83.255一共1024个IP地址
select * from fixed_ips where reserved = 0;+---------------------+------------+------------+-----+-------------+------------+-----------+--------+----------+----------------------+------+---------------+---------+| created_at | updated_at | deleted_at | id | address | network_id | allocated | leased | reserved | virtual_interface_id | host | instance_uuid | deleted |+---------------------+------------+------------+-----+-------------+------------+-----------+--------+----------+----------------------+------+---------------+---------+| 2016-02-26 08:15:22 | NULL | NULL | 472 | 10.1.81.215 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 0 || 2016-02-26 08:15:22 | NULL | NULL | 473 | 10.1.81.216 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 0 || 2016-02-26 08:15:22 | NULL | NULL | 474 | 10.1.81.217 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 0 || 2016-02-26 08:15:22 | NULL | NULL | 475 | 10.1.81.218 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 0 || 2016-02-26 08:15:22 | NULL | NULL | 476 | 10.1.81.219 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 0 || 2016-02-26 08:15:22 | NULL | NULL | 477 | 10.1.81.220 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 0 |+---------------------+------------+------------+-----+-------------+------------+-----------+--------+----------+----------------------+------+---------------+---------+
其中start—end之间的IP reserved 字段为0,而其他IP 此字段为1,也就是说其他IP都是保留的IP不可用
创建一个虚拟机试试
nova list+--------------------------------------+-------+--------+------------+-------------+------------------+| ID | Name | Status | Task State | Power State | Networks |+--------------------------------------+-------+--------+------------+-------------+------------------+| ab417044-d1be-4d1a-af91-7bb38a018128 | test1 | ACTIVE | - | Running | || 5c3fa1bf-4140-4699-9c5b-2fb833ab9851 | test2 | ACTIVE | - | Running | net1=10.1.81.215 |+--------------------------------------+-------+--------+------------+-------------+------------------+
发现215的IP已经有了信息
MariaDB [nova]> select id,address,network_id,allocated,leased,reserved,virtual_interface_id,instance_uuid,deleted from fixed_ips where reserved = 0;+-----+-------------+------------+-----------+--------+----------+----------------------+--------------------------------------+---------+| id | address | network_id | allocated | leased | reserved | virtual_interface_id | instance_uuid | deleted |+-----+-------------+------------+-----------+--------+----------+----------------------+--------------------------------------+---------+| 472 | 10.1.81.215 | 1 | 1 | 1 | 0 | 1 | 5c3fa1bf-4140-4699-9c5b-2fb833ab9851 | 0 || 473 | 10.1.81.216 | 1 | 0 | 0 | 0 | NULL | NULL | 0 || 474 | 10.1.81.217 | 1 | 0 | 0 | 0 | NULL | NULL | 0 || 475 | 10.1.81.218 | 1 | 0 | 0 | 0 | NULL | NULL | 0 || 476 | 10.1.81.219 | 1 | 0 | 0 | 0 | NULL | NULL | 0 || 477 | 10.1.81.220 | 1 | 0 | 0 | 0 | NULL | NULL | 0 |+-----+-------------+------------+-----------+--------+----------+----------------------+--------------------------------------+---------+6 rows in set (0.01 sec)
我想,如果单纯想让某个IP能用,直接修改reserved 应该是可行的,先探讨到这里,下次再继续。
- 关于nova-network的fixed IP的扩容的初探
- nova-network 固定IP的释放
- Neutron 理解(5):Neutron 是如何向 Nova 虚机分配固定IP地址的 (How Neutron Allocates Fixed IPs to Nova Instance)
- 关于Codis的动态扩容
- 关于List的扩容问题
- 关于MySQL的在线扩容
- 关于arrayList的初始量扩容以及扩容的效率
- Nova-network中发现的一个SNAT问题
- windows虚拟机nova-network flatmanager的使用实践
- 关于opentack的(3)--nova api简析
- 关于IE6不支持position:fixed的解决办法
- 关于java数组的扩容问题
- 关于StringBuilder和StringBuffer扩容的问题
- 关于分区表的初探
- 关于分区表的初探
- 关于RecylerView的初探
- nova list的nova-api.log
- 关于缺省路由传递问题的探讨(ip default-network、ip default-gateway、ip route 0/0)
- 代理模式
- SAS CE - CE5 Model Lift
- 开发常用网址
- mysql中授权(grant)和撤销授权(revoke)等命令的用法详解[转]
- DiscuzX3.2禁止登录及注册功能
- 关于nova-network的fixed IP的扩容的初探
- Git基本操作
- 《数据结构》进行曲 之 单链表实现学生信息管理系统
- [memory]C语言关于字节对齐的问题
- (一)Spring 简介
- 执行shell脚本出现bin/bash: bad interpreter: No such file or directory
- 如何处理PB级别数据(2)——Apache Solr 之 使用SolrJ操作索引库
- Chronometer实现计时器
- 【HDU3394】Railway【BCC】【桥】