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


    背景

    企业的 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正常显示)

    1. kind: Deployment
    2. apiVersion: apps/v1
    3. metadata:
    4. name: redis
    5. spec:
    6. replicas: 1
    7. selector:
    8. matchLabels:
    9. app: redis
    10. template:
    11. metadata:
    12. creationTimestamp: null
    13. labels:
    14. app: redis
    15. annotations:
    16. prometheus.io/path: /metrics
    17. prometheus.io/port: '9121'
    18. prometheus.io/scrape: 'true'
    19. spec:
    20. containers:
    21. - name: container-1
    22. image: swr.cn-north-4.myhuaweicloud.com/testapp/redis:v6
    23. resources:
    24. limits:
    25. cpu: '1'
    26. requests:
    27. cpu: 250m
    28. - name: container-2
    29. image: bitnami/redis-exporter:latest
    30. resources:
    31. limits:
    32. cpu: 250m
    33. memory: 512Mi
    34. requests:
    35. cpu: 250m
    36. memory: 512Mi
    37. imagePullSecrets:
    38. - name: default-secret
    39. schedulerName: volcano
    40. ---
    41. kind: Deployment
    42. apiVersion: apps/v1
    43. metadata:
    44. name: stress
    45. spec:
    46. replicas: 1
    47. selector:
    48. matchLabels:
    49. app: stress
    50. template:
    51. metadata:
    52. labels:
    53. app: stress
    54. spec:
    55. containers:
    56. - name: container-1
    57. image: swr.cn-north-4.myhuaweicloud.com/testapp/centos-stress:v1
    58. command:
    59. - /bin/bash
    60. args:
    61. - '-c'
    62. - while true; do echo hello; sleep 10; done
    63. resources:
    64. limits:
    65. cpu: '4'
    66. memory: 4Gi
    67. requests:
    68. cpu: 2500m
    69. memory: 1Gi
    70. imagePullSecrets:
    71. - name: default-secret
    72. schedulerName: volcano
    73. affinity:
    74. podAffinity:
    75. requiredDuringSchedulingIgnoredDuringExecution:
    76. - labelSelector:
    77. matchExpressions:
    78. - key: app
    79. operator: In
    80. values:
    81. - redis
    82. namespaces:
    83. - default
    84. 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

    修改stress工作负载的注解,将stress标记为离线业务,redis工作负载不用修改

    1. kind: Deployment
    2. apiVersion: apps/v1
    3. metadata:
    4. name: stress
    5. spec:
    6. replicas: 1
    7. selector:
    8. matchLabels:
    9. app: stress
    10. template:
    11. metadata:
    12. labels:
    13. app: stress
    14. annotations:
    15. volcano.sh/qos-level: "-1" # 离线作业注解
    16. spec:
    17. containers:
    18. - name: container-1
    19. image: swr.cn-north-4.myhuaweicloud.com/testapp/centos-stress:v1
    20. command:
    21. - /bin/bash
    22. args:
    23. - '-c'
    24. - while true; do echo hello; sleep 10; done
    25. resources:
    26. limits:
    27. cpu: '4'
    28. memory: 4Gi
    29. requests:
    30. cpu: 2500m
    31. memory: 1Gi
    32. imagePullSecrets:
    33. - name: default-secret
    34. schedulerName: volcano
    35. affinity:
    36. podAffinity:
    37. requiredDuringSchedulingIgnoredDuringExecution:
    38. - labelSelector:
    39. matchExpressions:
    40. - key: app
    41. operator: In
    42. values:
    43. - redis
    44. namespaces:
    45. - default
    46. 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

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

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

    体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

  • 相关阅读:
    [量化投资-学习笔记016]Python+TDengine从零开始搭建量化分析平台-日志输出
    Kafka如何处理消费者之间的消息偏斜和负载均衡问题
    JDK1.8中的Stream流源码中的常用方法全面解析附代码演示及源码展示
    如何使用Tushare+ Backtrader进行股票量化策略回测
    Swift 周报 第十六期
    python--数据容器--set(集合)
    http状态,cookie、session、token的对比
    微服务保护--Sentinel
    python面向对象(上)
    XCode 去除 UserInterfaceState.xcuserstate 文件困扰
  • 原文地址:https://blog.csdn.net/dsgdauigfs/article/details/138531602