创建抢占式实例

您可以通过ECS控制台、APITerraform创建抢占式实例。

使用须知

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

  • 选择合理的出价。

    出价要充分考虑到市场价格的波动,合理的出价可以提升抢占式实例创建成功的概率,并降低后续使用中由于出价低于市场价格导致实例被释放的概率。另外,出价还必须符合您根据自身业务评估后的预期。

    说明

    如果您暂时不能决定出价,建议使用自动出价,即接受实时的市场价格作为实例规格的计费价格 。

  • 使用的镜像必须包含所需软件的配置,确保实例在创建完成后可以随时启动。您还能使用实例自定义数据在启动时运行命令。详情请参见自定义实例初始化配置

  • 建议您使用不受抢占式实例释放影响的存储介质来保存您的重要数据。

    例如,您可以使用独立创建的云盘(不能设置为随实例一起释放)、OSS、RDS等存储数据。

  • 将工作拆分为小的任务(使用网格、Hadoop或基于队列的架构)或者使用检查点,便于您经常保存计算结果。

  • 使用抢占式实例释放通知来监控抢占式实例的状态。

    您可以通过实例元数据每分钟获取一次实例的状态,阿里云ECS释放抢占式实例时,会提前5分钟更新元数据信息。详情请参见ECS实例元数据概述

  • 测试您的应用程序,确保它能很好地处理意外释放的实例。

    您可以使用按量付费实例来运行该应用程序,然后自行释放这台实例,从而确认应用程序是否能处理自动释放的实例。

操作步骤

通过ECS控制台创建

  1. 前往实例创建页

  2. 选择自定义购买页签。

  3. 根据实际需求和页面提示,设置ECS资源配置信息。

    需注意以下参数(其他配置项说明,请参考自定义购买实例):

    • 付费类型:选择抢占式实例

    • 实例使用时长

      • 设定实例使用1小时:实例稳定运行1小时不会被自动释放,超过1小时后,系统每5分钟监测库存、您出价的变化,进而判断您是否能够继续使用资源。

      • 无确定使用时长:基于实际业务需求,不进行资源使用时长的设定,优势在于相较设定实例使用时长可获得更优成本。

    • 单台实例上限价格

      • 使用自动出价:选择跟随当前市场价格的模式,即表示始终接受实时的市场价格作为实例规格的计费价格 。

      • 设置单台上限价:您必须为指定的实例规格设置一个价格上限,即您愿意为这个实例规格支付的最高价格 。

  4. 在最终创建实例前,请在页面检查实例的整体配置并配置使用时长等选项,确保各项配置符合您的要求。

  5. 阅读并确认《云服务器ECS服务条款》 《通用服务条款》单击确认下单

通过API创建

您可以通过阿里云CLI、OpenAPI Explorer和阿里云SDK等开发者工具调用RunInstances接口创建抢占式实例。 具体操作,请参见RunInstances

说明
  • 如果需要跟随当前市场实际价格,将SpotStrategy参数设为SpotAsPriceGo。如果需要设置能接受的最高价,将 SpotStrategy参数设为SpotWithPriceLimit

  • 您可以调用DescribeSpotPriceHistory接口查询抢占式实例的历史价格,通过历史价格数据可以帮助您合理的设置抢占式实例的单台实例上限价格。

通过Terraform创建

说明

以下操作步骤示例代码支持一键运行,您可以直接运行代码。一键运行

