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插件

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

使用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诉求,保障了在线任务的服务质量

点击关注,第一时间了解华为云新鲜技术~

相关推荐
华为云开发者联盟2 个月前
最佳实践:解读GaussDB(DWS) 统计信息自动收集方案
大数据·华为云开发者联盟·gaussdb(dws)·gaussdb(dws)·实时查询·统计信息
华为云开发者联盟2 个月前
深度解读KubeEdge架构设计与边缘AI实践探索
ai·边缘计算·kubeedge·华为云开发者联盟·sedna
华为云开发者联盟2 个月前
仓颉编程语言技术指南:嵌套函数、Lambda 表达式、闭包
鸿蒙·编程语言·华为云开发者联盟·仓颉
华为云开发者联盟2 个月前
深度解读GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略
mysql·华为云开发者联盟
华为云开发者联盟2 个月前
Kmesh v0.4发布!迈向大规模 Sidecarless 服务网格
容器·华为云开发者联盟
华为云开发者联盟3 个月前
解读GaussDB(for MySQL)灵活多维的二级分区表策略
mysql·华为云开发者联盟
华为云开发者联盟3 个月前
从基础到高级应用,详解用Python实现容器化和微服务架构
python·docker·微服务·容器·华为云开发者联盟
华为云开发者联盟3 个月前
基于MindSpore实现BERT对话情绪识别
昇腾·华为云开发者联盟
华为云开发者联盟3 个月前
解读MySQL 8.0数据字典缓存管理机制
mysql·缓存·数据字典·元数据·华为云开发者联盟
华为云开发者联盟3 个月前
深度解读昇腾CANN模型下沉技术,提升模型调度性能
大模型·昇腾·cann·华为云开发者联盟