抢占式实例可能会因为价格因素或者市场供需变化而被强制回收,此时会触发抢占式实例的中断。回收前,抢占式实例会进入锁定状态,提示实例将会被自动回收。本文介绍如何查询抢占式实例中断事件,您可以针对实例回收状态自动化处理实例的退出逻辑。
通过云监控SDK查询抢占式实例中断事件
以云监控Java SDK为例,介绍如何查询抢占式实例中断事件。
通过实例元数据获取查询抢占式实例中断事件
通过API查询抢占式实例中断事件
使用DescribeInstances,根据返回的OperationLocks判断实例是否进入待回收状态。
代码示例(DescribeInstancesSample.java)如下所示。
import com.alibaba.fastjson.JSONArray;
import com.aliyuncs.AcsRequest;
import com.aliyuncs.AcsResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.*;
public class DescribeInstancesSample {
public static void main(String[] args) throws InterruptedException {
// 初始化DefaultAcsClient实例。
OpenApiCaller caller = new OpenApiCaller();
// 设置待查询的一个或多个ECS实例ID。
JSONArray allInstances = new JSONArray();
allInstances.addAll(Arrays.asList("i-bp1i9c3qiv1qs6nc****"));
while (!allInstances.isEmpty()) {
DescribeInstancesRequest request = new DescribeInstancesRequest();
// 指定实例所在的地域。
request.setRegionId("cn-hangzhou");
// 指定实例ID,查询效率高。
request.setInstanceIds(allInstances.toJSONString());
// 接收响应结果
DescribeInstancesResponse response = caller.doAction(request);
// 获取实例相关的返回结果
List<DescribeInstancesResponse.Instance> instanceList = response.getInstances();
if (instanceList != null && !instanceList.isEmpty()) {
for (DescribeInstancesResponse.Instance instance : instanceList) {
// 输出被查询的实例ID与可用区信息。
System.out.println("result:instance:" + instance.getInstanceId() + ",az:" + instance.getZoneId());
if (instance.getOperationLocks() != null) {
for (DescribeInstancesResponse.Instance.LockReason lockReason : instance.getOperationLocks()) {
// 如果实例被锁定,输出指定实例ID以及对应的锁定类型。
System.out.println("instance:" + instance.getInstanceId() + "-->lockReason:" + lockReason.getLockReason() + ",vmStatus:" + instance.getStatus());
if ("Recycling".equals(lockReason.getLockReason())) {
// 输出即将被回收的实例ID信息。
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;
}
}
}
}
// 初始化DefaultAcsClient实例的类。
class OpenApiCaller{
IClientProfile profile;
IAcsClient client;
public OpenApiCaller() {
profile = DefaultProfile.getProfile("cn-hangzhou", "<AccessKeyID>", "<AccessKeySecret>");
client = new DefaultAcsClient(profile);
}
public <T extends AcsResponse> T doAction(AcsRequest<T> var1) {
try {
return client.getAcsResponse(var1);
} catch (Throwable e) {
e.printStackTrace();
return null;
}
}
}
触发回收时输出结果如下:
result:instance:i-bp1i9c3qiv1qs6nc****,az:cn-hangzhou-i instance:i-bp1i9c3qiv1qs6nc****-->lockReason:Recycling,vmStatus:Stopped spot instance will be recycled immediately, instance id:i-bp1i9c3qiv1qs6nc****