前提条件

  • 由于阿里云账号(主账号)具有资源的所有权限,防止AK泄露后被任意利用。建议您使用拥有最小化权限的RAM用户的AccessKey进行操作,具体操作方式请参见创建RAM用户创建AccessKey

  • 请参考以下示例为RAM用户创建自定义权限策略:允许启动ECS实例、查看ECS实例的详细信息以及查看ECS现货实例的价格历史。具体操作方式请参见创建自定义权限策略

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:RunInstances",
        "ecs:DescribeInstances",
        "ecs:DescribeSpotPriceHistory"
      ],
      "Resource": "*"
    }
  ]
}
  • 准备Terraform运行环境,您可以选择以下任一方式来使用Terraform。

    • Terraform Explorer中使用Terraform:阿里云提供了Terraform的在线运行环境,您无需安装Terraform,登录后即可在线使用和体验Terraform。适用于零成本、快速、便捷地体验和调试Terraform的场景。

    • Cloud Shell:阿里云Cloud Shell中预装了Terraform的组件,并已配置好身份凭证,您可直接在Cloud Shell中运行Terraform的命令。适用于低成本、快速、便捷地访问和使用Terraform的场景。

    • 在本地安装和配置Terraform:适用于网络连接较差或需要自定义开发环境的场景。

使用的资源

操作步骤

  1. 打开浏览器,访问Cloud Shell的地址https://shell.aliyun.com

    更多Cloud Shell入口及使用,请参见使用云命令行

  2. 登录Cloud Shell。

  3. 创建一个用于存放Terraform资源的项目文件夹,命名为terraform

  4. 执行以下命令,进入项目目录。

    cd terraform
  5. 执行以下命令,创建名为main.tf的配置文件。

provider "alicloud" {
  region = var.region
}

# 区域
variable "region" {
  type    = string
  default = "cn-beijing"
}

# VPC 名称
variable "vpc_name" {
  type    = string
  default = "tf_test_fofo"
}

# VPC CIDR 块
variable "vpc_cidr_block" {
  type    = string
  default = "172.16.0.0/12"
}

# vSwitch CIDR 块
variable "vswitch_cidr_block" {
  type    = string
  default = "172.16.0.0/21"
}

# 可用区
variable "availability_zone" {
  type    = string
  default = "cn-beijing-b"
}

# 安全组名称
variable "security_group_name" {
  type    = string
  default = "default"
}

# 实例规格
variable "instance_type" {
  type    = string
  default = "ecs.n2.small"
}

# 系统盘类型
variable "system_disk_category" {
  type    = string
  default = "cloud_efficiency"
}

# 操作系统镜像
variable "image_id" {
  type    = string
  default = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
}

# 实例名称
variable "instance_name" {
  type    = string
  default = "test_fofo"
}

# 公网带宽
variable "internet_max_bandwidth_out" {
  type    = number
  default = 10
}

# 付费类型
variable "instance_charge_type" {
  type    = string
  default = "PostPaid"
}

# 抢占式实例出价策略
variable "spot_strategy" {
  type    = string
  default = "SpotAsPriceGo"
}

# 抢占式实例的保留时长
variable "spot_duration" {
  type    = number
  default = 0
}

# 入站规则端口范围
variable "port_range" {
  type    = string
  default = "1/65535"
}

# 入站规则优先级
variable "priority" {
  type    = number
  default = 1
}

# 入站规则CIDR
variable "cidr_ip" {
  type    = string
  default = "0.0.0.0/0"
}

resource "alicloud_vpc" "vpc" {
  name       = var.vpc_name
  cidr_block = var.vpc_cidr_block
}

resource "alicloud_vswitch" "vsw" {
  vpc_id            = alicloud_vpc.vpc.id
  cidr_block        = var.vswitch_cidr_block
  availability_zone = var.availability_zone
}

resource "alicloud_security_group" "default" {
  name   = var.security_group_name
  vpc_id = alicloud_vpc.vpc.id
}

resource "alicloud_instance" "instance" {
  availability_zone          = var.availability_zone
  security_groups = [alicloud_security_group.default.id]
  instance_type              = var.instance_type
  system_disk_category       = var.system_disk_category
  image_id                   = var.image_id
  instance_name              = var.instance_name
  vswitch_id                 = alicloud_vswitch.vsw.id
  internet_max_bandwidth_out = var.internet_max_bandwidth_out
  instance_charge_type       = var.instance_charge_type
  spot_strategy              = var.spot_strategy
  spot_duration              = var.spot_duration
}

