CCE Descheduler 说明
组件介绍
CCE Descheduler 是容器引擎 CCE 在 社区版 Descheduler 的基础上,新增实现了“基于节点 CPU/Memory 真实利用率”进行 Pod 重调度的组件。“节点真实资源利用率”依赖 Prometheus 进行节点资源利用率信息采集,支持用户自建 Prometheus 和 百度云托管 Prometheus 两种数据源。
功能介绍
在 Kubernetes 中,kube-scheduler 负责对 Pending 状态的 Pod 进行调度,将 Pod 和具体的 Node 绑定。调度器对某个 Pod 是否可以被调度的决策,是由一组可配置的策略决定,被称为 predicates 和 priorities。调度器的决策受待调度 Pod 出现时的集群资源视图影响,这种一次性的调度存在局限:Node 节点数量、标签、污点、容忍等变动可能会导致已经被调度过的 Pod 不是最优调度,因此可能需要将某些运行中的 Pod 迁移到其他节点。
社区版本 descheduler 中提供的节点利用率相关策略(如 LowNodeUtilization、HighNodeUtilization)使用的是 Pod 的 Request 和 Limit 数据,而不是节点真实利用率。例如,内存型和计算型任务申请的资源可能一致,但运行过程中的实际消耗量可能有较大差异。
CCE Descheduler 新增了 “基于节点真实利用率” 的重调度策略。通过 Prometheus 获取各节点的负载统计信息,并根据用户设置的阈值对高负载节点上的 Pod 发起驱逐。
使用场景
基于节点 CPU/Memory 真实利用率进行 Pod 重调度。
注意事项
- 默认不驱逐关键 Pod(Critical Pods),即
priorityClassName被配置为system-cluster-critical或system-node-critical。 - 不驱逐不受工作负载(Deployment、StatefulSet、Job 等)管理的 Pod,因为该类 Pod 被驱逐后不会被重调度。
- 默认不驱逐 DaemonSet 管理的 Pod。
- 默认不驱逐使用本地存储的 Pod。
- 默认不驱逐挂载 PVC 的 Pod。
- 默认不驱逐系统组件 Pod。
- 可以使用 PodDisruptionBudget 保护 Pod 不被驱逐,例如可控制工作负载下不可用副本数量或比例:
1apiVersion: policy/v1
2kind: PodDisruptionBudget
3metadata:
4 name: zk-pdb
5spec:
6 maxUnavailable: 1
7 selector:
8 matchLabels:
9 app: zookeeper
- 驱逐属于高危操作,请关注节点亲和性、污点配置及 Pod 本身的节点约束,防止出现驱逐后无节点可调度的情况。
- 除以上限制条件外,默认其余 Pod 都可以被驱逐。
安装组件
依赖部署
CCE-Descheduler 依赖 Node 当前和过去一段时间的真实负载情况进行调度决策,需要通过 Prometheus 等监控组件获取 Node 真实负载信息。在使用 CCE-Descheduler 前,可采用 百度云托管 Prometheus 或自建 Prometheus 监控。
使用百度云托管 Prometheus
使用百度云托管 Prometheus 作为监控数据源时,需要完成 Prometheus 实例创建、CCE 集群关联和指标汇聚规则配置。相关操作可参考:
操作步骤如下:
- 导航路径:Prometheus 监控->监控实例。点击 【创建实例】,根据文档完成实例参数配置并确认配置项。



- 导航路径:Prometheus 监控->监控实例->实例详情->关联集群。点击 【关联集群】,选择目标 CCE 集群并确认。



- 导航路径:Prometheus 监控->监控实例->实例详情->关联集群->采集任务->采集配置。核验系统预置采集任务是否启用。



- 导航路径:Prometheus 监控->监控实例->实例详情->预聚合。点击 【创建预聚合】 并录入指标汇聚规则。


