CloudStack创建VM过程梳理

article/2025/9/9 21:48:06

原文地址(http://www.wangdk.com/?p=58)
转载自@davidstack
地址:https://blog.csdn.net/wangdk789/article/details/36682435

先把整理的流程图附上
这里写图片描述

下面按照每个步骤进行说明:

1、com.cloud.api.ApiServlet.processRequest(HttpServletRequest, HttpServletResponse) 函数处理所有请求。具体处理登录、登出请求其他请求进行转发,进入下一步

2、com.cloud.api.ApiServer.handleRequest(Map, String, StringBuffer)

收到创建VM的请求,解析参数根据参数“command” 实例化处理该API的类,并将请求参数赋值到该类创建的对象,对于创建VM,实例化的类为:

org.apache.cloudstack.api.command.user.vm.DeployVMCmd。

由于继承自BaseAsyncCreateCmd,所以需要首先调用DeployVMCmd的create函数,再调用execute函数

Note:基于注解赋值:com.cloud.api.ApiDispatcher.processParameters(BaseCmd, Map(String, String)),权限管理也是通过注解完成的。

3、org.apache.cloudstack.api.command.user.vm.DeployVMCmd.create()

3.1 检查zone、serviceoffering、templateId、diskoffering、zone是否启用了本地存储、获取ipv4,、ipv6地址,判断是基本zone,还是高级zone

3.2 如果是基本zone,需要调用函数

com.cloud.vm.UserVmManagerImpl.createBasicSecurityGroupVirtualMachine(DataCenter,ServiceOffering, VirtualMachineTemplate, List(Long), Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map(Long, IpAddresses), IpAddresses, Boolean, String, List(Long), Map(String, String))

3.3 如果是高级zone,首先判断该zone是否启用了安全组,如果启用了安全组,调用函数

com.cloud.vm.UserVmManagerImpl.createAdvancedSecurityGroupVirtualMachine(DataCenter, ServiceOffering, VirtualMachineTemplate, List(Long), List(Long), Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map(Long, IpAddresses), IpAddresses, Boolean, String, List(Long), Map(String, String))

如果没有启用安全组,调用函数:

com.cloud.vm.UserVmManagerImpl.createAdvancedVirtualMachine(DataCenter, ServiceOffering, VirtualMachineTemplate, List(Long), Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map(Long, IpAddresses), IpAddresses, Boolean, String, List(Long), Map(String, String))

以在基本zone创建VM为例,进行源码阅读

4、函数

com.cloud.vm.UserVmManagerImpl.createBasicSecurityGroupVirtualMachine(DataCenter,ServiceOffering, VirtualMachineTemplate, List(Long), Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map(Long, IpAddresses), IpAddresses, Boolean, String, List(Long), Map(String, String))

4.1 根据zoneId 获取该zone内的默认网络,执行的SQL

 select *from networks where data_center_id=1 and account_id=1 and guestType=’Shared’ and traffic_type=’Guest’;

将查询到的默认网络保存到内存,后面使用.(需要将虚拟机加入到该网络,进行管理)

(4.2) 判断虚拟机模板是否为vmware类型,或者 hypervisor 是否为vmware,两张有一个为true,如果配置了安全组策略,则报错。(即目前不支持vmware 虚拟机配置安全组)

(4.3) 检查该zone是否支持安全组,查询数据表ntwk_service_map ,确定该网络是否支持安全组服务。如果存在,还有检查服务的提供者是否存在(在数据表ntwk_service_map 存放)。查询数据表configuration,其中的network.securitygroups.defaultadding 字段,设置为true表示可以将VM加入默认安全组。(这个时候会进行检查是否存在默认安全组,如果不存在,创建一个安全组,存入数据库)

(4.4) 查询该用户是否有安全组,如果有的话,将该安全组加入虚拟机安全组列表,如果该用户不存在安全组,为该用户创建默认安全组,并加入到虚拟机安全组列表

security_group 数据表中添加数据

insert into security_group (‘name’,’domain_id’,’account_id’,’description’) values (….)

Note:
1、CloudStack不支持vmware配置安全组,在高级zone内,只支持KVM主机配置安全组。
2、只能在guest网络中配置安全组

5、 函数:com.cloud.vm.UserVmManagerImpl.createVirtualMachine(DataCenter, ServiceOffering, VirtualMachineTemplate, String, String, Account, Long, Long, List(NetworkVO), List(Long), String, HTTPMethod, String, String, HypervisorType, Account, Map(Long, IpAddresses), IpAddresses, Boolean, String, List(Long), Map(String, String))

(5.1) 查询虚拟机模板详情,查询数据表 vm_template。查询数据表dedicated_resources,判断该zone是否进行了domain划分,查看用户在domain是否有权限进行操作。查询serviceoffering信息,如果设置了自定义serviceoffering参数,需要进行参数设置。

(5.2) 获取模板大小,以及diskoffering的磁盘大小,检查该用户的cpu,memory资源是否足够,查询卷是否足够,查询主存储是否有足够空间 (涉及到的数据表resource_limit)

(5.3) hypervisor 不是裸金属时,检查存储池,禁止使用系统模板创建系统虚拟机

(5.4) 配置网卡信息,设置默认网卡,数据库获取vm的id,检查新建的虚拟机主机名是否合法,如果没有设置主机名,系统会生成一个,生成虚拟机名称

(5.5) 执行存储vm操作,见步骤6

(5.6) 将VM加入security group 和affinitygroup

6、 com.cloud.vm.UserVmManagerImpl.commitUserVm(DataCenter, VirtualMachineTemplate, String, String, Account, Long, Long, String, HypervisorType, Account, Boolean, String, long, ServiceOfferingVO, boolean, String, LinkedHashMap(String, NicProfile), long, String, String, HypervisorType, Map(String, String))

(6.1)构造 com.cloud.vm.UserVmVO.UserVmVO(long, String, String, long, HypervisorType, long, boolean, boolean, long, long, long, String, String, Long),存放虚拟机信息

(6.2) 当主机为vmware,判断是否需要进行链接克隆。通过设置vmware.create.full.clone

(6.3) 设置 主机标签,如果是使用iso创建虚拟机进入函数:

org.apache.cloudstack.engine.orchestration.CloudOrchestrator.createVirtualMachineFromScratch(String, String, String, String, String, String, String, int, int, long, Long, List(String), List(String), Map(String, NicProfile), DeploymentPlan)

使用非iso创建虚拟机

org.apache.cloudstack.engine.orchestration.CloudOrchestrator.createVirtualMachine(String, String, String, String, String, String, int, int, long, Long, List(String), List(String), Map(String, NicProfile), DeploymentPlan)

(6.4) 将使用的资源存放到数据库

7、函数

org.apache.cloudstack.engine.orchestration.CloudOrchestrator.createVirtualMachineFromScratch(String, String, String, String, String, String, String, int, int, long, Long, List(String), List(String), Map(String, NicProfile), DeploymentPlan)

设置rootdisk和nic

8、函数

com.cloud.vm.VirtualMachineManagerImpl.allocate(String, VirtualMachineTemplate, ServiceOffering, Pair(? extends DiskOffering, Long), LinkedHashMap(? extends DiskOffering, Long), LinkedHashMap(? extends Network, List(? extends NicProfile)), DeploymentPlan, HypervisorType)

(8.1) 调用network manager 分配网络

根据networkid 查询数据表networks,获取guru_name,判断调用哪个network adapter。基本zone,没有安全组,使用的是DirectPodBasedNetworkGuru

调用函数com.cloud.network.guru.DirectPodBasedNetworkGuru.allocate(Network, NicProfile, VirtualMachineProfile) ,获取网卡的IP、网关,mac地址等信息

将网卡数据存入数据库

(8.2) 调用volume manager 分配卷,分为root盘和data盘,将数据存入数据库

9、执行函数org.apache.cloudstack.api.command.user.vm.DeployVMCmd.execute()

判断是否启动虚拟机,如果是,执行第10步,如果不是,只需要从数据库获取虚拟机信息

10、com.cloud.vm.UserVmManagerImpl.startVirtualMachine(DeployVMCmd)

(10.1) 只有admin用户可以在创建VM的时候指定创建VM,构造部署策略(选择数据中心,提供点,群集,主机,物理网络,资源池)

(10.2) 数据库查询虚拟机的相关信息,调用

com.cloud.vm.VirtualMachineManagerImpl.advanceStart(String,Map(Param,Object),DeploymentPlan, DeploymentPlanner)

11、函数

com.cloud.vm.VirtualMachineManagerImpl.orchestrateStart(String,Map(Param,Object),DeploymentPlan,DeploymentPlanner)

(11.1) 确认部署计划中,虚拟机卷所在的主存储对应的群集,与选择的群集相同,根据VM配置选择部署的目的(数据中心,提供点,群集,主机,存储)

(11.2) 如果用户没有设置VM的cpu,memory 超分配系数,则该VM的超分配系数采用群集的超分配系数

(11.3) 准备网络与存储

12函数

com.cloud.agent.manager.AgentManagerImpl.send(Long, Commands)

将创建虚拟机的信息传到 KVM主机

13、

com.cloud.agent.Agent.processRequest(Request, Link)

cloudstack-agent 收到请求,根据agent.properties 中的resource的设置,确定将请求转发到哪种hypervisor进行处理,如果是KVM,则转到14步

14、com.cloud.hypervisor.kvm.resource.LibvirtComputingResource.executeRequest(Command)

根据参数类型确定具体执行哪个操作,构造libvirt需要的参数创建虚拟机


http://chatgpt.dhexx.cn/article/7QKt89Hs.shtml

相关文章

真实环境部署CloudStack问题和一些特别需求设置

经过多次测试。。。建议安装4.13.0版本.系统模板选择4.11.3。。。 http://download.cloudstack.org/centos/7/4.12/ http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.2-kvm.qcow2.bz2 一、 sshd 端口是 5555 而不是 22 可能是22 端口开放不安全。。。 …

CloudStack的创建

安装虚拟机 创建节点 准备两台VMware Workstations虚拟机进行基本设置,一台作为manager管理节点,一台作为agent计算节点。网络适配器选择NAT模式。 配置: manager节点需有2G内存agent节点需有4G内存(虚拟机是运行于计算节点上的&a…

cloudstack 术语

CloudStack术语 关于地区 为了提高云的可靠性,您可以选择将资源分组到多个地理区域。区域是CloudStack部署中最大的可用组织单位。区域由多个可用区域组成,其中每个区域大致相当于数据中心。每个区域由其自己的管理服务器集群控制,在其中一…

cloudstack java api_python访问cloudstack的api接口

1.CloudStack API 如同 AWS API 一样,CloudStack API 也是基于 Web Service,可以使用任何一种支持 HTTP 调用的语言(例如 Java,python,)编写代码。 调用代码(caller)首先需要在管理服务器进行认证。目前 CloudStack 采用两种认证方式&#xf…

CloudStack初级部署与实例创建

1 CloudStack 1.1 查看并修改虚拟机网络 打开虚拟机VMware Workstation,选择菜单栏“编辑”->虚拟网络编辑器,查看VMnet8的子网地址。 每台机器VMnet8被分配的子网地址都不相同,但在每个网段中,本机都默认为1,网…

搭建CloudStack环境(Windows版)

应项目需求,需要使用CloudStack搭建云平台,结合官方文档和网上资料,网上资料参差不齐,最后还是自己总结一下安装CloudStack的详细教程。 目录 Step 1) 安装Cygwin Step 2) 安装JDK Step 3) 安装Python 2.7 Step 4) 安装Tomca…

CloudStack高级网络设置

基本设置 参考 https://blog.csdn.net/dandanfengyun/article/details/105726448 测试使用高级网络设置。和基本网络设置基本一样直到添加资源域时状态。。。 开始添加 资源域 添加资源以 选择高级网络设置 配置区域 和基本网络设置类似 注 来宾CIDR 没有必要去修改。。。如…

cloudstack java api_CloudStack API编程指引

前言 本文阐述为CloudStack编写新API或者更新已存在API时应遵循的约定和编程指引。 参考文档 (暂略) 介绍 当你需要为CS添加新的API时,需要创建一个Request类和Response类(或者在扩展CS API功能时它的API Responese已经定义的情况下重用已经存在的API Response类)。…

CloudStack 4.17 安装部署

市面上cloudstack大多部署教程都比较旧,这里写一篇最新版本的部署安装教程(4.17),为了方便解释相关配置以及进行相关配置,本篇会把管理节点和计算节点分开写 1.管理节点部署(admin) 管理节点ip&…

Cloudstack

1、cloudstack介绍 一个开源具有高可用性及扩展性的云计算平台,Cloudstack是一个开源的云操作系统; cloudstack支持管理大部分主流的hypervisors,如:VMware,KVM,Citrix XenServer,Xen Cloud Pla…

【私有云架构】Cloudstack 与 OpenStack:哪个更适合您?

创建云管理平台是因为云计算几乎已成为大多数日常业务使用的必需品。CloudStack 与 OpenStack 之争并不是很重要,而是在控制大量数据的高级云管理平台之间进行选择。 对于许多组织而言,重要的一步是实施逻辑云管理,该管理拥有许多用于控制各种…

CloudStack那些事儿1 : 初识CloudStack

CloudStack是什么呢?百科上对CloudStack的定义如下: CloudStack是一个开源的具有高可用性及扩展性的云计算平台,同时是一个开源云计算解决方案。可以加速高伸缩性的公共和私有云(IaaS)的部署、管理、配置。使用CloudSt…

OpenStack与CloudStack

目录 一、云计算 二、IaaS 三、OpenStack与CloudStack (一)概述 (二)项目历史与运营团队 (三)架构 (四)计算 (五)网络 (六)存…

CloudStack(二)基础网络模式安装部署

概述: 在CloudStack(一)简介及相关理论介绍里面简单的介绍了下cloudstack的相关概念好让我们安装部署的时候好理解一点,在cloudstack的区域里面有两种网络模式, 基础模式 基础网络模式只提供了简单的网络模型,管理网络、来宾网络(只支持1个来宾网络)、存储网络、V-Route(只提供…

CloudStack 云计算平台框架

前言 CloudStack 和OpenStack 一样都是IaaS层 开源框架,可以管理XenServer、ESXI、KVM、OVM等主流虚拟机,相对OpenStack比较简单、稳定; 二、Cloud Stack架构 Zone:相当于现实中的1个数据中心,它是CloudStack中最大的一…

【大数据实验1】cloudstack安装部署(小白式傻瓜教学)

cloudstack安装部署 0 说明1 Prerequisites 先决条件2 Environment 环境2.0 先看看有没有KVM2.1 Operating System 操作系统2.2 Configuring the network 配置网络2.3 Hostname2.4 SELinux2.5 NTP2.6 Configuring the CloudStack Package Repository 配置CloudStack软件包存储库…

Java线程池

目录 一、什么是线程池 二、线程池有哪些好处? ①降低资源的消耗 ②提高响应速度 ③提高线程的可管理能力 三、线程池如何使用 ①创建线程池​编辑 工厂模式: 工厂模式代码实现: ②往线程池当中添加任务 四、Java当中有哪些线程池 ​编辑 ①Executors.newFixedThreadPool …

线程池(一)线程池的基本使用

一、线程池简介 线程池的概念 线程池就是首先创建一些线相衬,它们的集合称为线程池,使用线程池可以很好的提高性能,线程池在系统启动时既创建大量空闲的线程,程序将一个任务传给线程池。线程池就会启动一条线程来执行这个任务&…

线程池介绍及创建线程池的4种方式

1. 什么是线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成…

线程池的使用

1.线程池使用场景 java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这…