###################################################################

# Start: Jeffrey 的话
###############################################################################################

具体请看官方的介绍:http://docs.openstack.org/developer/nova/conductor.html

Conductor as a place for orchestrating tasks

1. nova-conductor作用

nova-conductor除了用作一个是DB proxy之外,它还有一个作用就是可以对任务进行编排。比如:重新创建一个Instance, insance 迁移,Instance创建等工作都是由于来负责“分配工作”(实际它并不负责执行相关的动作,它只是进行任务的编排)。
2. 好处:
可以把nova-scheduler的工作与nova-compute的工作完全分开,各司其职。

3. 为什么选择nova-conductor做这件事情
可以根据response同步请求 nova-scheduler.  

###################################################################

# End Jeffrey 的话
###################################################################

http://www.aboutyun.com/thread-17436-1-1.html

综述

启动一个新的instance涉及到很多openstack nova里面的组件
  • API server:处理客户端的请求,并且转发到cloud control
  • Cloud control:处理compute节点,网络控制节点,API server和scheduler中间连接
  • Scheduler:选择一个host去执行命令
  • compute worker:启动和停止实例,附加和删除卷 等操作
  • network controller:管理网络资源,分配固定IP,配置vlans

  1.API server将消息发送到Cloud Controller
2. Authertication 保用户有权限,然后Cloud Controller将消息发送给Scheduler
3. Scheduler caste 一个消息给一个选择好的host要求他启动一个实例
4.compute worker(选择的那个host)获取到消息
5.6.7.8 compute worker需要一个固定的ip去启动一个实例,所以向network controller发送消息

下面我将详细说明一下:

API

1.可以在dashboard网页上面进行
2.可以用命令行 euca-add-keypair        euca-run-instances
用户的请求发送到nova-api,有两种方式
第一种:通过openstack api (nova/api/servers.py 类 class Controller(object))create方法
def create(self, req, body):
""" Creates a new server for a given user """
if 'server' in body:
body['server']['key_name'] = self._get_key_name(req, body)
extra_values = None
extra_values, instances = self.helper.create_instance(
req, body, self.compute_api.create)

