一次devstack环境创建vm失败的调试过程




问题比较简单,就是搭好了Mitaka版本devstack环境后(nova+neutron+glance+keystone+cinder),nova boot创建vm,nova-api一直报错:

看错误信息是发送的RabbitMQ消息没有收到consumer回复,最后超时报错了。

看代码是为了验证创建vm使用的网络是否有足够的port可用,然后nova做不了判断,需要发rpc出去给“neutron”帮忙确认,注意这里的“neutron”加了引号。

刚开始我以为是RabbitMQ的配置不对,比如用户名密码或者用户权限没配置好,就修改配置文件改用MQ默认的guest、guest用户密码来发送rpc消息,结果还是超时。

然后就对比了看了物理环境的MQ里的queue和exchange,没发现异常,决定下ipdb断点调试,单步调试了很久,看到使用的exchange是nova,topic是network,通过RabbitMQ的web插件(rabbitmq-plugins enable rabbitmq_management启用该插件,默认端口号是15672)看了下nova这个exchange,里面没有network队列,其他正常的环境也没有。

neutron那边没有注册上来?但是重启了neutron-server也没看到异常日志,并且显示MQ已正常连接了。

只能去正常的环境里打断点调试对比了,结果发现走的代码流程不一样,应该是走到nova.network.neutronv2.api.API#validate_networks,而不是nova.network.api.API#validate_networks,这时才恍然大悟,原来是nova配置文件有问题,少配置了use_neutron = True(默认值是False),导致走到了nova-network流程,nova-api试图发rpc请求给nova-network服务来验证网络参数。

修改nova.conf加上use_neutron = True之后,重启nova-api服务,再进行nova boot创建vm,一切正常了。。。。