github.com/gocrane/crane@v0.11.0/docs/tutorials/qos-customized-metrics-interference-detection-avoidance-and-sorting.zh.md (about) 1 ## 自定义指标干扰检测回避和自定义排序 2 自定义指标干扰检测回避和自定义排序的使用同 精确执行回避动作 部分中介绍的流程,此处介绍如何自定义自己的指标参与干扰检测回避流程 3 4 为了更好的基于NodeQOS配置的metric进行排序和精准控制,对metric引入属性的概念。 5 6 metric的属性包含如下几个,自定义的指标实现这些字段即可: 7 8 1. Name 表明了metric的名称,需要同collector模块中收集到的指标名称一致 9 2. ActionPriority 表示指标的优先级,0为最低,10为最高 10 3. SortAble 表明该指标是否可以排序,如果为true,需实现对应的SortFunc 11 4. SortFunc 对应的排序方法,排序方法可以排列组合一些通用方法,再结合指标自身的排序,将在下文详细介绍 12 5. ThrottleAble 表明针对该指标,是否可以对pod进行压制,例如针对cpu使用量这个metric,就有相对应的压制手段,但是对于memory使用量这种指标,就只能进行pod的驱逐,无法进行有效的压制 13 6. ThrottleQuantified 表明压制(restore)一个pod后,能否准确计算出经过压制后释放出的对应metric的资源量,我们将可以准确量化的指标称为可Quantified,否则为不可Quantified; 14 比如cpu用量,可以通过限制cgroup用量进行压制,同时可以通过当前运行值和压制后的值计算压制后释放的cpu使用量;而比如memory usage就不属于压制可量化metric,因为memory没有对应的throttle实现,也就无法准确衡量压制一个pod后释放出来的memory资源具体用量; 15 7. ThrottleFunc,执行Throttle动作的具体方法,如果不可Throttle,返回的released为空 16 8. RestoreFunc,被Throttle后,执行恢复动作的具体方法,如果不可Restore,返回的released为空 17 9. EvictAble,EvictQuantified,EvictFunc 对evict动作的相关定义,具体内容和Throttle动作类似 18 19 ```go 20 type metric struct { 21 Name WaterLineMetric 22 23 ActionPriority int 24 25 SortAble bool 26 SortFunc func(pods []podinfo.PodContext) 27 28 ThrottleAble bool 29 ThrottleQuantified bool 30 ThrottleFunc func(ctx *ExecuteContext, index int, ThrottleDownPods ThrottlePods, totalReleasedResource *ReleaseResource) (errPodKeys []string, released ReleaseResource) 31 RestoreFunc func(ctx *ExecuteContext, index int, ThrottleUpPods ThrottlePods, totalReleasedResource *ReleaseResource) (errPodKeys []string, released ReleaseResource) 32 33 EvictAble bool 34 EvictQuantified bool 35 EvictFunc func(wg *sync.WaitGroup, ctx *ExecuteContext, index int, totalReleasedResource *ReleaseResource, EvictPods EvictPods) (errPodKeys []string, released ReleaseResource) 36 } 37 ``` 38 39 用户可以自行定义自己的metric,在构造完成后,通过registerMetricMap()进行注册 40 41 针对需要自定义的指标,可以通过实现如下的方法,搭配通用的排序方法即可方便地实现pod的灵活自定义排序,以代表自定义metric指标,<metric-sort-func>代表自定义的针对的排序策略 42 ```yaml 43 func <metric>Sorter(pods []podinfo.PodContext) { 44 orderedBy(classAndPriority, <metric-sort-func>, runningTime).Sort(pods) 45 } 46 ``` 47 其中`<metric-sort-func>`需要实现如下的排序方法 48 `func (p1, p2 podinfo.PodContext) int32`