分享

openstack计算节点宕机,不能恢复的实例总结

hyj 发表于 2014-2-10 19:57:51 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 31512
本帖最后由 hyj 于 2014-2-10 20:08 编辑

可以带着下面问题来阅读此总结:
1.如何查看计算节点宕机运行的虚拟机
2.虚拟机从一个节点迁移另一个节点都需要经过什么步骤,做什么操作?

一、openstack下,重启 compute,实例不会自动恢复的问题在 openstack 下,重新启动compute,实例不会自动恢复,解决办法:

修改 /etc/nova.conf,添加两个选项:

start_guests_on_host_boot = True

resume_guests_state_on_host_boot =True



注意的是,如果使用了nova-volume,则自动启动还是有问题的。这时,需要自己写脚本,进行启动。



这两个选项在文档中没有说明,大家可以参见代码:

nova/compute/manager.py:
if ((expect_running and FLAGS.resume_guests_state_on_host_boot) or
FLAGS.start_guests_on_host_boot):
LOG.info(_(‘Rebooting instance after nova-compute restart.’),
locals(), instance=instance)
self.reboot_instance(context, instance['uuid'])
elif drv_state == power_state.RUNNING:
# Hyper-V and VMWareAPI drivers will raise an exception
try:
net_info = self._get_instance_nw_info(context, instance)
self.driver.ensure_filtering_rules_for_instance(instance,
self._legacy_nw_info(net_info))
except NotImplementedError:
LOG.warning(_(‘Hypervisor driver does not support ‘
‘firewall rules’))



---------------------------------------------------------------------------------------------------------------------------------------------------

openstack计算节点宕机,恢复运行在上面的实例

暂时不考虑冷迁移,看看计算节点宕掉后能不能恢复上面跑的实例。
两个计算节点,上面的实例跑在共享存储上

  1. compute_one 上有 vm_1
  2. compute_two 上跑着 vm_2
复制代码
现在去compute_one上停掉服务或断电

  1. # /etc/init.d/openstack-nova-compute stop
  2. # /etc/init.d/openstack-nova-network stop
复制代码
OK, compute_one节点已经挂了,vm_1的数据还在共享存储上,我们把compute_one上的vm_1搞到compute_two上

compute_one挂了后,我们需要知道它上面运行了哪些虚拟机,从而把这些虚拟机搞到compute_two节点上
在控制节点上查询
  1. # nova-manage vm list | grep compute_one | awk '{print $1}'
  2. vm_1
复制代码
只有一个vm_1
在mysql中修改instances表,把vm_1所在的host改成compute_two

  1. # mysql -uroot -pmysql
  2. mysql> use nova;
  3. mysql> update instances set host='compute_two' where hostname='vm_1';
  4. OK!
复制代码
查看vm_1它的实例名字是什么

  1. # nova show vm_1  | grep instance_name | awk '{print $4}'
  2. instance-00000004
复制代码
去compute_two上查看vm_1的xml防火墙规则名字

  1. # instance_name='instance-00000004'
  2. cd /var/lib/nova/instances/$instance_name
  3. # filter_name=`cat libvirt.xml  | grep filter= | awk -F'"' '{print $2}'`
  4. # echo $filter_name
  5. nova-instance-instance-00000004-fa163e0cb87b
复制代码
在compute_two上新建vm_1防火墙规则文件

  1. # filter_uuid=`uuidgen $filter_name`
  2. # cat > /etc/libvirt/nwfilter/$filter_name.xml << _LongGeek_
  3. <filter name='$filter_name' chain='root'>
  4.   <uuid>$filter_uuid</uuid>
  5.   <filterref filter='nova-base'/>
  6. </filter>
  7. _LongGeek_
复制代码
提取vm_1的mac地址和ip地址

  1. # instance_mac=`cat /var/lib/nova/instances/$instance_name/libvirt.xml | grep mac | awk -F "'" '{print $2}'`
  2. # instance_ip=`cat /var/lib/nova/instances/$instance_name/libvirt.xml | grep IP | awk -F '"' '{print $4}'`
复制代码
把vm_1的ip地址写入到配置文件
  1. # echo -e "n$instance_mac,vm_1.novalocal,$instance_ip" >> /var/lib/nova/networks/nova-br100.conf
复制代码
重启libvirtd,让防火墙规则生效
  1. # /etc/init.d/libvirtd restart
复制代码
定义xml文件,并启动
  1. # cd /var/lib/nova/instances/$instance_name/
  2. # virsh define libvirt.xml
  3. # virsh start instance-00000004
复制代码
OK.数据在,fixed网络也没有问题.
恢复floating ip,首先需要在mysql中找出vm_1以前使用的floating ip是多少
先找出vm_1的fixed ip的id号
  1. # fixed_id=`mysql -uroot -pmysql -e "select * from nova.fixed_ips where address=$instance_ip;" | awk '{print $7}' | tail -n 1`
复制代码
通过vm_1的fixed ip的id号找出float ip地址
  1. # float_ip=`mysql -uroot -pmysql -e "select * from nova.floating_ips where id=$fixed_id;" | awk '{print $7}' | tail -n1`
复制代码
修改float ip地址所在的host
  1. # mysql -uroot -pmysql -e "update nova.floating_ips set host='compute_two' where address=$float_ip;"
复制代码
手工添加$float_ip到compute_two上
  1. # ip addr add $float_ip/32 dev eth1
复制代码
添加iptables规则
  1. # iptables -t nat -A nova-network-OUTPUT -d $float_ip/32 -j DNAT --to-destination $instance_ip
  2. # iptables -t nat -A nova-network-PREROUTING -d $float_ip/32 -j DNAT --to-destination $instance_ip
  3. # iptables -t nat -A nova-network-float-snat -s $instance_ip/32 -j SNAT --to-source $float_ip
  4. # /etc/init.d/iptables save
复制代码
开启路由转发
  1. # vim /etc/sysctl.conf
  2. net.ipv4.ip_forward = 1
  3. # sysctl -p
复制代码
OK,floating_ip也恢复了,都可以在dashboard上操作。




来自群组: openstack技术组

没找到任何评论,期待你打破沉寂

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

本版积分规则

关闭

推荐上一条 /2 下一条