k8s与HPA--基于水位线算法的 Pod AutoScaler

总览

Watermark Pod Autoscaler (WPA) 控制器是一个自定义控制器,相比Horizontal Pod Autoscaler (HPA),扩展了很多功能。

特性

  • 设置上限和下限以防止异常。
  • 指定缩放速度。
  • 指定时间窗口以限制放大或缩小事件。
  • 支持不同的算法来计算所需副本数。

目标

该项目旨在解决上游 pod autoscaler控制器面临的内部限制。许多团队需要花费大量的人工来自动缩放。他们不能依赖HPA,因为逻辑太简单了。

WPA扩展了HPA。我们认为,WPA控制器的许多(如果不是全部)功能应该包含在HPA中。

虽然我们在内部使用WPA,但我们也想提交KEP,以建议上游功能并将其提供给社区。

使用场景

如果要自动缩放某些应用程序,但是:

  • HPA的单一阈值逻辑还不够。
  • 您需要指定特定于您的应用程序的禁止窗口。
  • 您想限制缩放速度。

WPA旨在解决HPA的限制。

用法

伸缩算法

有两个选项可以计算所需的副本数。根据您的用例,您可能需要考虑以下之一:

  • average 来自外部度量提供者的值/当前副本数得出的比率,并与水位进行比较。推荐的副本数是来自外部指标提供的值/水位的值(根据当前值,低或高)。

    如果您使用的度量标准不取决于副本数,则平均算法非常适合。通常,假设我们知道单个Web服务器应处理n个rqs,则ELB收到的请求数可以指示我们要拥有多少个Web服务器。添加副本不会增加或减少收到的请求数量。

  • absolute 默认值为绝对值。我们比较了来自外部指标提供商的原始平均指标,并考虑了其利用率。推荐的副本数计算为当前副本数*外部度量标准提供者/水位中的值。

    绝对算法是默认算法,因为它代表最常见的用例。例如,如果您希望应用程序在60%到80%的CPU之间运行,而avg:cpu.usage为85%,则需要扩展。度量必须与副本数相关。

    PS: 在上游控制器中,仅math.Ceil函数用于舍入建议数量的副本。

    这意味着,如果您将阈值设置为10,则需要达到8.999 ...的利用率(从外部度量标准提供程序降低一个副本的规模)。但是,利用率10.001将使您按一个副本进行扩展。

如果该值在较低的水位之下,则WPA控制器将使用math.Floor。这样可以确保对称行为。结合其他缩放比例选项,可以更好地控制何时缩小比例。

操作

在与目标部署相同的名称空间中创建WPA。

Datadog Cluster Agent将接管创建/更新/删除事件。它解析WPA规范,以提取指标和范围以从Datadog获得。

示例

在本示例中,我们将使用一下配置:

    downscaleForbiddenWindowSeconds: 60
    upscaleForbiddenWindowSeconds: 30
    scaleDownLimitFactor: 30
    scaleUpLimitFactor: 50
    minReplicas: 4
    maxReplicas: 9
    metrics:
    - external:
        highWatermark: 400m
        lowWatermark: 150m
        metricName: custom.request_duration.max
        metricSelector:
          matchLabels:
            kubernetes_cluster: mycluster
            service: billing
            short_image: billing-app
      type: External
    tolerance: 0.01
界线

从水位开始,在watermarkpodautoscaler.wpa_controller_low_watermarkwatermarkpodautoscaler.wpa_controller_high_watermark边界之间,从Datadog收集的度量值(watermarkpodautoscaler.wpa_controller_value)以紫色显示,将指示控制器不要触发缩放事件。它们被指定为数量,因此您可以使用m | "" | k | M | G | T | P | E 轻松代表您要使用的值。

我们可以使用指标watermarkpodautoscaler.wpa_controller_restricted_scaling {reason:within_bounds}来验证它是否确实受到限制。注意:度量标准乘以1000是为了使其更加明确,在此期间,控制器不会触发任何定标事件。

k8s与HPA--基于水位线算法的 Pod AutoScaler_第1张图片

速率

第二组配置选项与部署的扩缩速度有关,由scaleDownLimitFactorscaleUpLimitFactor控制。这些是介于0到100之间的整数。在给定当前副本数的情况下,它们分别表示按比例缩小和按比例放大的最大比率。

在这种情况下,如果我们有10个副本,并且建议的副本数量为14(建议的更多详细信息,请参见“算法”部分),而scaleUpFactor为30(%),那么我们将限制为13个副本。

在下图中,我们可以看到,由指标watermarkpodautoscaler.wpa_controller_replicas_scaling_proposal表示的建议的副本数(紫色)与当前副本数相比过高。这将触发高级上限逻辑,可以使用度量标准watermarkpodautoscaler.wpa_controller_restricted_scaling {reason:upscale_capping}进行监视(注意:与上面相同,该度量标准被相乘以使其更加明确)。因此,副本watermarkpodautoscaler.wpa_controller_replicas_scaling_effective的有效数量将按比例缩放,但要根据scaleUpLimitFactor进行扩展。

water2.png

在这个类似的示例中,我们避免了过度缩减规模,并且可以使用同一组指标来保证我们仅缩减合理数量的副本。

water4.png

  • 如果 scaleUpLimitFactor为29%:如果我们有10个副本并建议使用13个副本,那么我们会将其扩展到12个。
  • scaleDownLimitFactor为29%:如果我们有10个副本并建议使用7,则将缩小为8。
  • 我们建议添加或删除的副本的最小数量为一(而不是零)。这是为了避免使用少量副本时出现边缘情况。
  • 请注意,选项minReplicasmaxReplicas优先。请参阅“优先级”部分。
冷却期

最后,可用的最后一个选项是downscaleForbiddenWindowSeconds和upscaleForbiddenWindowSeconds。它们分别表示在缩放事件发生后要等待多少时间(以秒为单位),然后再进行缩放。我们仅保留上一个缩放事件,并且不将upscaleForbiddenWindowSeconds与仅上次缩放的时间进行比较。

在下面的示例中,我们可以看到,如果处于冷却期,建议的副本数将被忽略。降级的冷却时间可以使用watermarkpodautoscaler.wpa_controller_transition_countdown {transition:downscale} 进行可视化,并在下图中以黄色表示。我们可以看到它显着高于图表中橙色的冷却时间(transition:upscale)。建议缩放后,只有在适当的冷却时间结束后才缩放。这将重置两个倒数计时。

k8s与HPA--基于水位线算法的 Pod AutoScaler_第2张图片

优先顺序

检索外部度量标准的值时,我们首先将其与 highWatermark + tolerance 之和与lowWatermark-tolerance 之差进行比较。如果超出范围,我们将计算建议的副本数。然后,我们将该值与当前副本数进行比较,以潜在地限制建议的副本数。最后,考虑给定downscaleForbiddenWindowSeconds和upscaleForbiddenWindowSeconds,我们看看是否允许缩放。

限制

  • 仅用于外部指标。
  • 每个WPA仅正式支持一种度量标准。
  • 不考虑将CPU标准化的副本数。
  • 在目标部署中不考虑Pod的就绪状态。
  • 与HPA相似,控制器每15秒轮询一次外部指标提供程序,每30秒刷新一次指标。

你可能感兴趣的:(docker,golang,kubernetes,k8s)