精确执行回避动作

精确执行回避动作

精确执行回避动作

通过如下两点进行,避免了对于低优pod的过度操作的同时能够更快地降低指标到指定水位线的差距,保障高优业务不受影响

  1. 排序pod

crane实现了一些通用的排序方法(之后会更多地完善):

classAndPriority: 比较两个pod的QOSClass和class value,优先比较QOSClass,再比较class value;priority高的排在后面优先级更高

runningTime:比较两个pod的运行时间,运行时间长的排在后面优先级更高

如果仅需使用这两个排序策略,使用默认的排序方法即可:会首先比较pod的优先级,之后比较pod对应指标的用量,之后比较pod的运行时长,有一个维度可以比较出结果即为pod的排序结果

以cpu usage指标的排序为例,还扩展了一些与自身指标相关的排序策略, 如cpu usage 使用量的排序,会依次比较两个pod的优先级,如果优先级相同的情况下,再比较cpu用量,如果cpu用量也相同的情况下继续比较扩展cpu资源用量, 最后比较pod的运行时长,当某一个指标存在差异时即可返回比较结果:orderedBy(classAndPriority, cpuUsage, extCpuUsage, runningTime).Sort(pods)

  1. 参考水位线和pod用量执行回避动作

    1. //将所有触发水位线的metrics根据其Quantified属性区分为两部分
    2. metricsQuantified, MetricsNotQuantified := ThrottleDownWaterLine.DivideMetricsByQuantified()
    3. // 如果存在不可Quantified的metric,获取具有最高ActionPriority的一个throttleAble的metric对所选择的所有pod进行操作
    4. if len(MetricsNotThrottleQuantified) != 0 {
    5. highestPrioriyMetric := GetHighestPriorityThrottleAbleMetric()
    6. t.throttlePods(ctx, &totalReleased, highestPrioriyMetric)
    7. } else {
    8. //获取节点和workload的最新用量,构造和水位线差距
    9. ThrottoleDownGapToWaterLines = buildGapToWaterLine(ctx.getStateFunc())
    10. //如果触发水位线中存在metric的实时用量无法获取,则获取具有最高ActionPriority的一个throttleAble的metric对所选择的所有pod进行压制操作
    11. if ThrottoleDownGapToWaterLines.HasUsageMissedMetric() {
    12. highestPrioriyMetric := ThrottleDownWaterLine.GetHighestPriorityThrottleAbleMetric()
    13. errPodKeys = throttlePods(ctx, &totalReleased, highestPrioriyMetric)
    14. } else {
    15. var released ReleaseResource
    16. //遍历触发水位线的metric中可以量化的metric:如果metric具有排序方法则直接使用其SortFunc对pod进行排序,否则使用GeneralSorter排序;
    17. //之后使用其对应的操作方法对pod执行操作,并计算释放出来的对应metric的资源量,直到对应metric到水位线的差距已不存在
    18. for _, m := range metricsQuantified {
    19. if m.SortAble {
    20. m.SortFunc(ThrottleDownPods)
    21. } else {
    22. GeneralSorter(ThrottleDownPods)
    23. }
    24. for !ThrottoleDownGapToWaterLines.TargetGapsRemoved(m) {
    25. for index, _ := range ThrottleDownPods {
    26. released = m.ThrottleFunc(ctx, index, ThrottleDownPods, &totalReleased)
    27. ThrottoleDownGapToWaterLines[m] -= released[m]
    28. }
    29. }
    30. }
    31. }
    32. }

关于扩展自定义指标和排序参考 “自定义指标干扰检测回避和自定义排序” 部分