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

本文分享自華爲雲社區《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

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章