CubeMaster 调度器配置参考
本页说明 CubeMaster scheduler 的配置入口、节点选择流程、Cubelet 上报的数据如何参与调度,以及在 one-click / Terraform 部署中如何把节点数量、资源配额、并发和模板副本管理配置到位。
如果你只是想给多机部署启用基本评分,可以先阅读多机集群部署。如果需要排查调度失败、资源耗尽、节点标签不匹配或新增计算节点后的模板同步,请使用本页作为完整参考。
配置在哪里
CubeMaster 调度配置位于 CubeMaster 的 conf.yaml:
| 部署方式 | 配置位置 | 生效方式 |
|---|---|---|
| one-click / systemd | /usr/local/services/cubetoolbox/CubeMaster/conf.yaml | 修改后重启 cube-sandbox-cubemaster.service |
| 源码配置模板 | configs/single-node/cubemaster.yaml | 重新打包或拷贝到运行环境 |
| Tencent Cloud Terraform / TKE | deploy/one-click/terraform/tencentcloud/tke-addons.tf 中的 kubernetes_secret.cubemaster_conf | 修改 Terraform 通过 yamlencode 生成的配置,重新 apply Terraform,并重启或滚动更新 cube-master Pod |
| Kubernetes / Helm chart | deploy/kubernetes/chart/files/cube-master/conf.yaml,由 deploy/kubernetes/chart/templates/master-config-secret.yaml 渲染 | 修改 chart 文件或渲染后的 Secret,并重启或滚动更新 cube-master Pod |
Cubelet 节点元数据和资源配额不在 CubeMaster 配置里,而是由每台 Cubelet 上报。one-click 环境中的主要入口是:
| 配置 | 位置 | 说明 |
|---|---|---|
| Cubelet 静态配置 | /usr/local/services/cubetoolbox/Cubelet/config/config.toml | 包含 node_status_update_frequency,修改后重启 Cubelet |
| Cubelet 动态配置 | /usr/local/services/cubetoolbox/Cubelet/dynamicconf/conf.yaml | 包含 host.scheduler_label 和 host.quota,修改后重启 Cubelet |
常见 Cubelet 动态配置示例:
host:
scheduler_label: "default-cluster"
quota:
mcpu_limit: 0
mem_limit: ""
mvm_limit: 0
creation_concurrent_num: 00 或空值通常表示让 Cubelet 按宿主机资源推导默认值,不等于无限资源。压测或大规模集群中如果要提高密度,应显式评估 CPU、内存、MVM 数量和并发创建上限。
CubeMaster 如何选择计算节点
一次 sandbox 创建请求进入 CubeMaster 后,调度大致分为四步:
- 解析请求约束:读取
instance_type、模板 ID、资源规格、显式 host IP、node affinity / annotations 等条件。 - 预过滤节点:排除不健康、资源上报过期、超过 MVM 上限、模板本地副本不可用、实时或本地观测创建数过高、不满足 affinity 的节点;启用
diskfilter 或 backoff 路径时,也会排除磁盘使用过高的节点。 - 节点评分:对过滤后的候选节点计算分数,例如基于
mvm_num、local_create_num、quota_cpu_usage、quota_mem_usage做加权平均。 - 最终选择:从评分靠前的一组节点中选择。
priority_select_num控制进入最终随机选择的高分节点数量,least_select_name默认为random。
如果没有配置评分,CubeMaster 仍会做过滤,但可能按候选列表顺序选择节点,导致新 sandbox 更容易集中到第一个可用节点,直到资源过滤器把流量推向其他节点。
关键 scheduler 字段
推荐把下面的评分相关配置合并到现有 cubemaster.yaml 的 scheduler 段中。除非确实要替换,否则请保留已有的 filter、超时、overcommit 和实例类型专用配置。
scheduler:
# 保留当前部署已有的 filter、超时、overcommit 和其他 scheduler 配置。
priority_select_num: 3
score:
enable_scorers:
- real_time_weighted_average
resource_weights:
mvm_num: 2
local_create_num: 3
quota_cpu_usage: 1
quota_mem_usage: 1
plugin_conf:
real_time_weighted_average:
weight: 1.0
enable_weight_factors:
- mvm_num
- local_create_num
- quota_cpu_usage
- quota_mem_usage| 字段 | 作用 |
|---|---|
priority_select_num | 从评分最高的前 N 个节点中做最终选择。多节点建议大于 1,小集群可从 3 开始。 |
metric_update_timeout | 节点资源指标多久未更新后视为不可调度。应明显大于 Cubelet 上报周期。 |
local_metric_update_timeout | 预留的本地指标超时字段。当前 prefilter 对全局指标和本地指标的新鲜度检查都使用 metric_update_timeout。 |
filter.enable_filters | 启用调度过滤器。常见过滤器包括 CPU、内存、模板本地性和实时创建并发。 |
score.enable_scorers | 启用评分器。多机部署通常启用 real_time_weighted_average;启用时必须同时配置 score.plugin_conf.real_time_weighted_average,否则 CubeMaster 可能在 scheduler 启动阶段 panic。 |
score.resource_weights | 控制 MVM 数、创建并发、CPU/内存 quota 使用率等因子的权重。权重越高,该因子对分数影响越大;对应因子也必须列在 score.plugin_conf.real_time_weighted_average.enable_weight_factors 中。 |
overcommit_ratio / overcommit_ratio_conf | 对 Cubelet 上报 quota 应用 CPU/内存超卖比例。默认 CPU 为 3、内存为 2,可按实例类型覆盖。 |
node_max_mvm_num / node_max_mvm_num_conf | 全局或按实例类型限制单节点 MVM 数。Cubelet 上报的 max_mvm_num 也会参与实际上限计算。 |
disk_usage_max_percent | disk filter 和 backoff 路径使用的磁盘水位阈值,用于避免继续调度到快满的机器。 |
affinityconf / node_affinity_selector_allowed_keys | 控制按 cluster label、zone、CPU 类型、机型等做亲和或约束选择。 |
节点元数据如何影响调度
Cubelet 会通过 CubeMaster 的 /internal/meta 接口注册节点并持续上报状态。CubeMaster 把这些数据写入元数据存储和本地缓存,调度时读取最新快照。
| Cubelet 上报字段 | 来源 | 调度影响 |
|---|---|---|
instance_type | Cubelet 节点身份 / 实例类型 | 用于匹配请求的 instance_type、按类型选择模板副本、套用按类型的 MVM/overcommit 配置。 |
cluster_label | host.scheduler_label | 用于 cluster label 亲和、隔离不同节点池或指定模板分发范围。 |
quota_cpu | host.quota.mcpu_limit 或宿主机推导值 | CPU 可调度容量的基础值,叠加 overcommit 后参与 CPU 过滤和评分。 |
quota_mem_mb | host.quota.mem_limit 或宿主机推导值 | 内存可调度容量的基础值,叠加 overcommit 后参与内存过滤和评分。 |
max_mvm_num | host.quota.mvm_limit 或按内存推导 | 单节点可承载的 MVM 数上限,超过后节点会被过滤。 |
create_concurrent_num | host.quota.creation_concurrent_num | 节点上报的创建并发配置。0 表示 Cubelet 不设置额外 engine flow limit,但 CubeMaster 调度层仍会回落到 cubelet_conf.create_concurrent_limit。 |
| allocated / disk usage / cgroup metrics | Cubelet 周期上报 | 用于判断当前资源使用率、磁盘水位和评分因子。 |
这些值是每个计算节点独立配置和上报的。异构集群中,不同节点可以有不同实例类型、标签、配额和并发上限。
部署变量映射
one-click 多节点
| 变量 / 配置 | 影响 |
|---|---|
ONE_CLICK_DEPLOY_ROLE=compute | 安装计算节点,只运行 Cubelet 等运行时服务,并向控制面注册。 |
CUBE_SANDBOX_NODE_IP | 当前节点注册到 CubeMaster 的可路由地址。配置错误会导致节点不可达或不出现。 |
ONE_CLICK_CONTROL_PLANE_IP / ONE_CLICK_CONTROL_PLANE_CUBEMASTER_ADDR | Cubelet 注册和上报使用的 CubeMaster 地址。 |
Cubelet/config/config.toml 中的 node_status_update_frequency | 节点状态和资源上报周期。默认 1s,不要配置到 dynamicconf。 |
Cubelet/dynamicconf/conf.yaml 中的 host.scheduler_label | 节点池标签,用于 affinity 和隔离。 |
Cubelet/dynamicconf/conf.yaml 中的 host.quota.* | CPU、内存、MVM 数、创建并发等调度容量。 |
Tencent Cloud Terraform / TKE
| 变量 | 影响 |
|---|---|
TENCENTCLOUD_COMPUTE_NODE_COUNT | PVM 计算节点数量,直接决定可承载 sandbox 的节点池规模。 |
TENCENTCLOUD_COMPUTE_INSTANCE_TYPE | 默认计算节点机型,影响真实 CPU/内存和 Cubelet 推导出的 quota。 |
TF_VAR_compute_instance_types | 逐台指定异构计算节点机型。适合压测或混部场景。 |
TENCENTCLOUD_COMPUTE_DATA_DISK_SIZE | 每台计算节点 /data/cubelet 数据盘大小,影响模板、快照和运行时数据容量。 |
TENCENTCLOUD_CUBELET_NODE_STATUS_UPDATE_FREQUENCY | Terraform 安装时写入每台计算节点的 Cubelet 静态配置,控制节点状态/资源上报频率。 |
TENCENTCLOUD_TKE_NODE_COUNT / TENCENTCLOUD_TKE_WORKER_INSTANCE_TYPE | 控制面 Pod 资源,不直接承载 sandbox,但会影响 CubeMaster、cube-api、cube-proxy 等控制面吞吐。 |
TENCENTCLOUD_COMPUTE_NODE_COUNT 和 TENCENTCLOUD_TKE_NODE_COUNT 是两套资源:前者运行 Cubelet 并承载 sandbox,后者运行控制面 Pod。
推荐配置
小测试集群
适合 POC、功能验证和少量并发。下面是新建小测试集群可用的完整起始配置,包含随项目提供的超时和过滤器默认值;如果是在已有部署上调整,请按需合并,不要盲目替换无关的 scheduler 配置。
scheduler:
priority_select_num: 3
metric_update_timeout: 300s
local_metric_update_timeout: 300s
filter:
enable_filters:
- cpu
- mem
- template_locality
- realtime_create_num
score:
enable_scorers:
- real_time_weighted_average
resource_weights:
mvm_num: 2
local_create_num: 3
quota_cpu_usage: 1
quota_mem_usage: 1
plugin_conf:
real_time_weighted_average:
weight: 1.0
enable_weight_factors:
- mvm_num
- local_create_num
- quota_cpu_usage
- quota_mem_usage建议:
- 至少 2 台计算节点,便于验证节点选择和故障隔离。
priority_select_num从3开始;如果计算节点少于 3 台,可以设为节点数。- Cubelet 上报周期保持默认
1s,CubeMaster 指标超时保持300s。 host.quota使用默认推导值即可,但压测前必须显式检查是否过低。
较大生产类集群
适合更高并发或长期运行:
- 按节点池设置清晰的
host.scheduler_label,例如通用池、内存型池、压测池,避免不同用途互相挤占。 - 为不同
instance_type配置node_max_mvm_num_conf和overcommit_ratio_conf,不要把大规格节点和小规格节点套同一组上限。 - 适当增大
priority_select_num,通常可设置为健康计算节点数的一个小比例,但不建议大到完全随机。 - 保留
template_locality过滤器,确保创建只落到已有模板副本的节点。 - 为
host.quota.creation_concurrent_num设置明确上限,避免镜像、磁盘或 VMM 创建在单节点上被突发流量打满。 - 控制面也要扩容:提高
TENCENTCLOUD_TKE_NODE_COUNT和控制面 Pod 副本数,避免 CubeMaster 或 cube-api 成为瓶颈。
新增计算节点后的 template redo
新增 compute node 后,节点注册成功并不代表所有模板都已经在该节点可用。调度器的 template_locality 过滤器会要求目标节点具备可用模板副本,否则创建请求可能失败或只调度到旧节点。
对镜像构建模板,新增节点后必须执行 template redo,把模板副本分发/重建到新节点:
cubemastercli tpl redo \
--template-id <tpl-id> \
--node <node-ip>说明:
--node接受节点 ID 或 host IP;多个节点可以重复传入--node。redo默认会等待任务完成;如只提交任务可使用--detach。- 如果只想重做失败节点,可使用
--failed-only。 - redo 完成后再创建使用该模板的 sandbox,避免调度因模板不可用失败。
建议在多节点扩容流程中把 template redo 作为固定步骤:
- 安装计算节点并确认它出现在 CubeMaster 节点列表。
- 确认该节点健康、Cubelet 资源上报正常。
- 对需要在该节点运行的模板执行
cubemastercli tpl redo --template-id <tpl-id> --node <node-ip>。 - 等待 redo job 成功后,再放开业务流量或运行 E2E。
排障
调度失败或返回 no more resource
检查方向:
quota_cpu/quota_mem_mb是否低于实际创建需求。host.quota.mcpu_limit、host.quota.mem_limit、host.quota.mvm_limit是否仍为默认推导值。overcommit_ratio是否过低或按类型覆盖不符合预期。mvm_num是否达到max_mvm_num或node_max_mvm_num_conf上限。- 有效创建并发上限是否阻塞了当前节点。注意
create_concurrent_num: 0在调度层仍会回落到 CubeMaster 的cubelet_conf.create_concurrent_limit。
常用入口:
curl http://127.0.0.1:8089/internal/meta/nodes
sudo tail -F /data/log/CubeMaster/cubemaster-req.log
sudo tail -F /data/log/Cubelet/Cubelet-req.log节点状态或资源上报过期
如果 CubeMaster 日志中出现 metric update timeout 类似信息:
- 确认计算节点
cube-sandbox-cubelet.service正常运行。 - 确认
ONE_CLICK_CONTROL_PLANE_CUBEMASTER_ADDR或 Terraform 生成的 CubeMaster 地址可达。 - 检查
node_status_update_frequency是否被误改得过大。 - 确认
metric_update_timeout明显大于上报周期。
模板不可用
典型现象是新节点加入后,创建仍只落到旧节点,或日志中提示模板本地副本不可用。
处理:
- 确认请求使用的
template_id。 - 对新增节点执行
cubemastercli tpl redo --template-id <tpl-id> --node <node-ip>。 - 查看模板 job 状态,确认 redo 成功。
- 保留
template_locality过滤器,不建议为了绕过问题关闭它。
Node label 不匹配
如果请求设置了 node affinity、cluster label 或特定 instance type,但没有候选节点:
- 检查 Cubelet
host.scheduler_label是否与请求或affinityconf中的标签一致。 - 检查
instance_type是否与模板和请求匹配。 - 检查
node_affinity_selector_allowed_keys是否允许请求使用的 selector key。 - 对异构节点池,确认模板副本已经 redo 到对应标签/机型的节点。
创建集中在少数节点
如果多机集群中新 sandbox 仍明显集中在一台机器:
- 确认
score.enable_scorers已启用。 - 启用
real_time_weighted_average时,确认score.plugin_conf.real_time_weighted_average.enable_weight_factors包含预期因子。 - 将
priority_select_num设置为大于1。 - 检查
local_create_num、mvm_num、quota_cpu_usage、quota_mem_usage权重是否存在。 - 确认各节点模板副本都可用,否则
template_locality会让候选节点集合变小。