第二种:通过ec2 api (nova/api/cloud.py 中类 CloudController )
调用def run_instances(self, context, **kwargs):
...
(instances, resv_id) = self.compute_api.create(context,
instance_type=instance_types.get_instance_type_by_name(
kwargs.get('instance_type', None)),
...

最终调用的Compute API create():
  • 查看这种类型的instance是否达到最大值
  • 如果不存在安全组,就创建个
  • 生成MAC地址和hostnames
  • 给scheduler发送一个消息去运行这个实例

CAST

当然maxCount为1(默认值为1)的时候 调用RPC.cast方法向scheduler发送运行实例的消息
在openstack中通过RPC.cast来发送消息,消息的分发通过RabbitMQ。消息发送方(Compute API)往
topic exchange(scheduler topic)发送一个消息,消息消费者(Scheduler worker)从队列中获得消息,
cast调用不需要返回值。
[python] view plaincopy
  1. def _schedule_run_instance(self,
  2. ...
  3. return rpc_method(context,
  4. FLAGS.scheduler_topic,
  5. {"method": "run_instance",
  6. "args": {"topic": FLAGS.compute_topic,
  7. "request_spec": request_spec,
  8. "admin_password": admin_password,
  9. "injected_files": injected_files,
  10. "requested_networks": requested_networks,
  11. "is_first_time": True,
  12. "filter_properties": filter_properties}})

Scheduler

scheduler接收到消息,然后通过设定的scheduler策略选择一个目的host,如:zone scheduler
选择一个主机在特定的可获取的zone上面。最后发送一个cast消息到特定的host上面
[python] view plaincopy
  1. def cast_to_compute_host(context, host, method, update_db=True, **kwargs):
  2. """Cast request to a compute host queue"""
  3. if update_db:
  4. # fall back on the id if the uuid is not present
  5. instance_id = kwargs.get('instance_id', None)
  6. instance_uuid = kwargs.get('instance_uuid', instance_id)
  7. if instance_uuid is not None:
  8. now = utils.utcnow()
  9. db.instance_update(context, instance_uuid,
  10. {'host': host, 'scheduled_at': now})
  11. rpc.cast(context,
  12. db.queue_get_for(context, 'compute', host),
  13. {"method": method, "args": kwargs})
  14. LOG.debug(_("Casted '%(method)s' to compute '%(host)s'") % locals())

Compute

compute worker进程接收到消息执行方法(nova/compute/manager.py)
[python] view plaincopy
  1. def _run_instance(self, context, instance_uuid,
  2. requested_networks=None,
  3. injected_files=[],
  4. admin_password=None,
  5. is_first_time=False,
  6. **kwargs):
  7. """Launch a new instance with specified options."""
  8. context = context.elevated()
  9. try:
  10. instance = self.db.instance_get_by_uuid(context, instance_uuid)
  11. self._check_instance_not_already_created(context, instance)
  12. image_meta = self._check_image_size(context, instance)
  13. self._start_building(context, instance)
  14. self._notify_about_instance_usage(instance, "create.start")
  15. network_info = self._allocate_network(context, instance,
  16. requested_networks)
  17. try:
  18. block_device_info = self._prep_block_device(context, instance)
  19. instance = self._spawn(context, instance, image_meta,
  20. network_info, block_device_info,
  21. injected_files, admin_password)
  22. ...
  • 检查instance是否已经在运行
  • 分配一个固定的ip地址
  • 如果没有设置vlan和网桥,设置一下
  • 最后通过虚拟化的driver spawn一个instance

network controller

network_info = self._allocate_network(context, instance,
requested_networks)

调用network的API的allocate_for_instance方法

[python] view plaincopy
  1. def allocate_for_instance(self, context, instance, **kwargs):
  2. """Allocates all network structures for an instance.
  3. :returns: network info as from get_instance_nw_info() below
  4. """
  5. args = kwargs
  6. args['instance_id'] = instance['id']
  7. args['instance_uuid'] = instance['uuid']
  8. args['project_id'] = instance['project_id']
  9. args['host'] = instance['host']
  10. args['rxtx_factor'] = instance['instance_type']['rxtx_factor']
  11. nw_info = rpc.call(context, FLAGS.network_topic,
  12. {'method': 'allocate_for_instance',
  13. 'args': args})

RPC.call 与RPC.cast最大的不同 就是call方法需要一个response

Spawn instance

接下来我要说的就是虚拟化的driver spawn instance,我们这里使用的是libvirt(nova/virt/libvirt/lconnection.py)
[python] view plaincopy
  1. def spawn(self, context, instance, image_meta, network_info,
  2. block_device_info=None):
  3. xml = self.to_xml(instance, network_info, image_meta, False,
  4. block_device_info=block_device_info)
  5. self.firewall_driver.setup_basic_filtering(instance, network_info)
  6. self.firewall_driver.prepare_instance_filter(instance, network_info)
  7. self._create_image(context, instance, xml, network_info=network_info,
  8. block_device_info=block_device_info)
  9. self._create_new_domain(xml)
  10. LOG.debug(_("Instance is running"), instance=instance)
  11. self._enable_hairpin(instance)
  12. self.firewall_driver.apply_instance_filter(instance, network_info)
  13. def _wait_for_boot():
  14. """Called at an interval until the VM is running."""
  15. try:
  16. state = self.get_info(instance)['state']
  17. except exception.NotFound:
  18. LOG.error(_("During reboot, instance disappeared."),
  19. instance=instance)
  20. raise utils.LoopingCallDone
  21. if state == power_state.RUNNING:
  22. LOG.info(_("Instance spawned successfully."),
  23. instance=instance)
  24. raise utils.LoopingCallDone
  25. timer = utils.LoopingCall(_wait_for_boot)
  26. return timer.start(interval=0.5, now=True)
  • 通过libvirt xml文件,然后根据xml文件生成instance
  • 准备network filter,默认的fierwall driver是iptables
  • image的创建(详细情况以后再介绍)

def _create_image(self, context, instance, libvirt_xml, suffix='',

disk_images=None, network_info=None,
block_device_info=None):

...
  • 最后虚拟化driver的spawn()方法中调用driver 的creatXML()

转载于:https://www.cnblogs.com/double12gzh/p/10166182.html

nova创建instance流程相关推荐

  1. nova 创建虚拟机流程

    1   Nova创建虚机流程 Openstack创建虚拟机的整个流程如图1所示.前端horizon发送创建虚机的请求之后,novaapi接收请求,并作处理,详见1.1节.注:Nova schedule ...

  2. Nova创建虚拟机流程解读

    一 介绍 创建一个虚拟机至少需要指定的参数有3个:虚拟机名字,镜像,Flavor.执行"nova image-list"命令可以看到目前可用的虚拟机镜像. 命令执行结果如下: [r ...

  3. openstack e版创建instance整个流程

    2019独角兽企业重金招聘Python工程师标准>>> 感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息. Be ...

  4. Nova 启动虚拟机流程解析

    目录 文章目录 目录 前言 从请求说起 nova-api service 阶段 前言 Nova 启动虚拟机的东西太多,持续更新- 从请求说起 无论是通过 Dashboard 还是 CLI 启动一个虚拟 ...

  5. 【JVM】Java对象创建的流程步骤

    · 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...

  6. nova创建虚拟机源码分析系列之六 api入口create方法

    openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用. 该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列 ...

  7. OpenStack---T版-nova组件部署流程

    OpenStack---T版-nova组件部署流程 nova组件部署位置 计算节点Nova服务配置 nova组件部署位置 [控制节点ct] nova-api(nova主服务) nova-schedul ...

  8. Perforce使用之创建DEPOT流程

    Perforce 创建Depot流程 1.  创建Depot存储目录 #mkdir newdepot <?xml:namespace prefix = v ns = "urn:sche ...

  9. 2018-04-07进程创建学习流程

    进程创建的流程学习博客 http://gityuan.com/2016/03/26/app-process-create/ 转载于:https://www.cnblogs.com/buder-cp/p ...

最新文章

  1. 5、Linux系统的目录结构
  2. ImportError: Could not find ‘cudart64_100.dll报错
  3. 欢迎来到“现实”世界,bilibili!
  4. A. And Then There Were K
  5. 冷热rx-java可观察
  6. WINCE 下配置 QT 的方法
  7. I/O Permission Bit Map in Task State Segment(TSS)
  8. python dataframe排序_python – Pandas DataFrame排序忽略了这种情况
  9. excel怎么批量插行_批量制作anki卡片最易上手方法
  10. mac新手入门:在Mac上怎么使用夜览
  11. c语言设计函数型号发生器,基于51单片机函数信号发生器
  12. OTO电子商务商业模式探析
  13. 大华监控相机RTSP视频流
  14. excel如何去重统计户数_如何用好excel统计函数
  15. 信息安全实验:实现一个fake-wifi
  16. 初识 PS CS6(十三)___用快速选择工具择图
  17. 微信小程序制作全流程(1)
  18. 程序的优化 文字的减法
  19. TIOBE 8 月编程语言排行榜:数据挖掘和人工智能语言强势崛起!
  20. [ZCMU OJ]1633: 酷酷的单词(遍历)

热门文章

  1. mybatis 遍历数组_Mybatis中别名、插件与数据源配置
  2. 最简单快捷搭建私链步骤笔记
  3. 学习Java必须避开的十大致命雷区,新手入门千万不要踩!
  4. Ghost 2.18.3 发布,基于 Markdown 的在线写作平台
  5. mysql Table 'performance_schema.session_variables' doesn't exist
  6. 你的袜子还是干的吗?
  7. 移动端的推拉效果导航菜单-支持响应式及其多层菜单
  8. PAT1057. 数零壹
  9. C++学习笔记(10)运算符重载,友元函数,友元类
  10. 工作之后如何高效的学习?