虚机服务
创建BEC虚机服务
如下代码可以新建一个BEC虚机服务:
1 func createBecVmService(client *bec.Client) {
2 // 系统盘信息
3 systemVolume := &api.SystemVolumeConfig{
4 // 系统盘类型
5 VolumeType: "SATA",
6 // 系统盘大小(单位G)
7 SizeInGB: 40,
8 // 系统盘名称
9 Name: "system-disk-name",
10 }
11
12 // 数据盘列表
13 dataVolumeList := []api.VolumeConfig{}
14 volumeConfig := api.VolumeConfig{
15 // 数据盘类型
16 VolumeType: "SATA",
17 // 数据盘大小(单位G)
18 SizeInGB: 40,
19 // 数据盘名称
20 Name: "volume-name",
21 }
22 dataVolumeList = append(dataVolumeList, volumeConfig)
23
24 // 节点信息
25 deploymentInstance := api.DeploymentInstance{
26 // 节点ID,由“国家码-城市-运营商”的小写字母组成字符串。例如 cn-hangzhou-cm,其中国家码标准为ISO 3166-2,城市为拼音,运营商为中国移动cm/中国电信ct/中国联通un/三线ix/bgp。如果传regionId,则可以不传region、serviceProvider、city。, 必需
27 RegionId: "cn-baoding1-ix",
28 // 指定网络类型,枚举值有classic(经典网络)或vpc(VPC网络)。详细参考 使用VPC网络注意事项, 必需
29 NetworkType: "vpc",
30 // 指定私有网络ID。只有网络类型为vpc时生效;如果networkType选用vpc网络, 若不指定vpcId时则使用默认私有网络和默认子网
31 VpcId: "vpc-06shaxptznid",
32 // 指定私有网络的子网ID。只有网络类型为vpc时生效;如果networkType选用vpc网络, 若不指定subnetId时则会使用默认VPC的默认子网
33 SubnetId: "sbn-ahbknbnjipkw",
34 // 副本数,最小为1, 必需
35 Replicas: 1,
36 }
37 deployInstances := []api.DeploymentInstance{deploymentInstance}
38
39 // DNS配置
40 dnsConfig := &api.DnsConfig{
41 // DNS类型
42 DnsType: "DEFAULT",
43 // DNS地址,多个DNS地址以逗号分隔
44 DnsAddress: "8.8.8.8",
45 }
46
47 // 密码配置
48 keyConfig := &api.KeyConfig{
49 // 类型,bccKeyPair为选择的密钥对,password为选择的密码
50 Type: "password",
51 // 虚机密码限制长度为8~32位字符,英文、数字和符号必须同时存在,符号仅限!@#$%^+*()
52 AdminPass: "735560bB!",
53 }
54
55 // 网卡配置
56 networksList := []api.Networks{
57 {
58 // 网卡类型
59 NetType: "INTERNAL_IP",
60 // 网卡名称
61 NetName: "netName1",
62 },
63 //{
64 // NetType: "PUBLIC_IP",
65 // NetName: "netName2",
66 //},
67 }
68 networkConfig := api.NetworkConfig{
69 // 节点类型(SINGLE、TRIPLE,分别表示单线节点和三线节点)
70 NodeType: "TRIPLE",
71 NetworksList: &networksList,
72 }
73 networkConfigList := []api.NetworkConfig{networkConfig}
74
75 // 安全组ID
76 securityGroupIds := []string{"securityGroupId"}
77
78 // 标签
79 tags := []api.Tag{
80 {
81 // 标签键
82 TagKey: "tagKey",
83 // 标签值
84 TagValue: "tagValue",
85 },
86 }
87
88 // 构造请求参数
89 request := &api.CreateVmServiceArgs{
90 // 虚机服务名称(不传则使用随机名称), 非必需
91 ServiceName: "wj-serviceName",
92 // 虚机实例名称(不传则使用随机名称), 非必需
93 VmName: "vmName",
94 // 付费方式。postpay:后付费;prepay:预付费。缺省值为postpay, 非必需
95 PaymentMethod: "postpay",
96 // 是否开通公网。true:开通;false:不开通。缺省为false, 非必需
97 NeedPublicIp: true,
98 // 预付费套餐购买时长,非必需
99 // request.Reservation = &api.Reservation{Length: 1, TimeUnit: "month"}
100
101 // 自动续费周期,系统将于资源到期前7/3/1/0天自动进行扣款续费,自动扣费时余额不足则顺延至下一次定时扣费,扣费时长与自动续费周期相等,不传则不自动续费,非必需
102 // request.AutoRenew = &api.AutoRenew{Length: 6, TimeUnit: "month"}
103
104 // 公网带宽大小(-1时为最大值),单位Mbps,非必需
105 Bandwidth: 100,
106 // 部署区域, 非必需
107 DeployInstances: &deployInstances,
108 // DNS配置, 非必需
109 DnsConfig: dnsConfig,
110 // CPU大小,必须大于1;用虚机模板可不填;随机分配策略必填, 非必需
111 Cpu: 1,
112 // memory大小,必须大于1;用虚机模板可不填;随机分配策略必填, 非必需
113 Memory: 1,
114 // 镜像ID(配合imageType使用; 用虚机模板可不填, 非必需
115 ImageId: "m-iIMvx5zK",
116 // 镜像类型,非必需
117 ImageType: "bec",
118 // 是否开通IPv6公网,非必需
119 NeedIpv6PublicIp: false,
120 // 系统盘配置, 非必需
121 SystemVolume: systemVolume,
122 // 数据盘配置, 非必需
123 DataVolumeList: &dataVolumeList,
124 // 密码或密钥配置, 非必需
125 KeyConfig: keyConfig,
126 // 是否需要内网, 非必需
127 DisableIntranet: false,
128 // 是否需要网络初始化, 非必需
129 DisableCloudInit: false,
130 // 网卡命名配置, 非必需
131 NetworkConfigList: &networkConfigList,
132 // 安全组ID, 非必需
133 SecurityGroupIds: securityGroupIds,
134 // hostname设置, 非必需
135 Hostname: "hostname",
136 // 使用虚机模板ID创建虚机,非必需
137 // TemplateId: "tmpl-xxxxxx",
138
139 // 部署集ID列表,目前只支持数量为1,非必需
140 DeploysetIdList: []string{"dset-axoqerx6"},
141 // 自定义注入的数据,非必需
142 UserData: "dXNlcl9pbmplY3RlZF9kYXRhOiBhR1ZzYkc4PQ==",
143
144 // CUDA 版本。linux或windows平台,三位版本号;只适用于创建异构计算GPU实例,开启自定义驱动安装时必填;注意:CUDA、Driver、cuDNN需要满足依赖关系,非必需
145 // CudaVersion: "cudaVersion",
146 // GPU驱动 版本。linux或windows平台;只适用于创建异构计算GPU实例,开启自定义驱动安装时必填;注意:CUDA、Driver、cuDNN需要满足依赖关系,非必需
147 // DriverVersion: "driverVersion",
148 // cuDNN 版本。linux或windows平台,三位版本号;只适用于创建异构计算GPU实例,开启自定义驱动安装时必填;注意:CUDA、Driver、cuDNN需要满足依赖关系,非必需
149 // CudnnVersion: "cudnnVersion",
150 // 标签信息,非必需
151 Tags: &tags,
152 }
153
154 response, err := client.CreateVmService(request)
155 if err != nil {
156 fmt.Printf("createBecVmService error: %v\n", err)
157 return
158 }
159 fmt.Printf("createBecVmService response: %+v\n", response)
160}
创建独占盘注意事项
独占盘仅支持数据盘,需要开通独占盘相关白名单才能创建,有相关需要请联系BEC商务。独占盘有SSD和HDD独占盘两种,volumeType为HDD_PASSTHROUGH和SSD_PASSTHROUGH。volumeType和passthroughCode为必填,相关参数可通过获取独占盘接口获取。
密码和密钥配置注意事项
目前虚机登录支持密码和密钥两种方式,密码和密钥需要二选一。
密码长度范围为8~32位字符,由英文、数字和符号组成,符号仅限!@#$%^+*()。
密钥目前仅支持BCC密钥,要使用密钥开启必须先在BCC的华北-北京区域创建密钥对。以下是使用密钥对的虚机服务,keyConfig的type填bccKeyPair,bccKeyPairIdList是bcc密钥对的keyId,可以通过BCC查询密钥对列表获取keyId。
1 keyConfig := &api.KeyConfig{
2 Type: "bccKeyPair",
3 BccKeyPairIdList: []string{"k-1MkI9Laa"},
4 }
网卡命名注意事项
networkConfigList用于设定网卡名称、VPC内外网卡的顺序。
仅内网:
1 networkConfig := api.NetworkConfig{
2 NodeType: "SINGLE",
3 NetworksList: &[]api.Networks{
4 {
5 NetType: "INTERNAL_IP",
6 NetName: "name0",
7 },
8 },
9 }
内网+外网:
1 networkConfig := api.NetworkConfig{
2 NodeType: "SINGLE",
3 NetworksList: &[]api.Networks{
4 {
5 NetType: "INTERNAL_IP",
6 NetName: "name0",
7 },
8 {
9 NetType: "PUBLIC_IP",
10 NetName: "name1",
11 },
12 },
13 }
单线节点VPC网络多网卡,示例(内网+外网+内网+外网):单线节点的VPC网络,可以通过networkConfigList指定多网卡名和内外网的网卡顺序。
1 networkConfig := api.NetworkConfig{
2 NodeType: "SINGLE",
3 NetworksList: &[]api.Networks{
4 {
5 NetType: "INTERNAL_IP",
6 NetName: "name0",
7 },
8 {
9 NetType: "PUBLIC_IP",
10 NetName: "name1",
11 },
12 {
13 NetType: "INTERNAL_IP",
14 NetName: "name2",
15 },
16 {
17 NetType: "PUBLIC_IP",
18 NetName: "name3",
19 },
20 },
21 }
三线节点VPC网络,公网IP指定运营商:可以通过下面二选一参数来指定: 通过参数subServiceProviders直接指定,或者通过networkConfigList指定运营商并设置网卡名和网卡顺序。例如只支持运营商ct的示例:
1 deploymentInstance := api.DeploymentInstance{
2 RegionId: "cn-baoding-ix",
3 NetworkType: "vpc",
4 SubServiceProviders: []string{"ct"},
5 }
1 networkConfig := api.NetworkConfig{
2 NodeType: "TRIPLE",
3 NetworksList: &[]api.Networks{
4 {
5 NetType: "INTERNAL_IP",
6 NetName: "name0",
7 },
8 {
9 NetType: "TRIPLE_CT",
10 NetName: "name1",
11 },
12 },
13 }
使用VPC网络注意事项
VPC网络为内网VPC,分节点创建,不能跨节点指定VPC。需要显式指定网络类型networkType为vpc,经典网络为classic
vpc网络可以指定使用自定义已创建好的vpcId和subnetId; 如果没有指定vpcId和subnetId,系统会为每个节点创建并使用默认的私有网络和子网;默认私有网络CIDR为172.16.0.0/20,默认子网CIDR为172.16.0.0/24
指定安全组(securityGroupIds)只适用于vpc网络的实例。如果选用了vpc网络但是没有指定安全组ID,BEC会创建并使用一个默认的安全组,默认安全组规则如下:
方向 | 协议 | 端口 | 类型 | 目的地址 |
---|---|---|---|---|
出站 | 全部协议 | 1-65535 | IPv4 | 目的IP: 0.0.0.0/0 |
使用模板
若使用模板,需要先在控制台创建虚机模板,获得templateId作为输入参数。无需再传入cpu、memory、disk、imageId/imageType、dnsConfig等参数。例如:
1func createBecVmServiceUseTemplate(client *bec.Client) {
2 deploymentInstance := api.DeploymentInstance{
3 RegionId: "cn-baoding1-ix",
4 Replicas: 1,
5 NetworkType: "vpc",
6 }
7
8 keyConfig := &api.KeyConfig{
9 Type: "password",
10 AdminPass: "73608b341B!",
11 }
12
13 request := &api.CreateVmServiceArgs{
14 DeployInstances: &[]api.DeploymentInstance{deploymentInstance},
15 ServiceName: "wj-service1",
16 VmName: "vmname",
17 TemplateId: "tmpl-f4mxwman",
18 KeyConfig: keyConfig,
19 }
20
21 response, err := client.CreateVmService(request)
22 if err != nil {
23 fmt.Printf("createBecVmServiceUseTemplate error: %v\n", err)
24 return
25 }
26 fmt.Printf("createBecVmServiceUseTemplate response: %+v\n", response)
27}
获取BEC虚机服务列表
使用以下代码可以获取BEC虚机服务列表:
1func getBecVmServices(client *bec.Client) {
2 request := &api.ListVmServiceArgs{
3 KeywordType: "serviceName", // 查询实例的关键字类型,取值为serviceId、serviceName,分别对应服务ID、服务名字。默认为serviceId,非必需
4 Keyword: "word", // 查询实例的关键字,非必需
5 PageNo: 1, // 页数,缺省值为1,非必需
6 PageSize: 10, // 每页个数,取值范围为1~1000,缺省值为1000,非必需
7 Order: "ASC", // 排序,取值为DESC、ASC,分别表示为降序、升序。缺省为DESC,非必需
8 OrderBy: "createTime", // 排序字段,缺省为createTime,非必需
9 }
10
11 response, err := client.GetVmServiceList(request)
12 if err != nil {
13 fmt.Printf("getBecVmServices error: %v\n", err)
14 return
15 }
16 fmt.Printf("getBecVmServices response: %+v\n", response)
17}
更新BEC虚机服务
使用以下代码可以更新BEC虚机服务:
更新虚机服务,包括更新密码、副本数和服务相关参数,详情请参考API参考文档。
扩容虚机服务
1func updateVmServiceReplicas(client *bec.Client) {
2 request := &api.UpdateVmServiceArgs{
3 UpdateBecVmForm: api.UpdateBecVmForm{
4 // 更新类型,取值为 password、replicas、resource、serviceName、securityGroup,分别表示密码、副本数量、虚机资源、服务名字、安全组。其中安全组只适用于VPC网络的虚机。 必需
5 Type: "replicas",
6 KeyConfig: &api.KeyConfig{
7 Type: "password",
8 AdminPass: "73608b341B!",
9 },
10 },
11 DeployInstances: &[]api.DeploymentInstance{
12 {
13 RegionId: "cn-baoding1-ix",
14 Replicas: 2,
15 },
16 },
17 ReplicaTemplate: api.ReplicaTemplate{
18 Type: "template",
19 TemplateId: "tmpl-f4mxwman",
20 },
21 }
22 // 虚机服务ID, 必需
23 response, err := client.UpdateVmService("s-z9wiftup", request)
24 if err != nil {
25 fmt.Printf("updateVmServiceReplicas error: %v\n", err)
26 return
27 }
28 fmt.Printf("updateVmServiceReplicas response: %+v\n", response)
29}
更新虚机服务配置
1func updateVmServiceResource(client *bec.Client) {
2 request := &api.UpdateVmServiceArgs{
3 UpdateBecVmForm: api.UpdateBecVmForm{
4 // 更新类型,取值为 password、replicas、resource、serviceName、securityGroup,分别表示密码、副本数量、虚机资源、服务名字、安全组。其中安全组只适用于VPC网络的虚机。 必需
5 Type: "resource",
6 Cpu: 2,
7 Memory: 4,
8 },
9 }
10 // 虚机服务ID, 必需
11 response, err := client.UpdateVmService("s-z9wiftup", request)
12 if err != nil {
13 fmt.Printf("updateVmServiceResource error: %v\n", err)
14 return
15 }
16 fmt.Printf("updateVmServiceResource response: %+v\n", response)
17}
更新虚机服务内所有虚机实例的密码
目前虚机登录支持密码和密钥两种方式,密码和密钥需要二选一。
密码限制长度为8~32位字符,包括英文、数字和符号,符号仅限!@#$%^+*()。
1func updateVmServicePassword(client *bec.Client) {
2 request := &api.UpdateVmServiceArgs{
3 UpdateBecVmForm: api.UpdateBecVmForm{
4 // 更新类型,取值为 password、replicas、resource、serviceName、securityGroup,分别表示密码、副本数量、虚机资源、服务名字、安全组。其中安全组只适用于VPC网络的虚机。 必需
5 Type: "password",
6 KeyConfig: &api.KeyConfig{
7 Type: "password",
8 AdminPass: "73608b341B!",
9 },
10 },
11 }
12 // 虚机服务ID, 必需
13 response, err := client.UpdateVmService("s-z9wiftup", request)
14 if err != nil {
15 fmt.Printf("updateVmServicePassword error: %v\n", err)
16 return
17 }
18 fmt.Printf("updateVmServicePassword response: %+v\n", response)
19}
更新虚机服务内所有虚机实例的密钥
密钥仅支持BCC密钥,在使用前必须先在BCC的华北-北京区域创建密钥对。keyId可以通过BCC查询密钥对列表获得。
1 keyConfig := &api.KeyConfig{
2 Type: "bccKeyPair",
3 BccKeyPairIdList: []string{"k-UDUCAe4n"},
4 }
更新虚机服务名称
1func updateVmServiceName(client *bec.Client) {
2 request := &api.UpdateVmServiceArgs{
3 UpdateBecVmForm: api.UpdateBecVmForm{
4 // 更新类型,取值为 password、replicas、resource、serviceName、securityGroup,分别表示密码、副本数量、虚机资源、服务名字、安全组。其中安全组只适用于VPC网络的虚机。 必需
5 Type: "serviceName",
6 },
7 ServiceName: "wj-new-name",
8 }
9
10 // 虚机服务ID, 必需
11 response, err := client.UpdateVmService("s-z9wiftup", request)
12 if err != nil {
13 fmt.Printf("updateVmServiceName error: %v\n", err)
14 return
15 }
16 fmt.Printf("updateVmServiceName response: %+v\n", response)
17}
扩容实例使用VPC网络注意事项
变配:目前不支持经典网络虚机与VPC网络虚机的互相变配
注意VPC网络分节点创建,不能跨节点指定VPC。 扩容VPC网络的虚机,请求DeploymenetInstance的网络类型networkType为vpc
扩容节点如果选择vpc网络,可以指定使用自定义已创建好的vpcId和subnetId; 如果没有指定vpcId和subnetId,系统会为每个节点创建并使用默认的私有网络和子网;默认私有网络CIDR为172.16.0.0/20,默认子网CIDR为172.16.0.0/24
1 deploymentInstance := api.DeploymentInstance{
2 RegionId: "cn-huhehaote-ix",
3 Replicas: 3,
4 NetworkType: "vpc",
5 VpcId: "vpc-fhsolhqaggsd",
6 SubnetId: "sbn-isieglgvqp4z",
7 }
指定安全组(securityGroupIds)只适用于vpc网络的实例。如果选用了vpc网络,但是没有指定安全组ID,BEC会创建并使用一个默认的安全组,默认安全组规则如下:
方向 | 协议 | 端口 | 类型 | 目的地址 |
---|---|---|---|---|
出站 | 全部协议 | 1-65535 | IPv4 | 目的IP: 0.0.0.0/0 |
获取BEC虚机服务详情
使用以下代码获取BEC虚机服务详情:
1func getBecVmService(client *bec.Client) {
2 response, err := client.GetVmServiceDetail("s-z9wiftup") // 服务Id
3 if err != nil {
4 fmt.Printf("getBecVmService error: %v\n", err)
5 return
6 }
7 fmt.Printf("getBecVmService response: %+v\n", response)
8}
停止、启动BEC虚机服务
使用以下代码可以停止、启动BEC虚机服务:
1func becVmServiceAction(client *bec.Client) {
2 response, err := client.VmServiceAction("s-z9wiftup", api.VmServiceActionStop)
3 if err != nil {
4 fmt.Printf("becVmServiceAction error: %v\n", err)
5 return
6 }
7 fmt.Printf("becVmServiceAction response: %+v\n", response)
8}
删除BEC虚机服务
使用以下代码可以删除BEC虚机服务:
1func delBecVmService(client *bec.Client) {
2 response, err := client.DeleteVmService("s-z9wiftup") // serviceId
3 if err != nil {
4 fmt.Printf("delBecVmService error: %v\n", err)
5 return
6 }
7 fmt.Printf("delBecVmService response: %+v\n", response)
8}
获取BEC服务监控
使用以下代码可以获取BEC服务监控:
1func getBecVmServiceMetrics(client *bec.Client) {
2 // 虚机服务id
3 serviceId := "s-z9wiftup"
4 // 指定运营商ServiceProvider,默认不填为全部(外网)
5 serviceProviderStr := "CHINA_UNICOM"
6 // 起始时间,Unix时间戳,单位秒
7 start := 1754323200
8 // 终止时间,Unix时间戳,单位秒
9 end := 1754409600
10 stepInMin := 5
11 // 监控类型,CPU、MEMORY、BANDWIDTH_RECEIVE、BANDWIDTH_TRANSMIT分别表示CPU、内存、入网带宽、出网带宽
12 metricsType := api.MetricsTypeBandwidthReceive
13 response, err := client.GetVmServiceMetrics(serviceId, serviceProviderStr, start, end, stepInMin, metricsType)
14 if err != nil {
15 fmt.Printf("getBecVmServiceMetrics error: %v\n", err)
16 return
17 }
18 fmt.Printf("getBecVmServiceMetrics response: %+v\n", response)
19}