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

CCE云原生混部场景下的测试案例的更多相关文章
- redis使用场景和java测试案例
redis数据结构和使用场景 strings lists sets sort sets hashes strings token session validateCode 分布锁 lists 最近联系 ...
- 混部之殇-论云原生资源隔离技术之CPU隔离(一)
作者 蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 混部,通常指在离线混部(也有离在线混部之说 ...
- 【云原生下离在线混部实践系列】深入浅出 Google Borg
Google Borg 是资源调度管理和离在线混部领域的鼻祖,同时也是 Kubernetes 的起源与参照,已成为从业人员首要学习的典范.本文尝试管中窥豹,简单从<Large-scale clu ...
- Volcano:在离线作业混部管理平台,实现智能资源管理和作业调度
摘要:本文结合华为CCE团队在混合部署方面的研究和实战,介绍了混合部署的背景.概念.混部技术的设计方案和实际落地情况,以及对未来的计划和展望. 现代互联网数据中心的规模随着应用服务需求的快速增长而不断 ...
- Serverless 如何应对 K8s 在离线场景下的资源供给诉求
本文整理自腾讯云云原生产品团队的专家产品经理韩沛在 Techo 开发者大会云原生专题的分享内容--Kubernetes 混部与弹性容器.本次分享主要分为三部分:基于 K8s 的应用混部.提升应用混部效 ...
- 腾讯TencentOS 十年云原生的迭代演进之路
导语 TencentOS Server (又名 Tencent Linux 简称 Tlinux) 是腾讯针对云的场景研发的 Linux 操作系统,提供了专门的功能特性和性能优化,为云服务器实例中的应用 ...
- TKE 注册节点,IDC 轻量云原生上云的最佳路径
林顺利,腾讯云原生产品经理,负责分布式云产品迭代和注册节点客户扩展,专注于云原生混合云新形态的推广实践. 背景 企业在持续业务运维过程中,感受到腾讯云 TKE 带来的便捷性和极致的使用体验,将新业务的 ...
- Getting Started and Beyond|云原生应用负载均衡选型指南
作者 冉昕,腾讯云服务网格TCM产品经理,现负责云原生流量接入网关与应用通信可观测性等产品特性策划与设计工作. 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理 ...
- 【视频】k8s套娃开发调试dapr应用 - 在6月11日【开源云原生开发者日】上的演示
这篇博客是在2022年6月11日的[开源云原生]大会上的演讲中的演示部分.k8s集群套娃(嵌套)是指在一个k8s的pod中运行另外一个k8s集群,这想法看上去很疯狂,实际上非常实用. k8s集群套娃( ...
- 灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟? 历史进入2019年,放眼望去,今天的整个技术大环境和生态都发生了很大的变化.在己亥猪年春节刚刚过去的早春时节,我们来梳理和展望一下整个 ...
随机推荐
- Spring框架之IoC( Inversion of Control )基础知识入门
1.IoC创建对象的方式 使用无参构造创建对象 假如要使用有参构造创建: 下标赋值constructor-arg <!--有参--> <bean id="User" ...
- 突然连不上Github或者连接超时的解决办法
问题描述当进行仓库pull或者push时,报错如下(连接失败/被拒绝/超时等): Failed to connect to github.com port 443: Connection refuse ...
- System.gc 之后到底发生了什么 ?
本文基于 OpenJDK17 进行讨论 在 JDK NIO 针对堆外内存的分配场景中,我们经常会看到 System.gc 的身影,比如当我们通过 FileChannel#map 对文件进行内存映射的时 ...
- #Manacher,并查集#洛谷 3279 [SCOI2013]密码
题目 分析 这些回文长度可以提供相等或者不等的信息, 不等的直接连边强制不等,相等用并查集合并连通块, 但是这样判断是\(O(n^2)\),考虑这些回文长度当用Manacher求时, 所有的回文长度都 ...
- 深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏
Java 修饰符 Java 修饰符 用于控制类.属性.方法和构造函数的访问权限和行为.它们可以分为两组: 访问修饰符: public: 意味着代码对所有类可访问. private: 意味着代码只能在声 ...
- 4. Orthogonality
4.1 Orthogonal Vectors and Suspaces Orthogonal vectors have \(v^Tw=0\),and \(||v||^2 + ||w||^2 = ||v ...
- MogDB学习笔记之 -- 了解pagewriter线程
MogDB 学习笔记之 -- 了解 pagewriter 线程 本文出处:https://www.modb.pro/db/183172 在前面的 MogDB 学习系列中,我们了解了核心的 bgwrit ...
- 限时招募高校学生,带你沉浸式体验HDC.Together 2023
- Tailwind CSS 使用指南
0x01 概述 (1)简介 Tailwind CSS 官网:https://www.tailwindcss.cn/ Tailwind CSS 是一个 CSS 框架,使用初级"工具" ...
- Avalonia 中的样式和控件主题
在 Avalonia 中,样式是定义控件外观的一种方式,而控件主题则是一组样式和资源,用于定义应用程序的整体外观和感觉.本文将深入探讨这些概念,并提供示例代码以帮助您更好地理解它们. 样式是什么? 样 ...