K8s 的 ResourceList进行加减操作工具类

背景

需要计算STS需要的资源并且扩容NameSpace的resourcequotas

方法

在Kubernetes Go客户端中,你可以使用一些基本的算术运算符来对ResourceList进行加减操作。ResourceList中的值是以v1.ResourceList类型表示的,这个类型实际上是一个map,其中key是v1.ResourceName,value是resource.Quantity。你可以通过操作map中的值来进行加减乘除操作。
代码如下:

package k8simport (v1 "k8s.io/api/core/v1""k8s.io/apimachinery/pkg/api/resource"
)// CalResourceList函数用于计算两个ResourceList的资源总量。
// 参数data1和data2分别是两个ResourceList,calFunc是用于计算资源总量的函数。
// 返回值res是一个新的ResourceList,包含了两个ResourceList中各个资源的总量。
func CalResourceList(data1 v1.ResourceList, data2 v1.ResourceList, calFunc func(resource.Quantity, resource.Quantity) resource.Quantity) (res v1.ResourceList) {res = v1.ResourceList{}res[v1.ResourceCPU] = calFunc(*data1.Cpu(), *data2.Cpu())         // 计算CPU总量res[v1.ResourceMemory] = calFunc(*data1.Memory(), *data2.Memory()) // 计算内存总量res[v1.ResourceStorage] = calFunc(*data1.Storage(), *data2.Storage()) // 计算存储总量return
}// AddResourceList函数用于将两个ResourceList相加。
// 参数data1和data2分别是待相加的两个ResourceList。
// 返回值是一个新的ResourceList,包含了两个ResourceList中各个资源的总量。
func AddResourceList(data1 v1.ResourceList, data2 v1.ResourceList) v1.ResourceList {return CalResourceList(data1, data2, func(q1, q2 resource.Quantity) resource.Quantity {q1.Add(q2) // 将q2加到q1上return q1})
}// SubResourceList函数用于将两个ResourceList相减。
// 参数data1和data2分别是待相减的两个ResourceList。
// 返回值是一个新的ResourceList,包含了两个ResourceList中各个资源的差值。
func SubResourceList(data1 v1.ResourceList, data2 v1.ResourceList) v1.ResourceList {return CalResourceList(data1, data2, func(q1, q2 resource.Quantity) resource.Quantity {q1.Sub(q2) // 将q2从q1中减去return q1})
}

基于上面的方法, 计算STS的配额用量

func GetStsResourceQuota(sts *appsv1.StatefulSet) (reqRes v1.ResourceList, limitRes v1.ResourceList) {// 总得reqRes = v1.ResourceList{}limitRes = v1.ResourceList{}// 单个副本sinReq := v1.ResourceList{}sinLim := v1.ResourceList{}for _, container := range sts.Spec.Template.Spec.Containers {requests := container.Resources.Requestslimits := container.Resources.LimitssinReq = k8sutils.AddResourceList(sinReq, requests)sinLim = k8sutils.AddResourceList(sinLim, limits)}// 存储for _, vol := range sts.Spec.VolumeClaimTemplates {sinReq = k8sutils.AddResourceList(sinReq, vol.Spec.Resources.Requests)sinLim = k8sutils.AddResourceList(sinLim, vol.Spec.Resources.Limits)}// 总的副本for i := 0; i < int(*sts.Spec.Replicas); i++ {reqRes = k8sutils.AddResourceList(reqRes, sinReq)limitRes = k8sutils.AddResourceList(limitRes, sinLim)}return
}