本文分享自華為雲社群《CCE雲原生混部場景下線上任務搶佔、壓制離線任務CPU資源、保障線上任務服務質量效果測試》,作者:可以交個朋友。
背景
企業的 IT 環境通常執行兩大類程序,一類是線上服務,一類是離線作業。
線上任務:執行時間長,服務流量及資源利用率有潮汐特徵,時延敏感,對服務SLA 要求高,如電商交易服務等。
離線任務:執行時間分割槽間,執行期間資源利用率較高,時延不敏感,容錯率高,中斷一般允許重執行,如大資料處理等。
混部主要的形式是透過將線上和離線任務部署在相同節點的方式來提高資源利用率,比如某節點之前部署3個高服務SLA的線上任務,現在混合部署3個線上任務和3個離線任務,離線服務把線上服務各個時段的空閒資源利用起來而不影響線上服務的服務質量。
在容器混部層面主要涉及: 1)排程層面實現節點排程資源超分,在、離線任務混合排程到相同節點; 2)CPU層面實現線上任務搶佔、壓制離線任務;3)記憶體層面本文不做介紹。透過混部技術CPU部分能力,可以實現在執行過程中,系統會根據在、離線任務資源使用情況,自動完成線上“搶佔”、“壓制”離線任務資源以保障線上資源的資源訴求。以一臺4核機器為例:
- 當線上任務需要3核CPU資源,那麼需要系統“壓制”離線任務最多隻能使用1核CPU資源;
- 線上任務當時處於業務低峰,僅使用1核CPU資源,離線任務可以短期使用剩餘CPU資源;當線上任務業務上漲時,系統保障線上業務可以“搶佔”離線業務CPU資源;
環境準備
環境要求
叢集版本:
- v1.19叢集:v1.19.16-r4及以上版本
- v1.21叢集:v1.21.7-r0及以上版本
- v1.23叢集:v1.23.5-r0及以上版本
- v1.25及以上版本
叢集型別:CCE Standard叢集或CCE Turbo叢集。
節點OS:EulerOS 2.9 (核心kernel-4.18.0-147.5.1.6.h729.6.eulerosv2r9.x86_64)或者Huawei Cloud EulerOS 2.0
節點型別:彈性虛擬機器。
Volcano外掛版本:1.7.0及以上版本。
環境資訊
CCE叢集部署kube-prometheus-stack、grafana和volcano外掛
CPU壓制、搶佔演示
壓測基線
建立演示需要的工作負載,且保證兩個工作負載排程至同一節點(由於dashboard中普羅表示式與pod名稱關聯,建議不要工作負載名稱,否則影響dashboard正常顯示)
kind: Deployment apiVersion: apps/v1 metadata: name: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: creationTimestamp: null labels: app: redis annotations: prometheus.io/path: /metrics prometheus.io/port: '9121' prometheus.io/scrape: 'true' spec: containers: - name: container-1 image: swr.cn-north-4.myhuaweicloud.com/testapp/redis:v6 resources: limits: cpu: '1' requests: cpu: 250m - name: container-2 image: bitnami/redis-exporter:latest resources: limits: cpu: 250m memory: 512Mi requests: cpu: 250m memory: 512Mi imagePullSecrets: - name: default-secret schedulerName: volcano --- kind: Deployment apiVersion: apps/v1 metadata: name: stress spec: replicas: 1 selector: matchLabels: app: stress template: metadata: labels: app: stress spec: containers: - name: container-1 image: swr.cn-north-4.myhuaweicloud.com/testapp/centos-stress:v1 command: - /bin/bash args: - '-c' - while true; do echo hello; sleep 10; done resources: limits: cpu: '4' memory: 4Gi requests: cpu: 2500m memory: 1Gi imagePullSecrets: - name: default-secret schedulerName: volcano affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - redis namespaces: - default topologyKey: kubernetes.io/hostname
使用redis-benchmark命令壓測redis;192.168.1.159
為redis的Pod ip
./redis-benchmark -h 192.168.1.159 -p 6379 -n 3000000 -c 100 –q -t SET,INCR,LPUSH,LPOP,RPOP,SADD,HSET,SPOP,ZADD,ZPOPMIN
在grafana頁面觀察redis指標和cpu使用率,可以作為在無干擾情況下的基線參考資料
非混部場景
建立節點池用作混合部署,同時重新部署以上工作負載,使其排程至新節點
再次使用redis-benchmark命令壓測redis;192.168.1.172
為redis的Pod ip
./redis-benchmark -h 192.168.1.172 -p 6379 -n 3000000 -c 100 –q -t SET,INCR,LPUSH,LPOP,RPOP,SADD,HSET,SPOP,ZADD,ZPOPMIN
進入stress容器內,待redis指標達到基線且平穩後,執行命令提升CPU使用率
stress-ng -c 4 -t 3600
在grafana頁面觀察redis指標和cpu使用率,發現stress容器壓測過程中,redis的效能資料急速退化
混部場景
更新節點池,在高階配置中為節點配置混部標籤:volcano.sh/colocation="true"
點選節點池的配置管理-kubelet元件配置-開啟節點混部特性
修改節點的驅逐閾值,將閾值修改為100,避免在壓測stress時cpu使用率超過閾值被直接驅逐
kubectl annotate node 192.168.0.209 volcano.sh/evicting-cpu-high-watermark=100
修改stress工作負載的註解,將stress標記為離線業務,redis工作負載不用修改
kind: Deployment apiVersion: apps/v1 metadata: name: stress spec: replicas: 1 selector: matchLabels: app: stress template: metadata: labels: app: stress annotations: volcano.sh/qos-level: "-1" # 離線作業註解 spec: containers: - name: container-1 image: swr.cn-north-4.myhuaweicloud.com/testapp/centos-stress:v1 command: - /bin/bash args: - '-c' - while true; do echo hello; sleep 10; done resources: limits: cpu: '4' memory: 4Gi requests: cpu: 2500m memory: 1Gi imagePullSecrets: - name: default-secret schedulerName: volcano affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - redis namespaces: - default topologyKey: kubernetes.io/hostname
192.168.1.172
為redis的Pod ip
./redis-benchmark -h 192.168.1.172 -p 6379 -n 3000000 -c 100 –q -t SET,INCR,LPUSH,LPOP,RPOP,SADD,HSET,SPOP,ZADD,ZPOPMIN
stress-ng -c 4 -t 3600
在grafana頁面觀察redis指標和cpu使用率,在混合場景下,即使離線任務在嘗試打爆節點CPU,作業系統依然維持線上任務CPU訴求,保障了線上任務的服務質量
點選關注,第一時間瞭解華為雲新鮮技術~