写点什么

CCE 云原生混部场景下的测试案例

  • 2024-05-07
    福建
  • 本文字数:3253 字

    阅读完需:约 11 分钟

背景


企业的 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
复制代码


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



文章转载自:华为云开发者联盟

原文链接:https://www.cnblogs.com/huaweiyun/p/18176460

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
CCE云原生混部场景下的测试案例_云原生_不在线第一只蜗牛_InfoQ写作社区