K8s 的 ResourceList进行加减操作工具类
在Kubernetes Go客户端中,你可以使用一些基本的算术运算符来对ResourceList进行加减操作。ResourceList中的值是以。需要计算STS需要的资源并且扩容NameSpace的resourcequotas。类型表示的,这个类型实际上是一个map,其中key是。你可以通过操作map中的值来进行加减乘除操作。
·
背景
需要计算STS需要的资源并且扩容NameSpace的resourcequotas
方法
在Kubernetes Go客户端中,你可以使用一些基本的算术运算符来对ResourceList进行加减操作。ResourceList中的值是以v1.ResourceList
类型表示的,这个类型实际上是一个map,其中key是v1.ResourceName
,value是resource.Quantity
。你可以通过操作map中的值来进行加减乘除操作。
代码如下:
package k8sutils
import (
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.Requests
limits := container.Resources.Limits
sinReq = 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
}
更多推荐
已为社区贡献11条内容
所有评论(0)