本文章由公号【开发小鸽】发布!欢迎关注!!!
老规矩–妹妹镇楼:

1. 虚拟机扩容功能测试
由于之前测试虚拟机迁移时出现了错误,查看schedule日志发现是计算节点被忽略掉了,感觉像是filter过滤器的设置问题,因此尝试修改配置。
修改nova.conf中的配置:
scheduler_driver=nova.scheduler.filterscheduler.FilterScheduler
scheduler_available_filters = nova.scheduler.filters.all_filters
scheduler_default_filters = AvailabilityZoneFilter, RamFilter, DiskFilter, ComputeFilter
重启Compute节点和Controller节点,重新测试虚拟机迁移功能依然是失败的,因此只能恢复刚才添加的配置,重新测试,依然是失败,查看nova-scheduler.log日志:
2021-10-11 10:33:44.937 2519 INFO nova.scheduler.host_manager [req-cec559e8-409d-4e8c-9b06-f56a0b9cbc0a 9942eb4321644336a0c7383d9f1c2bed a7d812868cb74f1a978035530f55f1d0 - default default] Host filter ignoring hosts: computer
2021-10-11 10:33:44.944 2519 WARNING nova.scheduler.filters.compute_filter [req-cec559e8-409d-4e8c-9b06-f56a0b9cbc0a 9942eb4321644336a0c7383d9f1c2bed a7d812868cb74f1a978035530f55f1d0 - default default] (localhost.localdomain, localhost.localdomain) ram: 3258MB disk: 32768MB io_ops: 0 instances: 0 has not been heard from in a while
2021-10-11 10:33:44.945 2519 INFO nova.filters [req-cec559e8-409d-4e8c-9b06-f56a0b9cbc0a 9942eb4321644336a0c7383d9f1c2bed a7d812868cb74f1a978035530f55f1d0 - default default] Filter ComputeFilter returned 0 hosts
2021-10-11 10:33:44.945 2519 INFO nova.filters [req-cec559e8-409d-4e8c-9b06-f56a0b9cbc0a 9942eb4321644336a0c7383d9f1c2bed a7d812868cb74f1a978035530f55f1d0 - default default] Filtering removed all hosts for the request with instance ID '739bd9ea-4b50-46ca-98ba-e0ae01d86119'. Filter results: ['AvailabilityZoneFilter: (start: 1, end: 1)', 'ComputeFilter: (start: 1, end: 0)']
可以看到,首先计算节点computer就已经被忽略掉了,因此后续的操作都是无法进行的。
在这种情况下怎样定位到错误呢?只有通过源码才能够定位到错误,因此根据日志中的报错情况“Host filter ignoring hosts: computer”,在百度中查询到该语句可能在nova的源码中,因此在OpenStack源码的/usr/lib/python2.7/site-packages/nova/scheduler
目录下进行搜索:
find -type f | xargs grep "Host filter ignoring hosts"
host_manager文件的get_filtered_hosts方法下:
但是,这样是无法找到对应的错误的。
nova的冷迁移migrate操作其实调用的就是执行resize修改实例大小操作,因此我们只需要查看resize的nova源码,查看到如下的源码代表着默认将当前的实例所在的Compute节点的host忽略,加入ignore_hosts中:
// 是否允许迁移到同一台主机, 默认为False
if not CONF.allow_resize_to_same_host:
filter_properties['ignore_hosts'].append(instance.host)
终于真相大白,我们只需要修改nova.conf配置文件的allow_resize_to_same_host为true即可,重新启动Controller节点和Compute节点,发现Controller节点的IP地址竟然被修改了,因此设定Controller节点的IP为固定的IP,修改网卡配置文件:vi /etc/sysconfig/network-scripts/ifcfg-ens33,指定固定的IP地址和子网掩码,添加如下的三行:
BOOTPROTO="static"
IPADDR=192.168.112.146
NETMASK=255.255.255.0
在dashboard中重新执行resize操作,成功的话会出现如下的提示:
在这里插入图片描述
接着会与用户进行交互,提示进行确认是否resize:
点击确认后,flavor就直接切换为了新的flavor:
2. 虚拟机迁移功能测试
启动一个虚拟机实例,在admin管理员权限下执行迁移实例操作,该虚拟机直接迁移失败了,查看compute节点的nova-compute.log日志得到UnableToMigrateToSelf错误,表示无法迁移到当前的Compute节点中。
查看 /usr/lib/python2.7/site-packages/nova/compute/manager.py
文件,搜索该错误得到如下的源码:
4661 same_host = instance.host == self.host
4662 # if the flavor IDs match, it's migrate; otherwise resize
4663 if same_host and instance_type.id == instance['instance_type_id']:
4664 # check driver whether support migrate to same host
4665 if not self.driver.capabilities.get(
4666 'supports_migrate_to_same_host', False):
4667 # Raise InstanceFaultRollback so that the
4668 # _error_out_instance_on_exception context manager in
4669 # prep_resize will set the instance.vm_state properly.
4670 raise exception.InstanceFaultRollback(
4671 inner_exception=exception.UnableToMigrateToSelf(
4672 instance_id=instance.uuid, host=self.host))
该源码表示着,如果要迁移到同一个host主机中,还需要check以下驱动是否支持迁移到同一个节点中,这个是设定在该驱动之中的参数“supports_migrate_to_same_host”,如果查询出该驱动不允许迁移到同一个host主机中,则抛出异常“UnableToMigrateToSelf”。
该参数是从nova/virt/driver.py文件获取的,参数是supports_migrate_to_same_host,默认的参数是false。就是因为这个false参数导致的异常,怎样才能将该参数修改为true呢?
尝试修改参数allow_migrate_to_same_host为true,表示允许迁移到相同的host节点中,但是好像没什么用啊。
allow_migrate_to_same_host=True
推测可能是冷迁移操作和热迁移操作都需要在多个计算节点中进行,当前的实验环境只有单个计算节点,因此暂不测试迁移操作。