tencent cloud

文档反馈

DeScheduler 说明

最后更新时间:2022-04-21 12:12:28

    简介

    组件介绍

    DeScheduler 是容器服务 TKE 基于 Kubernetes 原生社区 DeScheduler 实现的一个基于 Node 真实负载进行重调度的插件。在 TKE 集群中安装该插件后,该插件会和 Kube-scheduler 协同生效,实时监控集群中高负载节点并驱逐低优先级 Pod。建议您搭配 TKE Dynamic Scheduler(动态调度器扩展组件)一起使用,多维度保障集群负载均衡。
    该插件依赖 Prometheus 监控组件以及相关规则配置,建议您安装插件之前仔细阅读 依赖部署,以免插件无法正常工作。

    部署在集群内的 Kubernetes 对象

    Kubernetes 对象名称 类型 请求资源 所属 Namespace
    descheduler Deployment 每个实例 CPU:200m,Memory:200Mi,共1个实例 kube-system
    descheduler ClusterRole - kube-system
    descheduler ClusterRoleBinding - kube-system
    descheduler ServiceAccount - kube-system
    descheduler-policy ConfigMap - kube-system
    probe-prometheus ConfigMap - kube-system

    使用场景

    DeScheduler 通过重调度来解决集群现有节点上不合理的运行方式。社区版本 DeScheduler 中提出的策略基于 APIServer 中的数据实现,并未基于节点真实负载。因此可以增加对于节点的监控,基于真实负载进行重调度调整。

    容器服务 TKE 自研的 ReduceHighLoadNode 策略依赖 Prometheus 和 node_exporter 监控数据,根据节点 CPU 利用率、内存利用率、网络 IO、system loadavg 等指标进行 Pod 驱逐重调度,防止出现节点极端负载的情况。DeScheduler 的 ReduceHighLoadNode 与 TKE 自研的 Dynamic Scheduler 基于节点真实负载进行调度的策略需配合使用。

    限制条件

    • Kubernetes 版本 ≥ v1.10.x
    • 在特定场景下,某些 Pod 会被重复调度到需要重调度的节点上,从而引发 Pod 被重复驱逐。此时可以根据实际场景改变 Pod 可调度的节点,或者将 Pod 标记为不可驱逐。
    • 该组件已对接容器服务 TKE 的监控告警体系。
    • 建议您为集群开启事件持久化,以便更好的监控组件异常以及故障定位。Descheduler 驱逐 Pod 时会产生对应事件,可根据 reason 为 “Descheduled” 类型的事件观察 Pod 是否被重复驱逐。
    • 为避免 DeScheduler 驱逐关键的 Pod,设计的算法默认不驱逐 Pod。对于可以驱逐的 Pod,用户需要显示给判断 Pod 所属 workload。例如,statefulset、deployment 等对象设置可驱逐 annotation。
    • 驱逐大量 Pod,导致服务不可用。
      Kubernetes 原生提供 PDB 对象用于防止驱逐接口造成的 workload 不可用 Pod 过多,但需要用户创建该 PDB 配置。容器服务 TKE 自研的 DeScheduler 组件加入了兜底措施,即调用驱逐接口前,判断 workload 准备的 Pod 数是否大于副本数一半,否则不调用驱逐接口。

    组件原理

    DeScheduler 基于 社区版本 Descheduler 的重调度思想,定期扫描各个节点上的运行 Pod,发现不符合策略条件的进行驱逐以进行重调度。社区版本 DeScheduler 已提供部分策略,策略基于 APIServer 中的数据,例如 LowNodeUtilization 策略依赖的是 Pod 的 request 和 limit 数据,这类数据能够有效均衡集群资源分配、防止出现资源碎片。但社区策略缺少节点真实资源占用的支持,例如节点 A 和 B 分配出去的资源一致,由于 Pod 实际运行情况,CPU 消耗型和内存消耗型不同,峰谷期不同造成两个节点的负载差别巨大。

    因此,腾讯云 TKE 推出 DeScheduler,底层依赖对节点真实负载的监控进行重调度。通过 Prometheus 拿到集群 Node 的负载统计信息,根据用户设置的负载阈值,定期执行策略里面的检查规则,驱逐高负载节点上的 Pod。

    组件参数说明

    Prometheus 数据查询地址

    注意:

    为确保组件可以拉取到所需的监控数据、调度策略生效,请按照**依赖部署>**Prometheus 文件配置步骤配置监控数据采集规则。

    • 如果使用自建 Prometheus,直接填入数据查询 URL(HTTPS/HTTPS)即可。
    • 如果使用托管 Prometheus,选择托管实例 ID 即可,系统会自动解析实例对应的数据查询 URL。

    利用率阈值和目标利用率

    注意:

    负载阈值参数已设置默认值,如您无额外需求,可直接采用。

    过去5分钟内,节点的 CPU 平均利用率或者内存平均使用率超过设定阈值,Descheduler 会判断节点为高负载节点,执行 Pod 驱逐逻辑,并尽量通过 Pod 重调度使节点负载降到目标利用率以下。

    操作步骤

    依赖部署

    DeScheduler 组件依赖于 Node 当前和过去一段时间的真实负载情况来进行调度决策,需要通过 Prometheus 等监控组件获取系统 Node 真实负载信息。在使用 DeScheduler 组件之前,您可以采用自建 Prometheus 监控或采用 TKE 云原生监控。

    部署 node-exporter 和 Prometheus

    通过 node-exporter 实现对于 Node 指标的监控,您可按需部署 node-exporter 和 Prometheus。

    聚合规则配置

    在 node-exporter 获取节点监控数据后,需要通过 Prometheus 对原始的 node-exporter 中采集数据进行聚合计算。为获取 DeScheduler 所需要的 cpu_usage_avg_5mmem_usage_avg_5m 等指标,需要在 Prometheus 的 rules 规则中进行配置。示例如下:

    groups:
      - name: cpu_mem_usage_active
        interval: 30s
        rules:
        - record: mem_usage_active
          expr: 100*(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)
      - name: cpu-usage-1m
        interval: 1m
        rules:
        - record: cpu_usage_avg_5m
          expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
      - name: mem-usage-1m
        interval: 1m
        rules:
        - record: mem_usage_avg_5m
          expr: avg_over_time(mem_usage_active[5m])
    

    >!当您使用 TKE 提供的 DynamicScheduler 时,需在 Prometheus 配置获取 Node 监控数据的聚合规则。DynamicScheduler 聚合规则与 DeScheduler 聚合规则有部分重合,但并不完全一样,请您在配置规则时不要互相覆盖。同时使用 DynamicScheduler 和 DeScheduler 时应该配置如下规则:
    groups:
      - name: cpu_mem_usage_active
        interval: 30s
        rules:
        - record: mem_usage_active
          expr: 100*(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)
      - name: mem-usage-1m
        interval: 1m
        rules:
        - record: mem_usage_avg_5m
          expr: avg_over_time(mem_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: cpu-usage-1m
        interval: 1m
        rules:
        - record: cpu_usage_avg_5m
          expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
      - 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])
    

    Prometheus 文件配置

    1. 上述定义了 DeScheduler 所需要的指标计算的 rules,需要将 rules 配置到 Prometheus 中,参考一般的 Prometheus 配置文件。示例如下:
      global:
        evaluation_interval: 30s
        scrape_interval: 30s
        external_labels:
      rule_files:
      - /etc/prometheus/rules/*.yml # /etc/prometheus/rules/*.yml 是定义的 rules 文件
      
    2. 将 rules 配置复制到一个文件(例如 de-scheduler.yaml),文件放到上述 Prometheus 容器的 /etc/prometheus/rules/ 下。
    3. 重新加载 Prometheus server,即可从 Prometheus 中获取到动态调度器需要的指标。
      >?通常情况下,上述 Prometheus 配置文件和 rules 配置文件都是通过 configmap 存储,再挂载到 Prometheus server 容器,因此修改相应的 configmap 即可。

    安装组件

    1. 登录 容器服务控制台,选择左侧导航栏中的集群
    2. 在“集群管理”页面单击目标集群 ID,进入集群详情页。
    3. 选择左侧菜单栏中的组件管理,进入 “组件列表” 页面。
    4. 在“组件列表”页面中选择新建,并在“新建组件”页面中勾选 Decheduler(重调度器)。
    5. 单击参数配置,按照 参数说明 填写组件所需参数。
    6. 单击完成即可创建组件。安装成功后,DeScheduler 即可正常运行,无需进行额外配置。
    7. 若您需要驱逐 workload(例如 statefulset、deployment 等对象),可以设置 Annotation 如下:
      descheduler.alpha.kubernetes.io/evictable: 'true'
      
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持