在配置指标汇聚规则阶段,用户要添加如下规则:
1spec:
2 groups:
3 - name: machine_cpu_mem_usage_active
4 interval: 30s
5 rules:
6 - record: machine_memory_usage_active
7 expr: 100*(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)
8 - name: machine_memory_usage_1m
9 interval: 1m
10 rules:
11 - record: machine_memory_usage_5m
12 expr: 'avg_over_time(machine_memory_usage_active[5m])'
13 - name: machine_cpu_usage_1m
14 interval: 1m
15 rules:
16 - record: machine_cpu_usage_5m
17 expr: >-
18 100 - (avg by (instance, clusterID)
19 (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
20 - name: container_cpu_usage_10m
21 interval: 1m
22 rules:
23 - record: container_cpu_usage_total_5m
24 expr: >-
25 sum by(namespace, pod,
26 clusterID)(rate(container_cpu_usage_seconds_total{pod!='',image=''}[5m]))
27 * 1000
28 - name: container_memory_working_set_bytes_pod
29 interval: 1m
30 rules:
31 - record: container_memory_working_set_bytes_by_pod
32 expr: 'container_memory_working_set_bytes{pod!='''',image=''''}'
该规则实现了对 CCE-Descheduler 依赖的 machine_cpu_usage_5m、machine_memory_usage_5m、container_cpu_usage_total_5m、 container_memory_working_set_bytes_by_pod 等指标的自动汇聚计算。
使用自建 Prometheus
使用自建 Prometheus 作为监控数据源时,需要部署 NodeExporter、Prometheus,并确保可采集 cAdvisor 指标。
可以参考组件官方文档完成组件的部署。
操作步骤如下:
- 参考组件官方文档完成依赖组件部署。


2. 在 Prometheus 配置文件中新增 cAdvisor 和 NodeExporter 的指标采集任务:
1scrape_configs:
2 - job_name: "kubernetes-cadvisor"
3 # Default to scraping over https. If required, just disable this or change to
4 # `http`.
5 scheme: https
6
7 # Starting Kubernetes 1.7.3 the cAdvisor metrics are under /metrics/cadvisor.
8 # Kubernetes CIS Benchmark recommends against enabling the insecure HTTP
9 # servers of Kubernetes, therefore the cAdvisor metrics on the secure handler
10 # are used.
11 metrics_path: /metrics/cadvisor
12
13 # This TLS & authorization config is used to connect to the actual scrape
14 # endpoints for cluster components. This is separate to discovery auth
15 # configuration because discovery & scraping are two separate concerns in
16 # Prometheus. The discovery auth config is automatic if Prometheus runs inside
17 # the cluster. Otherwise, more config options have to be provided within the
18 # <kubernetes_sd_config>.
19 tls_config:
20 ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
21 # If your node certificates are self-signed or use a different CA to the
22 # master CA, then disable certificate verification below. Note that
23 # certificate verification is an integral part of a secure infrastructure
24 # so this should only be disabled in a controlled environment. You can
25 # disable certificate verification by uncommenting the line below.
26 #
27 insecure_skip_verify: true
28 authorization:
29 credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
30
31 kubernetes_sd_configs:
32 - role: node
33
34 relabel_configs:
35 - action: labelmap
36 regex: __meta_kubernetes_node_label_(.+)
37
38 - job_name: 'node-exporter'
39 kubernetes_sd_configs:
40 - role: pod
41 relabel_configs:
42 - source_labels: [__meta_kubernetes_pod_name]
43 regex: 'node-exporter-(.+)'
44 action: keep
在使用自建 Prometheus 的情况下,配置指标聚合规则和使用托管集群类似,区别在于规则中不需要考虑 clusterID 维度,该维度由托管 Prometheus 添加。所以聚合规则可参考:
1spec:
2 groups:
3 - name: machine_cpu_mem_usage_active
4 interval: 30s
5 rules:
6 - record: machine_memory_usage_active
7 expr: 100*(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)
8 - name: machine_memory_usage_1m
9 interval: 1m
10 rules:
11 - record: machine_memory_usage_5m
12 expr: 'avg_over_time(machine_memory_usage_active[5m])'
13 - name: machine_cpu_usage_1m
14 interval: 1m
15 rules:
16 - record: machine_cpu_usage_5m
17 expr: >-
18 100 - (avg by (instance)
19 (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
20 - name: container_cpu_usage_10m
21 interval: 1m
22 rules:
23 - record: container_cpu_usage_total_5m
24 expr: >-
25 sum by(namespace, pod)(rate(container_cpu_usage_seconds_total{pod!='',image=''}[5m])) * 1000
26 - name: container_memory_working_set_bytes_pod
27 interval: 1m
28 rules:
29 - record: container_memory_working_set_bytes_by_pod
30 expr: 'container_memory_working_set_bytes{pod!='''',image=''''}'
安装 CCE-Descheduler
- 登录百度智能云官网,并进入管理控制台。
- 导航路径:容器引擎 CCE->集群管理->集群列表。选择目标集群并进入集群详情页。
- 单击左侧导航栏中的“集群管理>集群列表”。
- 在集群列表页面中,单击目标集群名称进入集群管理页面。
- 在集群管理页面单击“运维与管理>组件管理”。
- 在组件管理列表中找到
CCE Descheduler组件并点击 【安装】。 - 在组件配置页面中完成数据源选择及重调度策略配置,点击“确定”按钮完成组件的安装。

用户可以根据需求,选择 托管 Prometheus 或 自建 Prometheus 作为数据源。 当选择托管 Promehteus 时,用户可以在下拉框选择集群所关联的 Prometheus 实例:

当选择自建 Prometheus 时,用户需要手动输入在集群内可访问的地址:

- 其他参数说明如下:
| 参数 | 必填 | 说明 |
|---|---|---|
| 利用率阈值 | 是 | 当节点 CPU 或内存利用率达到阈值时,发起该节点 Pod 驱逐。 |
| 目标利用率 | 是 | 发起 Pod 驱逐后,当节点利用率降至目标值时停止驱逐。 |
| 重调度挂载 PVC Pod | 否 | 默认不驱逐挂载 PVC 的 Pod,可按需开启。 |
| 重调度挂载本地存储的 Pod | 否 | 默认不驱逐挂载本地存储的 Pod,可按需开启。 |
- 完成参数配置后,点击 “确认”,即可完成组件安装。
版本记录
| 版本号 | 适配集群版本 | 更新时间 | 更新内容 | 影响 |
|---|---|---|---|---|
| 0.24.2 | CCE/v1.16+ | 2023.06.21 | 首次上线 | - |
| 0.24.3 | CCE/v1.16+ | 2023.12.15 | 修复内存泄漏问题 | - |
评价此篇文章
