扩展资源的资源装箱

在 kube-scheduler 的调度插件 NodeResourcesFit 中存在两种支持资源装箱(bin packing)的策略:MostAllocatedRequestedToCapacityRatio

使用 MostAllocated 策略启用资源装箱

MostAllocated 策略基于资源的利用率来为节点计分,优选分配比率较高的节点。 针对每种资源类型,你可以设置一个权重值以改变其对节点得分的影响。

要为插件 NodeResourcesFit 设置 MostAllocated 策略, 可以使用一个类似于下面这样的调度器配置

  1. apiVersion: kubescheduler.config.k8s.io/v1beta3
  2. kind: KubeSchedulerConfiguration
  3. profiles:
  4. - pluginConfig:
  5. - args:
  6. scoringStrategy:
  7. resources:
  8. - name: cpu
  9. weight: 1
  10. - name: memory
  11. weight: 1
  12. - name: intel.com/foo
  13. weight: 3
  14. - name: intel.com/bar
  15. weight: 3
  16. type: MostAllocated
  17. name: NodeResourcesFit

要进一步了解其它参数及其默认配置,请参阅 NodeResourcesFitArgs 的 API 文档。

使用 RequestedToCapacityRatio 策略来启用资源装箱

RequestedToCapacityRatio 策略允许用户基于请求值与容量的比率,针对参与节点计分的每类资源设置权重。 这一策略使得用户可以使用合适的参数来对扩展资源执行装箱操作,进而提升大规模集群中稀有资源的利用率。 此策略根据所分配资源的一个配置函数来评价节点。 NodeResourcesFit 计分函数中的 RequestedToCapacityRatio 可以通过字段 scoringStrategy 来控制。 在 scoringStrategy 字段中,你可以配置两个参数:requestedToCapacityRatioresourcesrequestedToCapacityRatio 参数中的 shape 设置使得用户能够调整函数的算法,基于 utilizationscore 值计算最少请求或最多请求。 resources 参数中包含计分过程中需要考虑的资源的 name,以及用来设置每种资源权重的 weight

下面是一个配置示例,使用 requestedToCapacityRatio 字段为扩展资源 intel.com/foointel.com/bar 设置装箱行为:

  1. apiVersion: kubescheduler.config.k8s.io/v1beta3
  2. kind: KubeSchedulerConfiguration
  3. profiles:
  4. - pluginConfig:
  5. - args:
  6. scoringStrategy:
  7. resources:
  8. - name: intel.com/foo
  9. weight: 3
  10. - name: intel.com/bar
  11. weight: 3
  12. requestedToCapacityRatio:
  13. shape:
  14. - utilization: 0
  15. score: 0
  16. - utilization: 100
  17. score: 10
  18. type: RequestedToCapacityRatio
  19. name: NodeResourcesFit

使用 kube-scheduler 标志 --config=/path/to/config/file 引用 KubeSchedulerConfiguration 文件,可以将配置传递给调度器。

要进一步了解其它参数及其默认配置,可以参阅 NodeResourcesFitArgs 的 API 文档。

调整计分函数

shape 用于指定 RequestedToCapacityRatio 函数的行为。

  1. shape:
  2. - utilization: 0
  3. score: 0
  4. - utilization: 100
  5. score: 10

上面的参数在 utilization 为 0% 时给节点评分为 0,在 utilization 为 100% 时给节点评分为 10,因此启用了装箱行为。 要启用最少请求(least requested)模式,必须按如下方式反转得分值。

  1. shape:
  2. - utilization: 0
  3. score: 10
  4. - utilization: 100
  5. score: 0

resources 是一个可选参数,默认情况下设置为:

  1. resources:
  2. - name: cpu
  3. weight: 1
  4. - name: memory
  5. weight: 1

它可以像下面这样用来添加扩展资源:

  1. resources:
  2. - name: intel.com/foo
  3. weight: 5
  4. - name: cpu
  5. weight: 3
  6. - name: memory
  7. weight: 1

weight 参数是可选的,如果未指定,则设置为 1。 同时,weight 不能设置为负值。

节点容量分配的评分

本节适用于希望了解此功能的内部细节的人员。 以下是如何针对给定的一组值来计算节点得分的示例。

请求的资源:

  1. intel.com/foo : 2
  2. memory: 256MB
  3. cpu: 2

资源权重:

  1. intel.com/foo : 5
  2. memory: 1
  3. cpu: 3
  1. FunctionShapePoint {{0, 0}, {100, 10}}

节点 1 配置:

  1. 可用:
  2. intel.com/foo : 4
  3. memory : 1 GB
  4. cpu: 8
  5. 已用:
  6. intel.com/foo: 1
  7. memory: 256MB
  8. cpu: 1

节点得分:

  1. intel.com/foo = resourceScoringFunction((2+1),4)
  2. = (100 - ((4-3)*100/4)
  3. = (100 - 25)
  4. = 75 # requested + used = 75% * available
  5. = rawScoringFunction(75)
  6. = 7 # floor(75/10)
  7. memory = resourceScoringFunction((256+256),1024)
  8. = (100 -((1024-512)*100/1024))
  9. = 50 # requested + used = 50% * available
  10. = rawScoringFunction(50)
  11. = 5 # floor(50/10)
  12. cpu = resourceScoringFunction((2+1),8)
  13. = (100 -((8-3)*100/8))
  14. = 37.5 # requested + used = 37.5% * available
  15. = rawScoringFunction(37.5)
  16. = 3 # floor(37.5/10)
  17. NodeScore = (7 * 5) + (5 * 1) + (3 * 3) / (5 + 1 + 3)
  18. = 5

节点 2 配置:

  1. 可用:
  2. intel.com/foo: 8
  3. memory: 1GB
  4. cpu: 8
  5. 已用:
  6. intel.com/foo: 2
  7. memory: 512MB
  8. cpu: 6

节点得分:

  1. intel.com/foo = resourceScoringFunction((2+2),8)
  2. = (100 - ((8-4)*100/8)
  3. = (100 - 50)
  4. = 50
  5. = rawScoringFunction(50)
  6. = 5
  7. memory = resourceScoringFunction((256+512),1024)
  8. = (100 -((1024-768)*100/1024))
  9. = 75
  10. = rawScoringFunction(75)
  11. = 7
  12. cpu = resourceScoringFunction((2+6),8)
  13. = (100 -((8-8)*100/8))
  14. = 100
  15. = rawScoringFunction(100)
  16. = 10
  17. NodeScore = (5 * 5) + (7 * 1) + (10 * 3) / (5 + 1 + 3)
  18. = 7

接下来