首页 > 其他分享 >crane-scheduler基于真实负载进行k8s调度

crane-scheduler基于真实负载进行k8s调度

时间:2023-07-18 16:58:01浏览次数:38  
标签:avg mem 5m scheduler usage crane k8s cpu

介绍

kubernetes 的原生调度器只能通过资源请求来调度 pod,这很容易造成一系列负载不均的问题:

  • 对于某些节点,实际负载与资源请求相差不大,这会导致很大概率出现稳定性问题。
  • 对于其他节点来说,实际负载远小于资源请求,这将导致资源的巨大浪费。
    为了解决这些问题,动态调度器根据实际的节点利用率构建了一个简单但高效的模型,并过滤掉那些负载高的节点来平衡集群。

架构

如上图,动态调度器依赖于Prometheus和Node-exporter收集和汇总指标数据,它由两个组件组成:
Node-annotator 目前是 Crane-scheduler-controller的一个模块。

  • Node-annotator定期从 Prometheus 拉取数据,并以注释的形式在节点上用时间戳标记它们。
  • Dynamic plugin直接从节点的注释中读取负载数据,过滤并基于简单的算法对候选节点进行评分。

调度策略

动态调度器提供了一个默认值调度策略并支持用户自定义策略。默认策略依赖于以下指标:

  • cpu_usage_avg_5m
  • cpu_usage_max_avg_1h
  • cpu_usage_max_avg_1d
  • mem_usage_avg_5m
  • mem_usage_max_avg_1h
  • mem_usage_max_avg_1d
    在调度的Filter阶段,如果该节点的实际使用率大于上述任一指标的阈值,则该节点将被过滤。而在Score阶段,最终得分是这些指标值的加权和。

Hot Value

在生产集群中,可能会频繁出现调度热点,因为创建 Pod 后节点的负载不能立即增加。因此,我们定义了一个额外的指标,名为Hot Value,表示节点最近几次的调度频率。并且节点的最终优先级是最终得分减去Hot Value。

安装 Prometheus

确保你的 Kubernetes 集群已安装 Prometheus。如果没有,请参考Install Prometheus。
配置 Prometheus 规则
配置 Prometheus 的规则以获取预期的聚合数据:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:    
  name: example-record
  spec:    
    groups:
    - name: cpu_mem_usage_active
        interval: 30s
        rules:
        - record: cpu_usage_active
        expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[30s])) * 100)
        - record: mem_usage_active
        expr: 100*(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)
    - name: cpu-usage-5m
        interval: 5m
        rules:
        - record: cpu_usage_max_avg_1h
        expr: max_over_time(cpu_usage_avg_5m[1h])
        - record: cpu_usage_max_avg_1d
        expr: max_over_time(cpu_usage_avg_5m[1d])
    - name: cpu-usage-1m
        interval: 1m
        rules:
        - record: cpu_usage_avg_5m
        expr: avg_over_time(cpu_usage_active[5m])
    - name: mem-usage-5m
        interval: 5m
        rules:
        - record: mem_usage_max_avg_1h
        expr: max_over_time(mem_usage_avg_5m[1h])
        - record: mem_usage_max_avg_1d
        expr: max_over_time(mem_usage_avg_5m[1d])
    - name: mem-usage-1m
        interval: 1m
        rules:
        - record: mem_usage_avg_5m
        expr: avg_over_time(mem_usage_active[5m])

Prometheus 的采样间隔必须小于30秒,不然可能会导致规则无法正常生效。如:cpu_usage_active

安装 Crane-scheduler

安装 Crane-scheduler 作为第二个调度器

kubectl apply -f https://finops.coding.net/p/gocrane/d/crane-scheduler/git/raw/main/deploy/controller/rbac.yaml?download=false  
kubectl apply -f https://finops.coding.net/p/gocrane/d/crane-scheduler/git/raw/main/deploy/controller/deployment.yaml?download=false 

使用Crane-scheduler 调度 Pod

使用以下示例测试 Crane-scheduler:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cpu-stress
spec:
  selector:
    matchLabels:
      app: cpu-stress
  replicas: 1
  template:
    metadata:
      labels:
        app: cpu-stress
    spec:
      schedulerName: crane-scheduler
      hostNetwork: true
      tolerations:
      - key: node.kubernetes.io/network-unavailable
        operator: Exists
        effect: NoSchedule
      containers:
      - name: stress
        image: docker.io/gocrane/stress:latest
        command: ["stress", "-c", "1"]
        resources:
          requests:
            memory: "1Gi"
            cpu: "1"
          limits:
            memory: "1Gi"
            cpu: "1"

如果想将crane-scheduler用作默认调度器,请将crane-scheduler更改为default-scheduler(即在yaml中更改默认default-scheduler这一字段)。
如果测试 pod 调度成功,将会有以下事件:

Type    Reason     Age   From             Message
----    ------     ----  ----             -------
Normal  Scheduled  28s   crane-scheduler  Successfully assigned
 default/cpu-stress-7669499b57-zmrgb to vm-162-247-ubuntu
K8S版本1.18-1.22请修改configmap和镜像版本
KUBE_EDITOR="sed -i 's/v1beta2/v1beta1/g'" 
kubectl edit cm scheduler-config -n crane-system && KUBE_EDITOR="sed -i 's/0.0.23/0.0.20/g'" 
kubectl edit deploy crane-scheduler -n crane-system

案例分享

