Kube Green 高级配置:JSONPatch 实现复杂资源管理
Kube Green 是一款专为 Kubernetes 集群设计的 CO2 减排工具,通过智能管理资源状态来降低能源消耗。本文将深入探讨如何利用 JSONPatch 功能实现复杂资源的精细化管理,帮助集群管理员轻松应对多样化的资源调度需求。
Kube Green 项目 logo,致力于降低 Kubernetes 集群的碳足迹
什么是 JSONPatch?
JSONPatch 是 Kubernetes API 支持的一种标准补丁格式,允许通过 JSON 结构描述对资源的修改操作。在 Kube Green 中,JSONPatch 被用于定义资源在'休眠'和'唤醒'状态之间的转换规则,实现对 Deployment、StatefulSet、CronJob 等多种资源的灵活控制。
为什么选择 JSONPatch 进行资源管理?
传统的资源管理方式往往只能修改 replicas 等简单字段,而 JSONPatch 提供了更强大的能力:
- 细粒度控制:可精确修改资源的任何字段,包括环境变量、标签、注解等
- 复杂操作支持:支持添加、删除、替换、移动等多种操作类型
- 可逆性:Kube Green 会自动记录原始状态,确保唤醒时准确恢复资源
- 通用性:适用于任何 Kubernetes 资源类型,包括自定义资源 (CRD)
JSONPatch 在 Kube Green 中的实现
Kube Green 的 JSONPatch 功能主要实现在 internal/controller/sleepinfo/jsonpatch/jsonpatch.go 文件中,核心包含以下几个关键函数:
Sleep 操作:应用补丁使资源休眠
当达到预设的休眠时间时,Kube Green 会对匹配的资源应用 JSONPatch:
- 读取 SleepInfo CR 中定义的 patch 规则
- 为每个目标资源生成修改补丁
- 记录原始状态用于后续恢复
- 使用 Server-Side Apply 方式应用补丁
关键代码逻辑:
// 构建稀疏对象,只包含标识符和需要修改的字段 sparseObj, err := buildSparseApplyObject(resource, forwardPatch) if err := resourceWrapper.SSAPatch(ctx, sparseObj); err != nil { return fmt.Errorf("%w: %s", ErrJSONPatch, err) }
WakeUp 操作:恢复资源原始状态
当唤醒条件满足时,Kube Green 会:
- 检查资源是否被手动修改过
- 应用之前保存的恢复补丁
- 恢复资源到休眠前的原始状态
// 使用合并补丁恢复原始状态 restored, err := jsonpatch.MergePatch(current, []byte(rawPatch)) if err := resourceWrapper.Patch(ctx, resource.DeepCopy(), res); err != nil { return fmt.Errorf("%w: %s", ErrJSONPatch, err) }
实用 JSONPatch 配置示例
示例 1:休眠时调整 Deployment 资源
以下配置会在休眠期间将 Deployment 的副本数设置为 0,并添加"kube-green: sleeping"标签:
patches:
- target:
group:

