一、原理
克隆的原理就是拿原虚拟机的属性创建个一模一样的vm,克隆的本质是创建。
二、流程
console---->horizon---->dozer----->nova
- 浏览器发出clone(POST /api/dozer/executions/)请求到horizon
- horizon发出请求(http://st2api:9101/v1/executions)到dozer
- dozer调用nova、cinder封装具体的创建参数,然后调用nova进行新虚拟机的创建。
3.1 通过novaclient获取原vm的具体属性
3.2 如果原vm是镜像启动的调用nova的接口进行快照的创建并等待创建结束(实质nova image-create)
3.3 发送’compute.instance.clone.start’的notifications
3.4 串行克隆原虚拟机的所有volume并阻塞等待新卷创建完成
3.5 发送创建vm的请求到nova进行新vm的创建
3.6 发送’compute.instance.clone.end’的notifications
三、问题和分析思路
主要有clone失败和clone慢两大主要问题
- 克隆失败
可以根据clone流程从入口开始分析看到哪一步失败(因为我们克隆几乎没有详细的堆栈返回个浏览器)dozer相关的日志打印及到达流程如下:
dozer相关日志输出 | 代表意义以及执行阶段 |
---|---|
“start clone instance…” | 代表请求已经进入dozer开始处理clone |
“boot from volume %s” | 打印是否是bfv |
“start to take vm snapshot” | 代表是bfi且进入虚拟机快照创建并等待阶段 |
“finish to take vm snapshot: %s” | 代表是bfi且成功创建快照 |
“The vm failed to take snapshots, reason is %s.” | 代表是bfi且创建快照失败 |
“waiting for volume: %s available” | 代表已经进入clone volume的阶段并在等待克隆完成 |
“Failed to clone vm, reason is %s.” | 代表从克隆volume到新虚拟机的创建过程有问题 |
dozer基本只涉及快照的创建,卷的clone,如果没有问题的话,剩下的只需要分析nova的处理流程,和创建vm的分析流程一致。
- 克隆慢
可以先根据dozer的打印去确定启动方式,bfi通常多了一个快照的创建和等待过程会耗时,然后分析下创卷的耗时,
"waiting for volume: %s available"这个打印5s一次,乘以打印次数能大概得出创卷的耗时,然后查看nova的日志
分析创建的耗时,所有耗时累加再加上各个服务交互的耗时就是克隆整体的耗时时间。