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

背景

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

方法

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

代码如下:

go 复制代码
package k8s

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的配额用量

go 复制代码
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
}
相关推荐
研☆香几秒前
js中 onload 事件的用法
开发语言·javascript·ecmascript
xiancai_xianyu25 分钟前
想把数据模型一次建完美再上AI?会一直卡在建模里
开发语言·人工智能·php·数据模型·语义层·本体建模·企业知识网络
(Charon)39 分钟前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++
Java后端的Ai之路1 小时前
LangChain Deep Agents 从入门到企业实战
开发语言·人工智能·python·langchain·deepagents
会飞的拖把1 小时前
Python文件操作详解:从文件读写到os、shutil模块实战
开发语言·python
RS迷途小书童1 小时前
Python 解析大疆无人机 SRT 字幕日志
开发语言·python·无人机
我不会起名字3221 小时前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈
点心的游戏开发世界1 小时前
GDScript 入门笔记(十六):文件读写与数据持久化
开发语言·笔记·游戏引擎·godot
会飞的拖把2 小时前
Python序列详解:列表、元组、字符串的通用操作(超详细版)
开发语言·windows·python
reasonsummer2 小时前
【办公类-115-01】20260906育儿知识(家园小报)批量制作(2026年9月-2027年6月)
开发语言·数据库·c#