Kubernetes Pod调度分配算法咨询及多约束下所需节点数量计算问题
Kubernetes调度算法及多约束节点估算方案
1. Kubernetes Pod节点分配算法
Kubernetes默认的kube-scheduler调度器并非采用单一算法,而是通过分阶段的过滤+打分机制完成节点分配,流程如下:
- 过滤阶段:遍历集群所有节点,排除无法满足Pod运行要求的节点,比如资源(CPU/内存/GPU等)请求不足、端口冲突、不满足节点亲和/污点容忍规则、不满足存储挂载要求的节点都会被直接过滤。
- 打分阶段:对过滤后的合法节点按多维度规则加权打分,核心内置打分规则包括:
LeastRequestedPriority:优先选择已分配资源请求占比更低的节点BalancedResourceAllocation:优先选择CPU、内存资源使用率均衡的节点PodTopologySpreadPriority:满足Pod拓扑分布约束的节点得分更高
所有规则按预设权重计算出每个节点的最终得分。
- 绑定阶段:选择得分最高的节点与Pod完成绑定,调度结束。
1.14版本之后Kubernetes引入了调度框架,支持用户自定义调度插件扩展上述两个阶段的逻辑,默认情况下使用的是上述内置规则组合。
2. 多约束下最小节点数估算方法
你提到的场景属于带特殊约束的装箱问题变种,无需使用复杂度较高的匈牙利算法,通过分层贪心计算即可得到足够精准的估算结果,满足成本测算需求,具体步骤如下:
2.1 先明确基础参数
- 设单节点最大可承载Pod数为
maxPods(Kubernetes默认值为110,可根据节点规格、业务特性自定义) - 若需要考虑资源约束,额外定义单节点可用CPU为
nodeCpu、可用内存为nodeMemory,每个Pod的CPU/内存请求为podCpu/podMemory
2.2 按可用区拆分Pod分布
针对有「3可用区均衡分布」约束的工作负载,先将该工作负载的总Pod数拆到3个可用区,每个可用区分配的Pod数为ceil(总Pod数 / 3),剩余的Pod依次分配到前N个可用区即可,比如总Pod数为7时,3个可用区的分配结果为3、2、2。
2.3 单可用区最小节点数计算
针对单个可用区,分别计算以下三个下界,取最大值即为该可用区需要的最小节点数:
- 所有有「同工作负载Pod必须部署在不同节点」约束的工作负载,在该可用区分配的Pod数的最大值。比如某可用区有A工作负载分配了4个Pod,B工作负载分配了3个Pod,都有独占节点约束,则该值为4,至少需要4个节点才能放下两个工作负载的独占Pod。
- 该可用区所有Pod的总CPU请求除以
nodeCpu向上取整、总内存请求除以nodeMemory向上取整,二者的最大值(无资源约束需求可忽略此项)。 - 该可用区总Pod数除以
maxPods向上取整的值。
2.4 总节点数计算
将3个可用区的最小节点数相加,即可得到全集群需要的最小节点数。
计算示例
举个简单的场景说明计算逻辑:
- 工作负载A:共7个Pod,同时满足两个约束,3个可用区分得3、2、2个Pod
- 工作负载B:共5个Pod,同时满足两个约束,3个可用区分得2、2、1个Pod
- 无约束普通Pod共10个,平均分配到3个可用区
- 单节点
maxPods=10,无额外资源约束
计算结果: - 可用区1总Pod数=3+2+4=9,下界1取max(3,2)=3,下界3取ceil(9/10)=1,取最大值3
- 可用区2总Pod数=2+2+3=7,下界1取max(2,2)=2,下界3取ceil(7/10)=1,取最大值2
- 可用区3总Pod数=2+1+3=6,下界1取max(2,1)=2,下界3取ceil(6/10)=1,取最大值2
- 总节点数=3+2+2=7
内容的提问来源于stack exchange,提问作者codersofthedark
相关产品推荐
相关产品推荐

