版本/状态 | 作者 | 参与者 | 起止日期 | 说明 |
---|---|---|---|---|
1.0 | EldonZhao | 2016.12.28至2016.12.31 | 初稿 |
一、需求背景
1.1 需求目的
弹性伸缩组目前支持用户使用镜像(ID:a)创建伸缩组,伸缩组下的虚拟机都是该伸缩组使用镜像a创建的。但是,用户可能在开通伸缩组业务之前就订购过云主机,使用弹性伸缩功能后,需要将前期订购的云主机加入到伸缩组中去。
1.2 参考文档
1.3 术语解释
二、功能设计
支持用户创建云主机加入伸缩组总体设计思路:
- 云主机需要抽象成伸缩组中的node?
- node加入、移出伸缩组复用以前功能?
- 退订伸缩组时,是否需要退订该主机?
- 伸缩时的优先级?
- 需要增加字段标识node类型?
- metadata修改,如果用户创建的云主机有metadata属性如何处理?
2.1 前台模块设计:
前台设计参考阿里云弹性伸缩ECS示例列表页面:
2.2 后台模块设计:
a.profile设计:
创建一个特殊的配置模板,支持引用存在的云主机示例,创建profile;
type: os.nova.server
version: 1.0
properties:
physical_id: null
b.node设计:
- 创建node:
创建node时,使用特殊profile,支持传入参数云主机id,使用特殊配置创建node,引用用户创建好的云主机。- 1.使用特殊profile创建node;
- 2.node.py do_create中,判断physical_id是否为null,如果不为null,直接调用Profile创建server;
- 3.profile.py do_create中,判断physical_id是否为null,如果不为null,刷新虚拟机的metadata;
- 删除node:
由于云主机不是伸缩组创建的,建议删除node时不删除该云主机,但是需要注意刷新云主机metadata。
c.cluster设计:
- node加入cluster:
node加入cluster逻辑跟之前一样,此时注意用户自己的metadata会不会有影响。 - node移出cluster:
node移出cluster逻辑跟之前一样。 - scale-in的选择:
建议scale-in优先选择非特殊profile创建的云主机;如果只剩下特殊profile创建的云主机,则在这批云主机中再按伸缩组配置的policy做scale-in。
2.3 接口设计:
a.创建特殊profile:
复用老接口,模板文件变化,代码逻辑适配。
b.创建node:
POST /v1/nodes
{
"node": {
"cluster_id": null,
"metadata": {},
"name": "node_eldon",
"profile_id": "special_profile",
"role": "master",
"physical_id": "0df0931b-e251-4f2e-8719-4ebfda3627ba",
}
}
如上述示例,增加physical_id字段;结合physical_id和profile查询相关实例是否存在:存在的话创建该node;不存在则报错;
b.从伸缩组删除node:
复用老接口,注意删除node时的逻辑处理。
2.4 数据结构设计:
表名:node
Field | Type | Null | Key | Default | Extra | |
---|---|---|---|---|---|---|
id | varchar(36) | NO | PRI | NULL | ||
name | varchar(255) | YES | NULL | |||
physical_id | varchar(36) | YES | NULL | |||
cluster_id | varchar(36) | YES | NULL | |||
profile_id | varchar(36) | NO | MUL | NULL | ||
user | varchar(32) | YES | NULL | |||
project | varchar(32) | YES | NULL | |||
domain | varchar(32) | YES | NULL | |||
index | int(11) | YES | NULL | |||
role | varchar(64) | YES | NULL | |||
init_at | datetime | YES | NULL | |||
created_at | datetime | YES | NULL | |||
updated_at | datetime | YES | NULL | |||
status | varchar(255) | YES | NULL | |||
status_reason | text | YES | NULL | |||
meta_data | longtext | YES | NULL | |||
data | longtext | YES | NULL | |||
user_node | bool | NO | False |
增加user_node字段,表示该node是否为用户自己的node。