目录

Kubernetes-Scheduler系列-03-balanced_resource_allocation

概述

balanced_resource_allocation 是 Kubernetes 调度算法的其中一种。balanced_resource_allocation 会计算的是 CPU 和 Memory 与 Allocatable 资源量的分数,并且求出他们的方差 Variance,最终会将 Pod 调度到前述方差更小的节点 Node 上。

算法是参考 Wei Huang et al. An Energy Efficient Virtual Machine Placement Algorithm with Balanced Resource Utilization 文章来设计的。

代码走读

先理解一个辅助方法 fractionOfCapacity。这是用来计算请求的资源 requested 和实际资源量 capacity 的比例的方法。显然,当 capacity 是0,作为分母的 capacity 是不能为0的,所以统一返回值为1。否则就是计算 requested/capacity 的比例了。

1
2
3
4
5
6
func fractionOfCapacity(requested, capacity int64) float64 {
	if capacity == 0 {
		return 1
	}
	return float64(requested) / float64(capacity)
}

CPU 和 Memory 是通过上述的辅助公式来计算请求和可分配资源的分数的,如果有 Volumes 的需求,也会按照同样的方法来计算。这个公式也很简单。

1
2
mean := (cpuFraction + memoryFraction + volumeFraction) / float64(3)
variance := float64((((cpuFraction - mean) * (cpuFraction - mean)) + ((memoryFraction - mean) * (memoryFraction - mean)) + ((volumeFraction - mean) * (volumeFraction - mean))) / float64(3))

然后就是去计算三个分式的方差。先计算三个分式的平均值 mean,然后每个请求实际容量比的值和前述的平均值作差的平方之和,再除以3。是一个很普通的方差计算的公式。

$$ \frac{(cpuFraction - mean)^2+(memoryFraction - mean)^2+(volumeFraction - mean)^2}{3} \quad $$

光看公式,会觉得很难理解为什么需要这样的调度算法,下面举个例子,有两个节点,他们的 allocatable 的资源如下。

此时,需要申请一个 Pod,资源配置为4核/10GB/100GB

NodeAllocatable Resource CPU Memory Volumes Variance
Node A 100 200GB 500GB 0.00023
Node B 200 100GB 500GB 0.00813
Node C 200 500GB 1000GB 0.00213

所以如果按照这个算 Pod 会更倾向于调度到 Node A 上,因为 Node A 可分配的资源相对比较平衡(方差更小)。

总结

简单看了一下 Paper,文章提出的方法主要可以减少因为调度而产生资源碎片的可能。试想一下,如果完全不考虑资源的平衡性,会导致一个任务可能占据了 Node 大部分 CPU 而却又剩余大量 Memory,进而导致剩余的 Memory 无法被使用的情况。

参考资料

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。