Cree una instancia spot desde la consola de ECS, el SDK o terraform para ejecutar cargas de trabajo tolerantes a fallos, como análisis de datos, a un costo menor que el de pay-as-you-go.
Antes de empezar
Tenga en cuenta las siguientes recomendaciones al crear una instancia spot:
-
Establezca una estrategia de oferta razonable: considere la volatilidad del precio de mercado. Una oferta adecuada aumenta la probabilidad de iniciar la instancia correctamente y reduce el riesgo de liberación. Asegúrese de que su oferta coincida con sus expectativas de presupuesto.
NotaSi no tiene certeza sobre el monto de su oferta, utilice la oferta automática. Esta opción acepta el precio de mercado en tiempo real como tarifa de facturación.
Garantice la persistencia de los datos: almacene la información crítica en medios de almacenamiento que no se vean afectados por la liberación de instancias spot. Por ejemplo, discos independientes (que no se liberan junto con la instancia), OSS o NAS.
Supervise el estado de la instancia: use CloudMonitor o los metadatos de la instancia para dar seguimiento a su estado. Consulte Detect and respond to spot instance interruption events.
Gestione las interrupciones: las instancias spot pueden liberarse cuando el precio de mercado supera su oferta máxima o cuando se agota el inventario. Pruebe su aplicación para comprobar que maneja las liberaciones inesperadas sin problemas.
Crear una instancia spot
Crear mediante la consola de ECS
Vaya a la página de creación de instancias y seleccione la pestaña Custom Launch.
-
Configure los recursos de ECS según sus necesidades y las indicaciones en pantalla.
Preste atención a los siguientes parámetros. Para el resto de las configuraciones, consulte Custom launch instances.
Billing Method: seleccione Spot Instance.
-
Instance Usage Duration:
1 Hour: la instancia se ejecuta sin interrupciones durante una hora. Después de ese periodo, el sistema supervisa el inventario y los cambios de precio para determinar si puede continuar usándola.
None: sin duración fija. Esta opción suele ofrecer mejores precios.
-
Maximum Price:
Use Automatic Bid: acepta el precio actual del mercado como tarifa de facturación.
Set Maximum Price: establezca el precio máximo por hora que está dispuesto a pagar.
-
Instance Interruption Mode:
-
Release: se liberan la instancia y sus recursos de cómputo (vCPU, GPU, memoria), así como la IP pública estática, el ancho de banda fijo y los discos.
AvisoLas instancias spot no son adecuadas para almacenar datos críticos. Si selecciona Instance Interruption Mode como Release, podría perder datos. Deshabilite la liberación del disco al terminar la instancia o cree instantáneas del disco periódicamente para proteger su información.
-
Stop in Economical Mode: se recuperan los recursos de cómputo (vCPU, GPU, memoria), la IP pública estática y el ancho de banda fijo. Los discos, las direcciones IP elásticas y las instantáneas se conservan y siguen generando cargos.
NotaUna instancia spot en modo económico podría no reiniciarse si el inventario es insuficiente o si el precio de mercado supera su oferta.
-
Revise su configuración en el lado derecho de la página, defina las opciones de uso y haga clic en Confirm Order.
Crear mediante el SDK
Requisitos previos
-
Cree un accesskey
Una cuenta de Alibaba Cloud (cuenta principal) tiene permisos completos sobre todos los recursos. Por lo tanto, filtrar su accesskey representa un riesgo grave. Utilice un accesskey de usuario de RAM con los permisos mínimos necesarios. Consulte Create an AccessKey.
-
Otorgue permisos de ECS al usuario de RAM
Conceda al usuario de RAM permisos para gestionar ECS. El código de ejemplo requiere privilegios para crear instancias. Permiso recomendado:
Productos de nube
Permiso
Elastic Compute Service
AliyunECSFullAccess
-
Configure las credenciales de acceso
El código de ejemplo lee el accesskey desde las variables de entorno del sistema. Para conocer los pasos de configuración, consulte Configure environment variables on Linux, macOS, and Windows.
-
Instale el SDK de ECS
Obtenga el SDK de ECS. Este ejemplo utiliza Maven. Para otros métodos, consulte Instalar el SDK de Java para ECS.
Inicializar el cliente
El SDK de Alibaba Cloud admite varios tipos de credenciales para inicializar el cliente, como accesskey y token de Security Token Service. Consulte Manage access credentials. Este ejemplo utiliza un accesskey.
import com.aliyun.ecs20140526.Client;
import com.aliyun.teaopenapi.models.Config;
public class Sample {
private static Client createClient() throws Exception {
Config config = new Config()
// Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_ID is set.
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
// For Endpoint, see https://api.alibabacloud.com/product/Ecs
.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
}
Compilar el objeto de solicitud de la API
Revise la documentación de la API para conocer los detalles de los parámetros antes de compilar el objeto de solicitud.
// Build the request object
RunInstancesRequest request = new RunInstancesRequest()
// Set the region
.setRegionId("cn-hangzhou")
// Set billing method to pay-as-you-go
.setInstanceChargeType("PostPaid")
// Set bidding strategy to automatic
.setSpotStrategy("SpotAsPriceGo")
// Set 1-hour usage duration: guarantees the instance runs for 1 hour without release
.setSpotDuration(1)
// Set instance type
.setInstanceType("instanceType")
// Set image
.setImageId("imageId")
// Set security group ID
.setSecurityGroupId("securityGroupId")
// Set virtual switch ID
.setVSwitchId("vSwitchId");
Realizar la llamada
Configure las opciones de tiempo de ejecución, como los tiempos de espera y la configuración del proxy, al llamar a openapi. Consulte Advanced configuration.
// Set runtime options
RuntimeOptions runtime = new RuntimeOptions();
// Call the RunInstances API
RunInstancesResponse response = client.runInstancesWithOptions(request, runtime);
System.out.println(response.body.toMap());
Gestionar excepciones
El SDK de Java clasifica las excepciones en TeaUnretryableException y TeaException.
TeaUnretryableException: problemas de red tras alcanzar el número máximo de reintentos.
TeaException: errores relacionados con la lógica de negocio.
Gestione las excepciones adecuadamente para garantizar la solidez del sistema. Por ejemplo, propáguelas, registre los detalles o intente recuperar el proceso.
Ejemplo completo
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.RunInstancesRequest;
import com.aliyun.ecs20140526.models.RunInstancesResponse;
import com.aliyun.ecs20140526.models.RunInstancesResponseBody;
import com.aliyun.tea.TeaException;
import com.aliyun.tea.TeaUnretryableException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.alibaba.fastjson.JSONArray;
import java.util.Arrays;
public class Sample {
private static Client createClient() throws Exception {
Config config = new Config()
// Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_ID is set.
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
// For Endpoint, see https://api.alibabacloud.com/product/Ecs
.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
public static void main(String[] args) {
try {
Client client = Sample.createClient();
// Build the request object
RunInstancesRequest request = new RunInstancesRequest()
// Set the region
.setRegionId("cn-hangzhou")
// Set billing method to pay-as-you-go
.setInstanceChargeType("PostPaid")
// Set bidding strategy to automatic
.setSpotStrategy("SpotAsPriceGo")
// Set 1-hour usage duration: guarantees the instance runs for 1 hour without release
.setSpotDuration(1)
// Set instance type
.setInstanceType("instanceType")
// Set image
.setImageId("imageId")
// Set security group ID
.setSecurityGroupId("securityGroupId")
// Set virtual switch ID
.setVSwitchId("vSwitchId");
// Set runtime options
RuntimeOptions runtime = new RuntimeOptions();
// Call the RunInstances API
RunInstancesResponse response = client.runInstancesWithOptions(request, runtime);
System.out.println(response.body.toMap());
} catch (TeaUnretryableException ue) {
// This example only prints exceptions. Handle exceptions carefully in production code—never ignore them.
ue.printStackTrace();
// Print error message
System.out.println(ue.getMessage());
// Print request details for debugging
System.out.println(ue.getLastRequest());
} catch (TeaException e) {
// This example only prints exceptions. Handle exceptions carefully in production code—never ignore them.
e.printStackTrace();
// Print error code
System.out.println(e.getCode());
// Print error message (includes RequestId)
System.out.println(e.getMessage());
// Print detailed server-side error
System.out.println(e.getData());
} catch (Exception e) {
// This example only prints exceptions. Handle exceptions carefully in production code—never ignore them.
e.printStackTrace();
}
}
}
Crear mediante terraform
A continuación se incluye código de ejemplo listo para ejecutarse. Ejecutar ahora
Requisitos previos
-
Cree un accesskey
Una cuenta de Alibaba Cloud (cuenta principal) tiene permisos completos sobre todos los recursos. Para evitar usos no autorizados en caso de que se filtre el accesskey, utilice uno de usuario de RAM con los permisos mínimos necesarios. Consulte Create a RAM user y Create an AccessKey.
-
Cree una directiva personalizada
Cree una directiva personalizada que permita iniciar instancias de ECS, consultar los detalles de las instancias y revisar el historial de precios spot. Consulte Create a custom policy.
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunInstances", "ecs:DescribeInstances", "ecs:DescribeSpotPriceHistory" ], "Resource": "*" } ] }
Recursos utilizados
alicloud_vpc: crea una VPC.
alicloud_vswitch: crea un vSwitch dentro de la VPC para segmentar la subred.
alicloud_security_group: crea un security group llamado default y lo asocia con la VPC.
alicloud_instance: crea una instancia de ECS.
alicloud_security_group_rule: define las reglas del security group.
Procedimiento
-
Abra https://shell-sg.alibabacloud.com e inicie sesión en Cloud Shell.
Para conocer otras formas de usar Cloud Shell, consulte Use Cloud Shell.
-
Cree una carpeta de proyecto llamada terraform y acceda al directorio.
mkdir terraform cd terraform -
Cree un archivo de configuración llamado main.tf con el siguiente contenido:
-
Ejecute
terraform initpara inicializar la configuración.Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary. -
Ejecute
terraform apply. Cuando el sistema lo solicite, introduzcayesy presione Enter. Si aparece el siguiente mensaje, la instancia spot se creó correctamente.Apply complete! Resources: 5 added, 0 changed, 0 destroyed. -
Ejecute
terraform showpara consultar los detalles de los recursos creados.shell@Alicloud: ~ $ terraform show # alicloud_instance.instance: resource "alicloud_instance" "instance" { availability_zone = "cn-beijing-b" cpu = 1 create_time = "2024-11-13T06:52Z" deletion_protection = false dry_run = false enable_jumbo_frame = false expired_time = "2099-12-31T15:59Z" host_name = "xxx" http_put_response_hop_limit = 0 id = "xxx" image_id = "ubuntu_140405_64_40G_xxx" instance_charge_type = "PostPaid" instance_name = "test_fofo" instance_type = "ecs.n2.small" internet_charge_type = "PayByTraffic" internet_max_bandwidth_in = -1 internet_max_bandwidth_out = 10 ipv6_address_count = 0 ipv6_addresses = [] maintenance_action = "AutoRecover" maintenance_notify = false memory = 4096 network_interface_id = "eni-2zehj0xxx" network_interface_traffic_mode = "Standard" os_name = "Ubuntu 14.04 64-bit" os_type = "linux" primary_ip_address = "172.xxx" private_ip = "172.xxx" public_ip = "39.1xxx" queue_pair_number = 0 }
Limpiar los recursos
Para liberar los recursos creados con terraform, ejecute el siguiente comando. Consulte Common Terraform commands.
terraform destroy
Referencias
Para obtener una introducción a terraform, consulte Terraform overview.
Otros métodos
Alibaba Cloud también ofrece Auto Scaling, ACK y grupos de aprovisionamiento automático para crear instancias spot en escenarios más complejos.
Auto Scaling (ESS)
Combina de forma dinámica instancias pay-as-you-go e instancias spot para responder a las fluctuaciones de carga. Además, reemplaza automáticamente las instancias liberadas. Consulte Use spot instances in scaling groups to reduce costs.
ACK
Crea grupos de nodos de Kubernetes de bajo costo para aplicaciones sin estado y tolerantes a fallos. Consulte Best practices for spot instance node pools.
Grupo de aprovisionamiento automático
Aprovisiona clústeres de instancias en varias zonas y con distintos modelos de facturación (pay-as-you-go y spot) mediante una sola configuración. Consulte Auto provisioning group configuration example.