背景
在 Kubernetes 集群管理中,经常需要计算 StatefulSet 的实际资源需求,以便动态调整 Namespace 的 ResourceQuotas。由于 ResourceList 本质是 map[ResourceName]Quantity 结构,直接操作较为繁琐,封装一套加减运算工具类能显著提升开发效率。
实现思路
Go 客户端中,resource.Quantity 支持基本的算术运算。我们可以利用泛型思想或函数回调,将具体的加减逻辑抽象出来,避免重复代码。需要注意的是,ResourceList 没有直接的 .Cpu() 方法,需通过 key 访问 map 值。
核心代码
以下工具类实现了 ResourceList 的通用计算、加法与减法逻辑。为了保持代码健壮性,这里修正了原 API 调用中的笔误(如直接调用不存在的 Cpu 方法),并优化了副本数的累加方式。
package k8sutils
import (
"k8s.io/api/core/v1"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/api/resource"
)
// CalResourceList 用于计算两个 ResourceList 的资源总量。
// calFunc 定义了具体的运算逻辑(如 Add 或 Sub)。
func CalResourceList(data1 v1.ResourceList, data2 v1.ResourceList, calFunc func(resource.Quantity, resource.Quantity) resource.Quantity) v1.ResourceList {
res := make(v1.ResourceList)
// 遍历所有资源类型进行计算,比硬编码 CPU/Memory 更通用
for name, val1 := range data1 {
val2, ok := data2[name]
if !ok {
val2 = resource.Quantity{}
}
res[name] = calFunc(val1, val2)
}
return res
}
// AddResourceList 将两个 ResourceList 相加
func AddResourceList(data1, data2 v1.ResourceList) v1.ResourceList {
return CalResourceList(data1, data2, func(q1, q2 resource.Quantity) resource.Quantity {
q1.Add(q2)
return q1
})
}
// SubResourceList 将两个 ResourceList 相减
v1.ResourceList {
CalResourceList(data1, data2, resource.Quantity {
q1.Sub(q2)
q1
})
}

