ACS支持創建使用BestEffort算力質量的實例(本文中簡稱為BestEffort QoS類型實例)。對于短時間運行的Job任務,以及部分擴展性和容錯率高的無狀態應用,使用BestEffort QoS類型實例可以有效地節約實例使用成本。本文介紹如何在ACS中創建BestEffort QoS類型實例。
應用場景
BestEffort QoS類型實例最適合應用于無狀態、可彈性伸縮、高度分布式且對實時性無特殊要求的應用場景。例如可彈性伸縮的Web站點服務、圖像渲染、音視頻轉碼、大數據分析和大規模并行計算等。使用BestEffort QoS類型實例可以極大降低計算資源的使用成本。
一般來說,不建議在BestEffort QoS類型實例上運行有狀態應用,因為BestEffort QoS類型實例有較大的性能擾動,且可被搶占和驅逐。但是在一些特殊情況下,如果能夠滿足以下條件,則可以考慮在BestEffort QoS類型實例上運行有狀態應用:
具有快速重啟能力
使用高可用架構
除非滿足上述所有條件,否則仍建議將有狀態應用部署到資源有保證的實例上,以確保數據安全和業務連續性。
前提條件
已創建ACS集群。
創建BestEffort實例
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇
。在無狀態頁面,單擊使用鏡像創建。
在創建頁面依次填寫應用名稱、副本數量、類型、標簽(可選)、注解(可選)。
實例類型選擇通用型,QoS類型選擇best-effort。
后續步驟,請參見創建無狀態工作負載Deployment。
釋放說明
BestEffort QoS類型實例創建成功后,如果遇到資源庫存不足的情況,實例會被回收釋放。您可以通過以下方式了解BestEffort QoS類型實例的釋放情況。
預釋放事件
BestEffort QoS類型實例在釋放前約5分鐘,會觸發KubernetesEvents的BestEffortToBeReleased事件。您可以在日志服務控制臺配置BestEffortToBeReleased事件的監控告警,具體操作請參見創建并使用K8s事件中心。
收到BestEffort實例即將被釋放的事件通知后,您可以充分利用這段時間進行必要的處理,例如檢查可能受影響的業務范圍、遷移重要的工作負載到其他節點等容災和恢復措施來確保業務不受實例釋放所影響。
通過kubectl describe
命令查看Pod詳細信息,在返回信息的Events中可以看到預釋放事件。
kubectl describe pod nginx-best-effort
示例輸出:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning BestEffortToBeReleased 3m32s kubelet Best Effort Instance will be released
通過kubectl get events命令查看事件信息,在返回信息中可以看到預釋放事件。
kubectl get events --field-selector=reason=BestEffortToBeReleased
示例輸出:
LAST SEEN TYPE REASON OBJECT MESSAGE
3m39s Warning BestEffortToBeReleased pod/pi-frmr8 Best Effort Instance will be released
釋放后Pod狀態
BestEffort QoS類型實例釋放后,實例信息仍會保留,狀態變更為Failed,Failed原因為Preempted。
通過kubectl get pod命令查看Pod信息,在返回信息中可以看到Pod狀態已變更。
kubectl get pod nginx-best-effort
示例輸出:
NAME READY STATUS RESTARTS AGE
nginx-best-effort 0/0 Preempted 0 3h5m
通過kubectl describe命令查看Pod詳細信息,在返回信息中可以看到Pod狀態信息。
kubectl describe pod nginx-best-effort
示例輸出:
Status: Failed
Reason: Preempted
Message: The pod is best-effort instance, and have been released at 2024-04-08T12:36Z
最佳實踐
BestEffort算力質量實例為動態庫存,強烈建議您在生產環境配置庫存優先調度策略,在庫存不足時由平臺自動切換至默認型。更多信息,請參見自定義資源調度策略。以下以Job為例,配置庫存優先調度策略。
使用以下內容,創建一個Job。
apiVersion: batch/v1 kind: Job metadata: name: demo-job namespace: default spec: parallelism: 3 template: metadata: labels: app: stress # 關聯ResourcePolicy中spec.selector定義的配置 spec: containers: - name: demo-job image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4 args: - '30s' command: - sleep resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "1" memory: "1Gi" restartPolicy: Never backoffLimit: 4
使用以下內容,創建ResourcePolicy,優先使用best-effort算力質量的實例,庫存不足時則申請default型。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: rp-demo namespace: default spec: # 符合該selector條件的Pod將遵循此調度策略 selector: app: stress # 以下為資源配置,用于描述調度順序 units: - resource: acs # resource類型必須指定為acs podLabels: # 優先申請"general-purpose"+"best-effort"類型的資源 alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: best-effort - resource: acs # 前者庫存不足時,再申請"general-purpose"+"default"類型的資源 podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default