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任务的配置示例如下:
准备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
创建Job。
kubectl create -f spot_job.yaml
查看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