全部產品
Search
文件中心

Elastic Compute Service:建立搶佔式執行個體

更新時間:Dec 12, 2024

您可以通過ECS控制台、API或Terraform建立搶佔式執行個體。

使用須知

在使用搶佔式執行個體時,您需要考慮如下內容:

  • 選擇合理的出價。

    出價要充分考慮到市場價格的波動,合理的出價可以提升搶佔式執行個體建立成功的機率,並降低後續使用中由於出價低於市場價格導致執行個體被釋放的機率。另外,出價還必須符合您根據自身業務評估後的預期。

    說明

    如果您暫時不能決定出價,建議使用自動出價,即接受即時的市場價格作為執行個體規格的計費價格 。

  • 使用的鏡像必須包含所需軟體的配置,確保執行個體在建立完成後可以隨時啟動。您還能使用執行個體自訂資料在啟動時運行命令。詳情請參見自訂執行個體初始化配置

  • 建議您使用不受搶佔式執行個體釋放影響的儲存介質來儲存您的重要資料。

    例如,您可以使用獨立建立的雲端硬碟(不能設定為隨執行個體一起釋放)、OSS、RDS等儲存資料。

  • 將工作拆分為小的任務(使用網格、Hadoop或基於隊列的架構)或者使用檢查點,便於您經常儲存計算結果。

  • 使用搶佔式執行個體釋放通知來監控搶佔式執行個體的狀態。

    您可以通過執行個體中繼資料每分鐘擷取一次執行個體的狀態,阿里雲ECS釋放搶佔式執行個體時,會提前5分鐘更新中繼資料資訊。詳情請參見ECS執行個體中繼資料概述

  • 測試您的應用程式,確保它能很好地處理意外釋放的執行個體。

    您可以使用隨用隨付執行個體來運行該應用程式,然後自行釋放這台執行個體,從而確認應用程式是否能處理自動釋放的執行個體。

操作步驟

通過ECS控制台建立

  1. 前往執行個體建立頁

  2. 選擇自訂購買頁簽。

  3. 根據實際需求和頁面提示,設定ECS資源配置資訊。

    需注意以下參數(其他配置項說明,請參考自訂購買執行個體):

    • 付費模式:選擇搶佔式執行個體

    • 搶佔式執行個體使用時間長度

      • 設定執行個體使用1小時:執行個體穩定運行1小時不會被自動釋放,超過1小時後,系統每5分鐘監測庫存、您出價的變化,進而判斷您是否能夠繼續使用資源。

      • 無確定使用時間長度:基於實際業務需求,不進行資源使用時間長度的設定,優勢在於相較設定執行個體使用時間長度可獲得更優成本。

    • 單台執行個體規格上限價

      • 使用自動出價:選擇跟隨當前市場價格的模式,即表示始終接受即時的市場價格作為執行個體規格的計費價格 。

      • 設定單台上限價:您必須為指定的執行個體規格設定一個價格上限,即您願意為這個執行個體規格支付的最高價格 。

  4. 在最終建立執行個體前,請在頁面檢查執行個體的整體配置並配置使用時間長度等選項,確保各項配置符合您的要求。

  5. 閱讀並確認《Elastic Compute Service服務條款》 《泛型服務條款》單擊確認下單

通過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

Elastic Compute Service控制台驗證

登入雲伺服器ECS控制台,查看您建立的搶佔式執行個體。

image

清理資源

當您不再需要上述通過Terraform建立或管理的資源時,請運行以下命令以釋放資源。關於terraform destroy的更多資訊,請參見常用命令

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
}

相關文檔