resource "alicloud_security_group_rule" "allow_all_tcp" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = var.port_range
  priority          = var.priority
  security_group_id = alicloud_security_group.default.id
  cidr_ip           = var.cidr_ip
}
  1. 执行terraform init命令,初始化配置。

预期结果:image

  1. 执行terraform apply命令,在执行过程中,根据提示输入yes并按下Enter键,等待命令执行完成,若出现以下信息,则表示创建抢占式实例完成。

预期结果:image

操作验证

执行terraform show命令

您可以使用以下命令查询Terraform已创建的资源详细信息:

terraform show

image

云服务器 ECS控制台验证

登录云服务器ECS控制台,查看您创建的抢占式实例。

image

清理资源

当您不再需要上述通过Terraform创建或管理的资源时,请运行以下命令以释放资源。关于terraform destroy的更多信息,请参见Terraform常用命令

terraform destroy

完整示例

说明

当前示例代码支持一键运行,您可以直接运行代码。一键运行

示例代码

provider "alicloud" {
  region = var.region
}

# 区域
variable "region" {
  type    = string
  default = "cn-beijing"
}

# VPC 名称
variable "vpc_name" {
  type    = string
  default = "tf_test_fofo"
}

# VPC CIDR 块
variable "vpc_cidr_block" {
  type    = string
  default = "172.16.0.0/12"
}

# vSwitch CIDR 块
variable "vswitch_cidr_block" {
  type    = string
  default = "172.16.0.0/21"
}

# 可用区
variable "availability_zone" {
  type    = string
  default = "cn-beijing-b"
}

# 安全组名称
variable "security_group_name" {
  type    = string
  default = "default"
}

# 实例规格
variable "instance_type" {
  type    = string
  default = "ecs.n2.small"
}

# 系统盘类型
variable "system_disk_category" {
  type    = string
  default = "cloud_efficiency"
}

# 操作系统镜像
variable "image_id" {
  type    = string
  default = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
}

# 实例名称
variable "instance_name" {
  type    = string
  default = "test_fofo"
}

# 公网带宽
variable "internet_max_bandwidth_out" {
  type    = number
  default = 10
}

# 付费类型
variable "instance_charge_type" {
  type    = string
  default = "PostPaid"
}

# 抢占式实例出价策略
variable "spot_strategy" {
  type    = string
  default = "SpotAsPriceGo"
}

# 抢占式实例的保留时长
variable "spot_duration" {
  type    = number
  default = 0
}

# 入站规则端口范围
variable "port_range" {
  type    = string
  default = "1/65535"
}

# 入站规则优先级
variable "priority" {
  type    = number
  default = 1
}

# 入站规则CIDR
variable "cidr_ip" {
  type    = string
  default = "0.0.0.0/0"
}

resource "alicloud_vpc" "vpc" {
  name       = var.vpc_name
  cidr_block = var.vpc_cidr_block
}

resource "alicloud_vswitch" "vsw" {
  vpc_id            = alicloud_vpc.vpc.id
  cidr_block        = var.vswitch_cidr_block
  availability_zone = var.availability_zone
}

resource "alicloud_security_group" "default" {
  name   = var.security_group_name
  vpc_id = alicloud_vpc.vpc.id
}

resource "alicloud_instance" "instance" {
  availability_zone          = var.availability_zone
  security_groups = [alicloud_security_group.default.id]
  instance_type              = var.instance_type
  system_disk_category       = var.system_disk_category
  image_id                   = var.image_id
  instance_name              = var.instance_name
  vswitch_id                 = alicloud_vswitch.vsw.id
  internet_max_bandwidth_out = var.internet_max_bandwidth_out
  instance_charge_type       = var.instance_charge_type
  spot_strategy              = var.spot_strategy
  spot_duration              = var.spot_duration
}

resource "alicloud_security_group_rule" "allow_all_tcp" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = var.port_range
  priority          = var.priority
  security_group_id = alicloud_security_group.default.id
  cidr_ip           = var.cidr_ip
}

相关文档