使用抢占式ECI实例运行Job任务

ECI支持抢占式实例,对于短时间运行的Job任务,以及部分扩展性和容错率高的无状态应用(例如可弹性伸缩的Web站点服务),使用抢占式实例可以有效地节约实例使用成本。本文以Job任务为例,演示如何创建抢占式实例类型的ECI Pod来运行Job任务。

背景信息

使用抢占式实例前,请了解以下相关信息:

  • 计费方式

    抢占式实例的市场价格随供需变化而浮动,您需要在创建抢占式实例时指定出价模式,当指定实例规格的实时市场价格低于出价且库存充足时,就能成功创建抢占式实例。创建成功后,在保护期(默认1小时)内按照成交时的市场价格计费。超过保护期后,按照实时的市场价格计费。

  • 回收机制

    超过保护期后,系统每隔5分钟将自动检测一次实例规格的市场价格和库存。如果某一时刻的市场价格高于出价或实例规格库存不足,抢占式实例会被释放。在释放前约5分钟,ECI会通过Kubernetes Events事件通知的方式告知您。在此期间,您可以做一定的处理来确保业务不受实例释放所影响(如切断该实例的业务入口流量)。

  • 创建方式

    支持指定ECS规格,或者指定vCPU和内存来创建抢占式ECI实例。

  • 配置方法

    您可以在Pod metadata中添加k8s.aliyun.com/eci-spot-strategy的Annotation来创建抢占式实例。该Annotation用于设置抢占式实例的出价策略,

    取值如下:

    • SpotAsPriceGo:系统自动出价,跟随当前市场实际价格。

    • SpotWithPriceLimit:自定义设置抢占实例价格上限。如果选择该策略,需添加k8s.aliyun.com/eci-spot-price-limit的Annotation来设置抢占式实例的每小时价格上限。

更多信息,请参见创建抢占式实例

操作步骤

在Kubernetes中,Job负责批量处理短暂的一次性任务。使用抢占式实例运行Job任务的配置示例如下:

  1. 准备Job的配置文件,命名为spot_job.yaml。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        metadata:
          annotations:
            k8s.aliyun.com/eci-use-specs: ecs.c5.large,2-4Gi # 指定多个规格,提升实例创建成功率
            k8s.aliyun.com/eci-spot-strategy: SpotAsPriceGo    # 系统自动出价,跟随当前市场实际价格
        spec:
          containers:
          - name: pi
            image: registry-vpc.cn-beijing.aliyuncs.com/ostest/perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
  2. 创建Job。

    kubectl create -f spot_job.yaml
  3. 查看Pod运行情况。

    kubectl get pod
    • 如果Job任务正在运行,对应Pod状态为Running。

      NAME       READY   STATUS      RESTARTS   AGE
      pi-frmr8   1/1     Running     0          35s
    • 如果Job任务正常运行完成,对应Pod状态会变更为Completed。

      NAME       READY   STATUS      RESTARTS   AGE
      pi-frmr8   0/1     Completed   0          2h
    • 如果Job任务还未运行完成,对应Pod由于抢占式实例的回收机制被释放了,Kubernetes中的Job Controller会自动创建新的Pod来继续运行任务。

      此时仍会保留旧的Pod,该Pod状态会变更为BidFailed。

      说明

      抢占式实例创建成功后,在保护期内可以正常运行。超出保护期后,如果市场价格高于出价或者资源库存不足,抢占式实例会被释放。抢占式实例在释放前约5分钟,会产生预释放事件(SpotToBeReleased),您可以查看事件信息获取。更多信息,请参见释放说明

      NAME       READY   STATUS      RESTARTS   AGE
      pi-frmr8   1/1     BidFailed   0          4h53m
      pi-kp5zx   1/1     Running     0          3h45m