ECI支援搶佔式執行個體,對於短時間啟動並執行Job任務,以及部分擴充性和容錯率高的無狀態應用(例如可Auto Scaling的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