本文分享自华为云社区《CCE云原生混部场景下在线任务抢占、压制离线任务CPU资源、保障在线任务服务质量效果测试》,作者:可以交个朋友。
背景
企业的 IT 环境通常运行两大类进程,一类是在线服务,一类是离线作业。
在线任务:运行时间长,服务流量及资源利用率有潮汐特征,时延敏感,对服务 SLA 要求高,如电商交易服务等。
离线任务:运行时间分区间,运行期间资源利用率较高,时延不敏感,容错率高,中断一般允许重运行,如大数据处理等。
混部主要的形式是通过将在线和离线任务部署在相同节点的方式来提高资源利用率,比如某节点之前部署 3 个高服务 SLA 的在线任务,现在混合部署 3 个在线任务和 3 个离线任务,离线服务把在线服务各个时段的空闲资源利用起来而不影响在线服务的服务质量。
在容器混部层面主要涉及: 1)调度层面实现节点调度资源超分,在、离线任务混合调度到相同节点; 2)CPU 层面实现在线任务抢占、压制离线任务;3)内存层面本文不做介绍。通过混部技术 CPU 部分能力,可以实现在运行过程中,系统会根据在、离线任务资源使用情况,自动完成在线“抢占”、“压制”离线任务资源以保障在线资源的资源诉求。以一台 4 核机器为例:
环境准备
环境要求
集群版本:
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 使用率
在 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 使用率
在 grafana 页面观察 redis 指标和 cpu 使用率,在混合场景下,即使离线任务在尝试打爆节点 CPU,操作系统依然维持在线任务 CPU 诉求,保障了在线任务的服务质量
点击关注,第一时间了解华为云新鲜技术~
评论