如何使用阿里云 ECS SDK 合理快速地創(chuàng)建并管理搶占式實例

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于如何使用阿里云 ecs sdk 合理快速地創(chuàng)建并管理搶占式實例,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

管理搶占式實例

準(zhǔn)備工作

在執(zhí)行操作之前,您需要:

了解能滿足您業(yè)務(wù)要求的實例規(guī)格和地域。

熟悉了解阿里云 ECS SDK 的基礎(chǔ)知識和調(diào)用方法。詳細(xì)信息,請參考 SDK 使用說明。

注意:

搶占式實例代碼需要依賴的 ECS SDK 版本 4.2.0 以上。以 Java POM 依賴為例,修改引入 pom 依賴:

<dependency> ??<groupid>com.aliyun</groupid> ??<artifactid>aliyun-java-sdk-core</artifactid> ??<version>3.2.8</version></dependency><dependency> ??<groupid>com.aliyun</groupid> ??<artifactid>aliyun-java-sdk-ecs</artifactid> ??<version>4.2.0</version></dependency>

查詢地域及可用的實例規(guī)格

使用 OpenAPI DescribeZones 查詢可以創(chuàng)建搶占式實例的地域以及可用的實例規(guī)格。示例代碼如下所示。

OpenApiCaller.java public?class?OpenApiCaller?{ ??IClientProfile?profile; ??IAcsClient?client; ??public?OpenApiCaller()?{ ??????profile?=?DefaultProfile.getProfile("cn-hangzhou",?AKSUtil.accessKeyId,?AKSUtil.accessKeySecret); ??????client?=?new?DefaultAcsClient(profile); ??} ??public??<t>?T?doAction(AcsRequest<t>?var1)?{ ??????try?{ ??????????return??client.getAcsResponse(var1); ??????}?catch?(Throwable?e)?{ ??????????e.printStackTrace(); ??????????return?null; ??????} ??} } DescribeZonesSample.java public?class?DescribeZonesSample?{ ??public?static?void?main(String[]?args)?{ ??????OpenApiCaller?caller?=?new?OpenApiCaller(); ??????DescribeZonesRequest?request?=?new?DescribeZonesRequest(); ??????request.setRegionId("cn-zhangjiakou");//可以通過?DescribeRegionsRequest?獲取每個地域的?RegionId ??????request.setSpotStrategy("SpotWithPriceLimit");//對于查詢是否可購買搶占式實例此項必填 ??????request.setInstanceChargeType("PostPaid");//后付費模式,搶占式實例必須是后付費模式 ??????DescribeZonesResponse?response?=?caller.doAction(request); ??????System.out.println(JSON.toJSONString(response)); ??} }</t></t>

以下為輸出結(jié)果,可以查看每個地域各個地域可供選擇的實例規(guī)格、磁盤類型、網(wǎng)絡(luò)類型等信息。

{ ??"requestId":?"388D6321-E587-470C-8CFA-8985E2963DAE", ??"zones":?[ ??????{ ??????????"localName":?"華北?3?可用區(qū)?A", ??????????"zoneId":?"cn-zhangjiakou-a", ??????????"availableDiskCategories":?[ ??????????????"cloud_ssd", ??????????????"cloud_efficiency" ??????????], ??????????"availableInstanceTypes":?[ ??????????????"ecs.e4.large", ??????????????"ecs.n4.4xlarge", ??????????????"ecs.sn2.medium", ??????????????"ecs.i1.2xlarge", ??????????????"ecs.se1.2xlarge", ??????????????"ecs.n4.xlarge", ??????????????"ecs.se1ne.2xlarge", ??????????????"ecs.se1.large", ??????????????"ecs.sn2.xlarge", ??????????????"ecs.se1ne.xlarge", ??????????????"ecs.xn4.small", ??????????????"ecs.sn2ne.4xlarge", ??????????????"ecs.se1ne.4xlarge", ??????????????"ecs.sn1.medium", ??????????????"ecs.n4.8xlarge", ??????????????"ecs.mn4.large", ??????????????"ecs.e4.2xlarge", ??????????????"ecs.mn4.2xlarge", ??????????????"ecs.mn4.8xlarge", ??????????????"ecs.n4.2xlarge", ??????????????"ecs.e4.xlarge", ??????????????"ecs.sn2ne.large", ??????????????"ecs.sn2ne.xlarge", ??????????????"ecs.sn1ne.large", ??????????????"ecs.n4.large", ??????????????"ecs.sn1.3xlarge", ??????????????"ecs.e4.4xlarge", ??????????????"ecs.sn1ne.2xlarge", ??????????????"ecs.e4.small", ??????????????"ecs.i1.4xlarge", ??????????????"ecs.se1.4xlarge", ??????????????"ecs.sn2ne.2xlarge", ??????????????"ecs.sn2.3xlarge", ??????????????"ecs.i1.xlarge", ??????????????"ecs.n4.small", ??????????????"ecs.sn1ne.4xlarge", ??????????????"ecs.mn4.4xlarge", ??????????????"ecs.sn1ne.xlarge", ??????????????"ecs.se1ne.large", ??????????????"ecs.sn2.large", ??????????????"ecs.i1-c5d1.4xlarge", ??????????????"ecs.sn1.xlarge", ??????????????"ecs.sn1.large", ??????????????"ecs.mn4.small", ??????????????"ecs.mn4.xlarge", ??????????????"ecs.se1.xlarge" ??????????], ??????????"availableResourceCreation":?[ ??????????????"VSwitch", ??????????????"IoOptimized", ??????????????"Instance", ??????????????"Disk" ??????????], ??????????"availableResources":?[ ??????????????{ ??????????????????"dataDiskCategories":?[ ??????????????????????"cloud_ssd", ??????????????????????"cloud_efficiency" ??????????????????], ??????????????????"instanceGenerations":?[ ??????????????????????"ecs-3", ??????????????????????"ecs-2" ??????????????????], ??????????????????"instanceTypeFamilies":?[ ??????????????????????"ecs.mn4", ??????????????????????"ecs.sn1", ??????????????????????"ecs.sn2", ??????????????????????"ecs.sn1ne", ??????????????????????"ecs.xn4", ??????????????????????"ecs.i1", ??????????????????????"ecs.se1", ??????????????????????"ecs.e4", ??????????????????????"ecs.n4", ??????????????????????"ecs.se1ne", ??????????????????????"ecs.sn2ne" ??????????????????], ??????????????????"instanceTypes":?[ ??????????????????????"ecs.n4.4xlarge", ??????????????????????"ecs.sn2.medium", ??????????????????????"ecs.i1.2xlarge", ??????????????????????"ecs.se1.2xlarge", ??????????????????????"ecs.n4.xlarge", ??????????????????????"ecs.se1ne.2xlarge", ??????????????????????"ecs.se1.large", ??????????????????????"ecs.sn2.xlarge", ??????????????????????"ecs.se1ne.xlarge", ??????????????????????"ecs.xn4.small", ??????????????????????"ecs.sn2ne.4xlarge", ??????????????????????"ecs.se1ne.4xlarge", ??????????????????????"ecs.sn1.medium", ??????????????????????"ecs.n4.8xlarge", ??????????????????????"ecs.mn4.large", ??????????????????????"ecs.mn4.2xlarge", ??????????????????????"ecs.mn4.8xlarge", ??????????????????????"ecs.n4.2xlarge", ??????????????????????"ecs.sn2ne.large", ??????????????????????"ecs.sn2ne.xlarge", ??????????????????????"ecs.sn1ne.large", ??????????????????????"ecs.n4.large", ??????????????????????"ecs.sn1.3xlarge", ??????????????????????"ecs.sn1ne.2xlarge", ??????????????????????"ecs.e4.small", ??????????????????????"ecs.i1.4xlarge", ??????????????????????"ecs.se1.4xlarge", ??????????????????????"ecs.sn2ne.2xlarge", ??????????????????????"ecs.sn2.3xlarge", ??????????????????????"ecs.i1.xlarge", ??????????????????????"ecs.n4.small", ??????????????????????"ecs.sn1ne.4xlarge", ??????????????????????"ecs.mn4.4xlarge", ??????????????????????"ecs.sn1ne.xlarge", ??????????????????????"ecs.se1ne.large", ??????????????????????"ecs.sn2.large", ??????????????????????"ecs.i1-c5d1.4xlarge", ??????????????????????"ecs.sn1.xlarge", ??????????????????????"ecs.sn1.large", ??????????????????????"ecs.mn4.small", ??????????????????????"ecs.mn4.xlarge", ??????????????????????"ecs.se1.xlarge" ??????????????????], ??????????????????"ioOptimized":?true, ??????????????????"networkTypes":?[ ??????????????????????"vpc" ??????????????????], ??????????????????"systemDiskCategories":?[ ??????????????????????"cloud_ssd", ??????????????????????"cloud_efficiency" ??????????????????] ??????????????} ??????????], ??????????"availableVolumeCategories":?[ ??????????????"san_ssd", ??????????????"san_efficiency" ??????????] ??????} ??] }

查詢搶占式實例的歷史價格

使用 OpenAPI DescribeSpotPriceHistory 查詢搶占式實例最近 30 天的價格變化數(shù)據(jù),獲得最佳性價比的地域和規(guī)格信息,示例代碼(DescribeSpotPriceHistorySample.java)如下。

public?class?DescribeSpotPriceHistorySample?{ ????public?static?void?main(String[]?args)?{ ????????OpenApiCaller?caller?=?new?OpenApiCaller(); ????????List<describespotpricehistoryresponse.spotpricetype> ?????????result?=?new?ArrayList<describespotpricehistoryresponse.spotpricetype>(); ????????int?offset?=?0; ????????while?(true)?{ ????????????DescribeSpotPriceHistoryRequest?request?=?new?DescribeSpotPriceHistoryRequest(); ????????????request.setRegionId("cn-hangzhou"); ????????????//可以通過?DescribeRegionsRequest?獲取可購買的每個地域的?RegionId ????????????request.setZoneId("cn-hangzhou-b");//可用區(qū)必填 ????????????request.setInstanceType("ecs.sn2.medium");//參考?DescribeZones?返回的實例類型,必填 ????????????request.setNetworkType("vpc");//參考?DescribeZones?返回的網(wǎng)絡(luò)類型,必填 //????????????request.setIoOptimized("optimized"); ????????????????????????//是否?I/O?優(yōu)化類型,DescribeZones?返回的?IoOptimized,選填 //????????????request.setStartTime("2017-09-20T08:45:08Z");//價格開始時間,選填,默認(rèn)?3?天內(nèi)數(shù)據(jù) //????????????request.setEndTime("2017-09-28T08:45:08Z");//價格結(jié)束時間,選填 ????????????request.setOffset(offset); ????????????DescribeSpotPriceHistoryResponse?response?=?caller.doAction(request); ????????????if?(response?!=?null?&amp;&amp;?response.getSpotPrices()?!=?null)?{ ????????????????result.addAll(response.getSpotPrices()); ????????????} ????????????if?(response.getNextOffset()?==?null?||?response.getNextOffset()?==?0)?{ ????????????????break; ????????????}?else?{ ????????????????offset?=?response.getNextOffset(); ????????????} ????????} ????????if?(!result.isEmpty())?{ ????????????for?(DescribeSpotPriceHistoryResponse.SpotPriceType?spotPriceType?:?result)?{ ????????????????System.out.println(spotPriceType.getTimestamp()?+?"---&gt;? ????????????????spotPrice:"?+?spotPriceType.getSpotPrice()?+?"----&gt; ????????????????originPrice:"?+?spotPriceType.getOriginPrice()); ????????????} ????????????System.out.println(result.size()); ????????}?else?{ ????????} ????} }</describespotpricehistoryresponse.spotpricetype></describespotpricehistoryresponse.spotpricetype>

以下為返回結(jié)果示例。

2017-09-26T06:28:55Z---&gt;spotPrice:0.24----&gt;originPrice:1.2 2017-09-26T14:00:00Z---&gt;spotPrice:0.36----&gt;originPrice:1.2 2017-09-26T15:00:00Z---&gt;spotPrice:0.24----&gt;originPrice:1.2 2017-09-27T14:00:00Z---&gt;spotPrice:0.36----&gt;originPrice:1.2 2017-09-27T15:00:00Z---&gt;spotPrice:0.24----&gt;originPrice:1.2 2017-09-28T14:00:00Z---&gt;spotPrice:0.36----&gt;originPrice:1.2 2017-09-28T15:00:00Z---&gt;spotPrice:0.24----&gt;originPrice:1.2 2017-09-29T06:28:55Z---&gt;spotPrice:0.24----&gt;originPrice:1.2

重復(fù)以上步驟,您可以判斷出該規(guī)格資源在可用區(qū)的價格變化趨勢和最近價格。

說明:

您可以通過平均價格和最高價格來決定是否可以接受購買該搶占式實例,也可以通過更加合理的數(shù)據(jù)模型來分析歷史價格數(shù)據(jù),隨時調(diào)整創(chuàng)建資源的規(guī)格和可用區(qū),到達(dá)最佳性價比。

創(chuàng)建搶占式實例

在創(chuàng)建搶占式實例之前,您需要完成以下工作:

如果您使用自定義鏡像創(chuàng)建搶占式實例,必須已經(jīng) 創(chuàng)建自定義鏡像。

在控制臺 創(chuàng)建安全組,或者使用 OpenAPI CreateSecurityGroup 創(chuàng)建安全組,并獲取安全組 ID(SecurityGroupId)。

在控制臺創(chuàng)建 VPC 和 交換機(jī),或者使用 OpenAPI CreateVpc 和 CreateVSwitch 創(chuàng)建,并獲取交換機(jī) ID(VSwitchId)。

使用 OpenAPI CreateInstance 創(chuàng)建搶占式實例。示例代碼(CreateInstaneSample.java)如下。

public?class?CreateInstaneSample?{ ????public?static?void?main(String[]?args)?{ ????????OpenApiCaller?caller?=?new?OpenApiCaller(); ????????CreateInstanceRequest?request?=?new?CreateInstanceRequest(); ????????request.setRegionId("cn-hangzhou");//地域?ID ????????request.setZoneId("cn-hangzhou-b");?//可用區(qū)ID ????????request.setSecurityGroupId("sg-bp11nhf94ivkdxwb2gd4");//提前創(chuàng)建的安全組?ID ????????request.setImageId("centos_7_03_64_20G_alibase_20170818.vhd"); ????????//建議選擇您自己在該地域準(zhǔn)備的自定義鏡像 ????????request.setVSwitchId("vsw-bp164cyonthfudn9kj5br");//VPC?類型需要交換機(jī)?ID ????????request.setInstanceType("ecs.sn2.medium");?//填入您詢價后需要購買的規(guī)格 ????????request.setIoOptimized("optimized");//參考?DescirbeZones?返回參數(shù) ????????request.setSystemDiskCategory("cloud_ssd"); ????????//參考?DescirbeZones?返回參數(shù),多選一?cloud_ssd,?cloud_efficiency,?cloud ????????request.setSystemDiskSize(40); ????????request.setInstanceChargeType("PostPaid");//搶占式實例必須后付費 ????????request.setSpotStrategy("SpotWithPriceLimit"); ????????//SpotWithPriceLimit?出價模式,SpotAsPriceGo?不用出價,最高按量付費價格 ????????request.setSpotPriceLimit(0.25F);//SpotWithPriceLimit? ????????出價模式生效,您能接受的最高價格,單位為元每小時,必須高于當(dāng)前的市場成交價才能成功 ????????CreateInstanceResponse?response?=?caller.doAction(request); ????????System.out.println(response.getInstanceId()); ????} }

回收搶占式實例

當(dāng)搶占式實例可能會因為價格因素或者市場供需變化而被強(qiáng)制回收。此時會觸發(fā)搶占式實例的中斷。釋放前,搶占式實例會進(jìn)入鎖定狀態(tài),提示實例將會被自動回收。您可以針對實例回收狀態(tài)自動化處理實例的退出邏輯。

目前,您可以通過以下任一種方式來獲取搶占式實例的中斷鎖定狀態(tài):

通過 實例元數(shù)據(jù) 獲取。運行以下命令:

curl?'http://100.100.100.200/latest/meta-data/instance/spot/termination-time'

如果返回為空,說明實例可持續(xù)使用。如果返回類似 2015-01-05T18:02:00Z 格式的信息(UTC 時間),說明實例將于這個時間釋放。

使用 OpenAPI DescribeInstances,根據(jù)返回的 OperationLocks 判斷實例是否進(jìn)入 待回收 狀態(tài)。代碼示例如下(DescribeInstancesSample.java)。

public?class?DescribeInstancesSample?{ ??public?static?void?main(String[]?args)?throws?InterruptedException?{ ??????OpenApiCaller?caller?=?new?OpenApiCaller(); ??????JSONArray?allInstances?=?new?JSONArray(); ??????allInstances.addAll(Arrays.asList("i-bp18hgfai8ekoqwo0y2n",?"i-bp1ecbyds24ij63w146c")); ??????while?(!allInstances.isEmpty())?{ ??????????DescribeInstancesRequest?request?=?new?DescribeInstancesRequest(); ??????????request.setRegionId("cn-hangzhou"); ??????????request.setInstanceIds(allInstances.toJSONString());//指定實例?ID,效率最高 ??????????DescribeInstancesResponse?response?=?caller.doAction(request); ??????????List<describeinstancesresponse.instance>?instanceList?=?response.getInstances(); ??????????if?(instanceList?!=?null?&amp;&amp;?!instanceList.isEmpty())?{ ??????????????for?(DescribeInstancesResponse.Instance?instance?:?instanceList)?{ ??????????????????System.out.println ???????????????("result:instance:"?+?instance.getInstanceId()?+?",az:"?+?instance.getZoneId()); ??????????????????if?(instance.getOperationLocks()?!=?null)?{ ????????????for?(DescribeInstancesResponse.Instance.LockReason? ????????????lockReason?:?instance.getOperationLocks())?{ ???System.out.println("instance:"?+?instance.getInstanceId()?+?"--&gt; ???lockReason:"?+?lockReason.getLockReason()?+?",vmStatus:"?+?instance.getStatus()); ??????????if?("Recycling".equals(lockReason.getLockReason()))?{ ???????????//do?your?action ??System.out.println("spot?instance?will?be?recycled?immediately,? ??instance?id:"?+?instance.getInstanceId()); ????????allInstances.remove(instance.getInstanceId()); ??????????????????????????} ??????????????????????} ??????????????????} ??????????????} ??????????????System.out.print("try?describeInstances?again?later?..."); ??????????????Thread.sleep(2?*?60?*?1000); ??????????}?else?{ ??????????????break; ??????????} ??????} ??} }</describeinstancesresponse.instance>

觸發(fā)回收時輸出結(jié)果如下:

instance:i-bp1ecbyds24ij63w146c--&gt;lockReason:Recycling,vmStatus:Stopped spot?instance?will?be?recycled?immediately,?instance?id:i-bp1ecbyds24ij63w146c

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊6 分享