Crane-scheduler目前有众多公有云用户,包括斗鱼直播、酷狗、一汽大众、猎豹移动等公司均在使用,并给予了产品不错的反馈。
这里我们先分享一个某公有云用户的真实案例。该客户集群中的业务大多是内存消耗型的,因此极易出现内存利用率很高的节点,并且各个节点的内存利用率分布也很不平均,如下图所示:

了解到用户的情况后,我们推荐其使用 Crane-scheduler,组件运行一段时间后,该用户集群内各节点的内存利用率数据分布发生了显著变化,如下图 :

可见,用户集群的内存使用率更加趋于均衡。
另外, Crane-scheduler 也在公司内部各个 BG 的自研上云环境中,也得到了广泛的使用。下面是内部自研上云平台 TKEx-CSIG 的两个生产集群的 CPU 使用率分布情况,其中集群 A 未部署 Crane-scheduler:

集群 B 部署了组件并运行过一段时间:

很明显,在集群 B 中,节点 CPU 使用率分布在两端( < 10% 与 > 80%)所占的比例,要显著小于集群 A,并且整体分布也更加紧凑,相对而言更加均衡与健康。

标签:avg,mem,5m,scheduler,usage,crane,k8s,cpu
From: https://www.cnblogs.com/even160941/p/17563424.html

相关文章

  • k8s中,secret中有多条数据,如何将某条数据挂载为一个单独的文件?
    secrete中,包含以下两条数据db-password,原内容是123456db-username,原内容是:admin 这里都是base64编码的结果。 在pod中,volumemounts中,subPath指定某个数据项的key值mountPath:为具体的某个文件的名字这样挂载之后,就是具体的文件了,文件的内容,就是key对应的值。......
  • kubeasz K8S测试环境删除多余 node 节点
    kubeaszK8S测试环境删除多余node节点背景:公司之前存在3套test环境,有1套环境部署的生产环境老系统,目前生产环境已经完成了新老系统切换,不在需要老系统test环境,需要进行回收1|查看节点列表使用kubectl命令来查看当前集群中的节点列表,以确认要删除的节点的名称。kub......
  • 【Azure K8S】记录AKS VMSS实例日志收集方式
    问题描述如何从AKS的VMSS集群中收集实例日志? 参考步骤第一步:登陆VMSS实例参考官网步骤:使用SSH连接到AzureKubernetes服务(AKS)群集节点以进行维护或故障排除: https://docs.azure.cn/zh-cn/aks/ssh#configure-virtual-machine-scale-set-based-aks-clusters-for-ssh......
  • 下载k8s源码
    设置GOPATH环境变量goenv-wGO111MODULE=autocd$GOPATHmkdir-psrc/k8s.iocdsrc/k8s.iogitclonehttps://github.com/kubernetes/kubernetes.gitcdkubernetesgitcheckoutrelease-1.15设置GolandFile->Settings->GO->GOPATH勾选UseGOPATHthat's......
  • Loki+Promtail+Grafana 监控 K8s 日志
    Loki架构:1、loki:服务端,负责存储日志和处理查询2、promtail:采集端,负责采集日志发送给loki3、grafana:负责采集日志的展示创建yml文件cat>loki-rbac.yaml<<EOFapiVersion:v1kind:ServiceAccountmetadata:name:lokinamespace:thanos-monitoringapiVersion:rbac......
  • 裸机安装k8s
    环境准备节点数量:3台虚拟机centos7(virtualbox)硬件配置:2G或更多的RAM,2个CPU或更多的CPU,硬盘至少30G以上网络要求:多个节点之间网络互通,每个节点能访问外网集群规划k8s-node1:192.168.33.10k8s-node2:192.168.33.11k8s-node3:192.168.33.12设置主机名$hostnamec......
  • K8s - 什么是 Ingress 服务
    什么是Ingress?Ingress将HTTP和HTTPS路由从集群外部公开到集群内的服务。流量路由由入口资源上定义的规则控制。应用举例服务现状:一个订单服务,一个用户服务,彼此间相互独立。流量转发所遇到的问题:经过Ingress转发:思考:Ingress与Nginx的区别问题:如果不用ingres......
  • 用户案例 | Apache DolphinScheduler 离线调度在自如多业务场景下的应用与实践
    用户案例|自如随着自如业务的快速发展,不断增长的调度任务和历史逾万的存量任务对平台稳定性提出了更高的要求。同时,众多非专业开发人员也需要一种更为“亲民”的调度平台使用体验。如何满足这些日渐凸显的需求对自如大数据平台的开发团队来说,无疑是巨大的挑战。团队经过深入......
  • k8s安装并迁移jumpserver
    一、环境二、安装依赖服务以下操作按需操作1.安装Helmwgethttps://get.helm.sh/helm-v3.12.1-linux-amd64.tar.gztarxfhelm-v3.12.1-linux-amd64.tar.gzmvlinux-amd64/helm/usr/local/bin/helmversionhelmrepoaddjumpserverhttps://jumpserver.github.io/he......
  • k8s集群卸载
    k8s集群卸载#重置kubeadmkubeadmresetrm-rf$HOME/kuberm-rf/etc/kubernetes/rm-rf/etc/systemd/system/kubelet.service.drm-rf/etc/systemd/systemrm-rf/etc/systemd/system/kubelet.servcerm-rf/usr/bin/kube*rm-rf/etc/cnirm-rf/opt/cnirm-rf/......