抢占式实例是一种低成本竞价型实例,您可以对阿里云当前闲置的资源出价,获得资源后运行容器并持续到(因为其他客户的更高出价)资源被回收,为您极大的降低部分场景下使用ECI实例的成本。

说明

抢占式实例相对于按量付费实例价格有一定的折扣,实际价格随供求波动,并按实际使用时长进行收费,更详细的说明,请参见抢占式实例概述

抢占式实例创建成功后拥有一小时的保护周期,即在创建成功后第一个小时内,即使市场价格浮动超过了出价,抢占式实例也不会被释放,您可以在该抢占式实例上正常运行业务。超过保护周期后,每5分钟检测一次实例规格的当前市场价格和库存,如果某一时刻的市场价格高于出价或实例规格库存不足,抢占式实例会被释放。
  • 抢占式ECI实例运行1小时后将会因为价格的波动、库存等原因被系统回收。
  • 系统回收会提前3分钟会产生准备释放的事件。
  • 释放的ECI的资源会被回收,但是实例信息会依然保留,回收后实例不再收费并且状态变为Expired(已过期)。
注意 抢占式实例不支持备案服务。

在使用抢占式实例时,您需要考虑以下内容:

  • 选择一个合理的出价,您的出价应该足够高,而且要充分考虑到市场价格的波动。这样,您的抢占请求才会被接受处理,而且创建后才不会因为价格因素被释放。另外,出价还必须符合您根据自身业务评估后的预期。
  • 建议您使用不受抢占式实例释放影响的存储介质来保存您的重要数据。例如,您可以使用独立创建的云盘(不能设置为随实例一起释放)存储数据,或者NAS等外部存储。

创建抢占式ECI实例依然支持ECS InstanceType形式和CPU/内存形式两种创建方式:

  • ECS InstanceType形式。计费会以该规格的按量市场价以及实时折扣为准。
  • CPU/内存形式。ECI会自动匹配满足价格要求的ECS InstanceType,并以此规格作为计费的原始市场价,即实例的计费折扣都是基于该规格的市场价,而非对应的ECI的CPU/Memory的按量价格。该方式等效于传入InstanceType方式创建。

应用场景

抢占式实例适用于无状态的应用场景,例如可弹性伸缩的Web站点服务、图像渲染、大数据分析和大规模并行计算等。应用程序的分布度、可扩展性和容错能力越高,越适合使用抢占式实例节省成本和提升吞吐量。

您可以在抢占式实例上部署以下业务:

  • 实时分析业务
  • 大数据计算业务
  • 可弹性伸缩的业务站点
  • 图像和媒体编码业务
  • 科学计算业务
  • 地理空间勘测分析业务
  • 网络爬虫业务
  • 测试业务

Kubernetes方式

支持通过在Pod层面设置annotation k8s.aliyun.com/eci-spot-strategy和k8s.aliyun.com/eci-spot-price-limit

  • SpotAsPriceGo:系统自动出价,跟随当前市场实际价格。
  • SpotWithPriceLimit:设置抢占实例价格上限。

具体实现方式:

  • k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"
  • k8s.aliyun.com/eci-spot-price-limit只有k8s.aliyun.com/eci-spot-strategy设置为SpotWithPriceLimit时有效。设置实例每小时最高价格,支持最多3位小数。

Deployment示例,SpotAsPriceGo策略

apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment-basic
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        k8s.aliyun.com/eci-use-specs : "2-4Gi"  #根据需要替换您接受的 ECS 规格
        k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"  #随市场出价策略
    spec:
    #  nodeSelector:
    #    env: test-team
      containers:
      - name: nginx
        image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
        ports:
        - containerPort: 80

Deployment示例,SpotWithPriceLimit策略

apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment-basic
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        k8s.aliyun.com/eci-use-specs : "ecs.c5.large"  #根据需要替换您接受的 ECS 规格
        k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit"  #最高价限定策略
        k8s.aliyun.com/eci-spot-price-limit: "0.250" #小时最高单价
    spec:
    #  nodeSelector:
    #    env: test-team
      containers:
      - name: nginx
        image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
        ports:
        - containerPort: 80

OpenAPI方式

您可以通过阿里云CLI、OpenAPI Explorer和阿里云SDK等开发者工具调用CreateContainerGroup创建抢占式实例。

  • 跟随当前市场实际价格,将SpotStrategy参数设为SpotAsPriceGo。
  • 设置能接受的最高价,将 SpotStrategy参数设为SpotWithPriceLimit并设置SpotPriceLimit。
注意 在使用SpotAsPriceGo模式下,若对应可用区规格资源紧张,最高价格会到达按量使用的价格。
使用Python SDK创建抢占式实例,代码示例如下。
#!/usr/bin/env python
#coding=utf-8

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkeci.request.v20180808.CreateContainerGroupRequest import CreateContainerGroupRequest


client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-hangzhou')

request = CreateContainerGroupRequest()
request.set_accept_format('json')

request.set_SecurityGroupId("sg-xxx")
request.set_VSwitchId("vsw-xxx")
request.set_ContainerGroupName("test-spot")
request.set_SpotStrategy('SpotAsPriceGo')
request.set_InstanceType('ecs.c5.large')
request.set_Containers([
  {
    "Image": "nginx",
    "Name": "nginx"
  }
])

response = client.do_action_with_exception(request)
print(response)