分享

openstack虚拟机启动过程

hyj 发表于 2014-2-12 17:24:26 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 41359
阅读本文章可以带着下面问题:

1.openstac经过几个节点?
2.如何启动虚拟机?
3.能否总结出启动命令的使用?


在nova内部,启动启动一个虚拟机会涉及到很多组件:
a) API服务器:出来用户请求和转发请求到控制节点。
b) 控制节点:处理计算节点,网络节点,API节点和调度节点之间的通信。
c) 调度节点:选择一台host去运行实例。
d) 计算节点:管理实例,启动/关闭实例,添加/删除卷。
e) 网络节点: 管理网络资源,分配fixed ip,配置vlans……

注意:OpenStack中还有很多其他的组件,例如认证服务(keystone),对象存储(swift),逻辑卷服务(nova-volume或cinder),我们现在要讲的是实例的启动,其他暂时不说。

虚拟机启动流程是这样的:API服务接受到用户run_instance的请求,然后API服务将请求转发给控制节点。
1) 认证服务将会验证用户的请求,验证通过后,控制节点会将请求发给调度节点。
2) 调度节点将请求随机转发给一个Host(计算节点),让它启动实例。
3) 计算节点接受请求。
4) 计算节点启动虚拟机的时候需要ip,所以会发请求到网络节点以获取网络资源。

06155303_cmtX.jpg


1. 用户向nova-api发送请求

用户发送请求到nova-api,这里有两种:
    a.通过openstack api  从 server.py's controller.create():
  1. self.helper.create_instance(req, body, self.compute_api.create)
复制代码
create_instance_helper.CreateInstanceHelper()  查表获取基本信息

       b.通过ec2 api
      从cloud.py.run_instances() 统一调  computer.api.create() 将新的数据插回去
  1. self._ask_scheduler_to_create_instance(context, base_options, instance_type, zone_blob, availability_zone, injected_files, admin_password, image, instance_id=instance_id, requested_networks=requested_networks)
复制代码
2. API 将处理好的数据通过MQ 转发给scheduler .(code from Computer.api)
  1. rpc.cast(context, FLAGS.scheduler_topic, {"method": "run_instance", "args": {"topic": FLAGS.compute_topic, "instance_id": instance_id, "request_spec": request_spec, "availability_zone": availability_zone, "admin_password": admin_password, "injected_files": injected_files, "requested_networks": requested_networks}})
复制代码
3. Scheduler  获取信息并作出决定 哪一个host 可以来run instance.
  1. def __getattr__(self, key): return functools.partial(self._schedule, key)
复制代码
  1. def _schedule(self, method, context, topic, *args, **kwargs): ....... rpc.cast(context, db.queue_get_for(context, topic, host), {"method": method, "args": kwargs}) LOG.debug(_("Casted to %(topic)s %(host)s for %(method)s") % locals())
复制代码
4. Computer 从池中获取信息 并让 Networker 去准备一个ip ,让volume 准备卷, 然后初始化相应的信息,例如创建image,映射device,创建domain, 并将domain 放入running pool中  然后就进入等待直到instance的状态变为running.

       a. networker 分配ip
  1. network_info = self.network_api.allocate_for_instance(context, instance, vpn=is_vpn, requested_networks=requested_networks)
复制代码
  1. def allocate_floating_ip(self, context): return rpc.call(context, FLAGS.network_topic, {'method': 'allocate_floating_ip', 'args': {'project_id': context.project_id}})
复制代码
b  让 volume 准备卷
  1. bd_mapping = self._setup_block_device_mapping(context, instance_id) def create(self, context, size, snapshot_id, name, description, volume_type=None, metadata=None, availability_zone=None): rpc.cast(context, FLAGS.scheduler_topic, {"method": "create_volume", "args": {"topic": FLAGS.volume_topic, "volume_id": volume['id'], "snapshot_id": snapshot_id}})
复制代码
c   call nova.virt.libvirt.firewall.IptablesFirewallDriver 建立网络规则
          //
     d  call libvirt 创建domian 并launch
  1. domain = self._create_new_domain(xml) def _create_new_domain(self, xml, persistent=True, launch_flags=0): if persistent: # To create a persistent domain, first define it, then launch it.  domain = self._conn.defineXML(xml) domain.createWithFlags(launch_flags) else: # createXML call creates a transient domain  domain = self._conn.createXML(xml, launch_flags) return domain
复制代码
e  call virt.libvirt.connetion.spwan 等待
  1. def spawn(self, context, instance, network_info, block_device_info=None): .......... def _wait_for_boot(): instance_name = instance['name'] try: state = self.get_info(instance_name)['state'] except exception.NotFound: msg = _("During reboot, %s disappeared.") % instance_name  
  2.                      LOG.error(msg) raise utils.LoopingCallDone if state == power_state.RUNNING: msg = _("Instance %s spawned successfully.") % instance_name  
  3.                 LOG.info(msg) raise utils.LoopingCallDone timer = utils.LoopingCall(_wait_for_boot) return timer.start(interval=0.5, now=True)
复制代码
5 一旦instance的状态改变至running,他就会去通过networker获取网络信息, 这里有几种方式,取决于你的networkManager

       用户验证,资源配额分配,创建实例,nova-network分配IP地址,scheduler根据计算节点查看负载情况选择虚拟机所属服务器,检查本地是否有虚拟机模板,(如果没有)从glance下载模板,利用copy on write 创建虚拟机系统镜像,生成虚拟机配置文件(包含dhcp获取的ip地址),启动虚拟机,用户可以通过web端 的novnc查看虚拟机系统内信息。web端提供块存储、快照、重启等操作。。。一般是按时计费,按系统配置选取套餐类型。。。






来自群组: openstack技术组

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

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

本版积分规则

关闭

推荐上一条 /2 下一条