Nova启动虚拟机执行过程

Posted peach_li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nova启动虚拟机执行过程相关的知识,希望对你有一定的参考价值。

OpenStack Nova中与启动虚拟机相关的组件:

  • API server: 处理来自用户的请求并转发到cloud controller.
  • Cloud controller: 处理计算节点, the networking controllers, the API server and the scheduler之间的通信
  • Scheduler: 选择一个节点来执行命令(启动虚拟机)
  • Compute worker: 管理虚拟机实例:启动/终止虚拟机,绑定,解绑磁盘卷
  • Network controller: 管理网络资源:分配固定IP,管理VLANs…

Note: 本文仅关注虚拟机启动,而对身份验证,镜像存储等相关细节不做探究


首先API server收到一个来自用户的run_instances命令:
  1. API server把这条消息转发给云控制器
  2. 先要认证用户有需要的权限。云控制器把消息发给调度器
  3. 调度器把这条消息扔给一个随机的host(计算节点),并请求启动一台新虚拟机。
  4. 计算节点上的compute worker捕获这条消息
  5. 6.7.8. compute worker需要一个固定IP来启动新虚拟机,因此发送一条消息给network controller。


API


有两种API OpenStack API和EC2 API。这里使用EC2 API。先添加一个新的key pair,然后用它来启一台规模是m1.tiny的虚拟机
1 cd /tmp/
2 euca-add-keypair test > test.pem
3 euca-run-instances -k test -t m1.tiny ami-tiny
api/ec2/cloud.py中的 run_instances()使用了compute API ——位于compute/API.py下的create() 
1 def run_instances(self, context, **kwargs):
2   ...
3   instances = self.compute_api.create(context,
4             instance_type=instance_types.get_by_type(
5                 kwargs.get('instance_type', None)),
6             image_id=kwargs['image_id'],
7             ...

compute的API create() 会做如下这下事情 :

  • 检查此类型虚拟机数量是否达到最大值
  • 如果没有安全组的话创建一个
  • 为新虚拟机生成MAC地址和hostnames
  • 向调度器发消息来启动虚拟机

Cast


现在看看消息是怎么发送到调度器的。在OpenStack中这种消息交付类型叫做RPC转换,在转换中使用了RabbitMQ。发布者(API)发送消息到一个交易处(topic exchange),消费者(scheduler worker)从队列中获取消息。正是因为这是一个cast而不是call,因此并没有响应发生。

下面是casting消息的代码:

1 LOG.debug(_("Casting to scheduler for %(pid)s/%(uid)s's"
2         " instance %(instance_id)s") % locals())
3 rpc.cast(context,
4          FLAGS.scheduler_topic,
5          "method": "run_instance",
6           "args": "topic": FLAGS.compute_topic,
7                    "instance_id": instance_id,
nova命令管理虚拟机

Nova — 启动 GPU 虚拟机

Openstack深入了解虚拟机

在Openstack控制节点上使用nova命令创建虚拟机(详细图文过程)

openstack创建虚拟机的步骤

如何在openstack中创建镜像 for Juno

(c)2006-2024 SYSTEM All Rights Reserved IT常识