CCE雲原生混部場景下的測試案例

华为云开发者联盟發表於2024-05-07

本文分享自華為雲社群《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外掛

image.png

image.png

image.png

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使用率,可以作為在無干擾情況下的基線參考資料

image.png

非混部場景

建立節點池用作混合部署,同時重新部署以上工作負載,使其排程至新節點

再次使用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的效能資料急速退化

image.png

混部場景

更新節點池,在高階配置中為節點配置混部標籤:volcano.sh/colocation="true"

image.png

點選節點池的配置管理-kubelet元件配置-開啟節點混部特性

image.png

修改節點的驅逐閾值,將閾值修改為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
使用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使用率,在混合場景下,即使離線任務在嘗試打爆節點CPU,作業系統依然維持線上任務CPU訴求,保障了線上任務的服務質量

image.png

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章