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命令:
- API server把这条消息转发给云控制器
- 先要认证用户有需要的权限。云控制器把消息发给调度器
- 调度器把这条消息扔给一个随机的host(计算节点),并请求启动一台新虚拟机。
- 计算节点上的compute worker捕获这条消息
- 6.7.8. compute worker需要一个固定IP来启动新虚拟机,因此发送一条消息给network controller。
API
有两种API OpenStack API和EC2 API。这里使用EC2 API。先添加一个新的key pair,然后用它来启一台规模是m1.tiny的虚拟机
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): |
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' ], |
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 ()) |
5 |
"method" : "run_instance" , |
6 | "args" : "topic" : FLAGS.compute_topic, |
7 | "instance_id" : instance_id, |