前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8s 负载感知调度实践(koordinator & crane)

K8s 负载感知调度实践(koordinator & crane)

作者头像
SRE运维进阶之路
发布2024-10-25 13:20:18
1580
发布2024-10-25 13:20:18
举报
文章被收录于专栏:SRE运维进阶之路

上篇 6 张图带你深入了解 kube-scheduler ,已经知道 kube-scheduler 的工作流程,以及如何实现自定义插件。koordinator 和 crane 都是基于Scheduler Framework 进行实现的 负载感知插件。本文不再赘述,感兴趣可以看上篇文章。

背景

原生 Kubernetes 调度器仅基于资源的 Request 进行调度,在生产环境资源的真实使用率和申请率往往相差巨大,造成资源浪费的同时也会造成节点的负载不均衡

开源方案对比 koordinator VS crane

crane-scheduler 架构

前置条件是安装了 Prometheus , 从 Prometheus 中获取数据。

koord-scheduler 架构

监控指标是从 koordlet 中获取, koordlet 是一个 daemonset 类型的插件,负责收集指标,并存储在本地 Prometheus 中

对比

crane-scheduler

koord-scheduler

指标收集周期

依赖于外置 Prometheus 的收集周期,默认为 30s (颗粒度较粗,不容易收集到突刺)

ds 方式 的 koordlet 插件收集, 相当于每个 Node 节点都有一个 Prometheus, 收集周期默认为 1s

数值类型

avg 、max

avg、p50、p90、p95、p99

在离线混部

不支持

支持在线 Pod(LSE/LSR/LS)和离线 Pod(BE)

hotValue 资源预估

支持

支持

使用率 分母

宿主机 Total 资源(不合理)

Node allocatable (合理)

综上,选用 koord-scheduler 。

koordinator 使用实践

新增 UsageAggregatedDuration 为 18h 的时间段

代码语言:javascript
复制
kubectl -n koordinator-system edit  cm slo-controller-config
代码语言:javascript
复制
data:
  colocation-config: |
    {
      "enable": true,
      "metricAggregatePolicy": {
        "durations": [
          "5m",
          "10m",
          "30m",
          "18h"
        ]
      }
    }

修改 koordlet 中 Prometheus 的存储时间

代码语言:javascript
复制
kubectl -n koordinator-system edit ds koordlet
代码语言:javascript
复制
      containers:
      - args:
        - -addr=:9316
        - -cgroup-root-dir=/host-cgroup/
        - --logtostderr=true
        - --tsdb-retention-duration=18h

可以使用promtool 工具进入 Pod 查看数据:./promtool tsdb list /metric-data/

修改 阈值 触发规则, 需要重启 koord-scheduler 才生效。

代码语言:javascript
复制
kubectl -n koordinator-system edit cm  koord-scheduler-config
代码语言:javascript
复制
            aggregated:
              usageThresholds:
                cpu: 55
                memory: 85
              usageAggregationType: "p99"
              scoreAggregationType: "p99"
            estimatedScalingFactors:
              cpu: 85
              memory: 70
代码语言:javascript
复制
kubectl -n koordinator-system rollout restart deployment koord-scheduler

考虑到 公有云资源 可能有自己的 调度实现, 所以只改 IDC 机房的调度器,增加 mutatingwebhook 进行拦截修改,有问题可以快速回退。

生效方式:

代码语言:javascript
复制
kubectl label ns ${NsName} koordinator-injection=enabled

回退方式:

代码语言:javascript
复制
kubectl label ns ${NsName} koordinator-injection-

源代码地址:https://github.com/koordinator-sh/koordinator

魔改代码地址:https://github.com/clay-wangzhi/koordinator

魔改代码 快速部署:

代码语言:javascript
复制
git clone https://github.com/clay-wangzhi/koordinator
cd koordinator/manifests
kubectl apply -f setup/
kubectl apply -f koordlet/
kubectl apply -f koord-scheduler/
kubectl apply -f koord-manager/

测试

1) 找出 负载较高的 Node

代码语言:javascript
复制
kubectl top node | sort -nk 3
kubectl get nodemetrics.slo.koordinator.sh

2) 给一个 负载较高的 Node + 几个 负载正常的 Node 打标签

代码语言:javascript
复制
kubectl label node $(NodeName) test=true

3)找到应用所在 Ns,打标,设置 SchedulerName 为 koord-scheduler 是通过 mutatingwebhook 实现的

代码语言:javascript
复制
kubectl label ns ${NsName} koordinator-injection=enabled

4)找一个应用,加上节点亲和性 和 Pod 反亲和性, 并把副本数 设置为 和 打标的 Node 数 相等

代码语言:javascript
复制
spec:
  replicas: 4
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: test
                operator: In
                values:
                - "true"
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: appid
                operator: In
                values:
                - $(AppidName)
            topologyKey: kubernetes.io/hostname

5)查看结果,当有一个 Pod 处于 Pending ,且时间 Reson 包涵如下字样,代表设置成功

参考链接:

  • Crane-Scheduler:真实工作负载感知的调度器设计与实现:https://cloud.tencent.com/developer/article/2296515?areaId=106005
  • koordinator 负载感知调度:https://koordinator.sh/zh-Hans/docs/user-manuals/load-aware-scheduling

我是 Clay,下期见 👋

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维进阶之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 开源方案对比 koordinator VS crane
  • koordinator 使用实践
  • 测试
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档