综述
启动一个新的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调用不需要返回值。