水平吊舱自动定量

水平Pod自动缩放器根据观察到的CPU利用率(或使用自定义指标对其他应用程序提供的指标的支持)。注意,水平Pod自动缩放不适用于无法缩放的对象,例如DaemonSets。

水平吊舱自动缩放器作为Kubernetes API资源和控制器实现。资源决定控制器的行为。控制器定期调整复制控制器或部署中副本的数量,以使观察到的指标(如平均CPU利用率、平均内存利用率或任何其他自定义指标)与用户指定的目标相匹配。

水平吊舱自动秤是如何工作的?

水平Pod自动缩放图

水平Pod自动缩放器是作为一个控制回路实现的,其周期由控制器管理器控制——horizontal-pod-autoscaler-sync-period标志(默认值为15秒)。

在每个期间,控制器管理器根据每个HorizontalPodAutoscaler定义中指定的度量查询资源利用率。控制器管理器从资源度量API(针对每个pod资源度量)或自定义度量API(针对所有其他度量)获取度量。

  • 对于每个Pod的资源指标(如CPU),控制器从HorizontalPodAutoscaler所针对的每个Pod的资源指标API中获取指标。然后,如果设置了目标利用率值,控制器将按照每个Pod中容器上的等效资源请求的百分比计算利用率值。如果设置了目标原始值,则直接使用原始度量值。然后,控制器在所有目标pod上取利用率或原始值的平均值(取决于指定的目标类型),并生成一个用于扩展所需副本数量的比率。

    请注意,如果一些Pod的容器没有设置相关的资源请求,Pod的CPU利用率将不会被定义,自动缩放器将不会对该指标采取任何操作。看到算法细节部分以获取关于自动缩放算法如何工作的更多信息。

  • 对于每荚自定义指标,控制器的功能类似于每荚资源指标,除了它使用原始值,而不是利用率值。

  • 对于对象度量和外部度量,将获取单个度量,该度量描述了所讨论的对象。将该指标与目标值进行比较,以产生如上所述的比率。在自动定量/ v2beta2API版本,在进行比较之前,这个值可以选择除以Pods的数量。

HorizontalPodAutoscaler通常从一系列聚合的api (metrics.k8s.io,custom.metrics.k8s.io,external.metrics.k8s.io).这个metrics.k8s.ioAPI通常由metrics server提供,需要单独启动。有关资源指标的更多信息,请参阅度量服务器

看到支持指标api为更多的细节。

autoscaler通过使用scale子资源访问相应的可扩展控制器(如复制控制器、部署和副本集)。Scale是一个界面,允许您动态设置副本的数量并检查它们的每个当前状态。有关scale子资源的更多详细信息,请参见在这里

算法细节

从最基本的角度来看,Horizontal Pod Autoscaler控制器操作于所需公制值和当前公制值之间的比率:

[currentReplicas * (currentMetricValue / desiredMetricValue)]

例如,如果当前度量值为200米,期望值为100米,复制的数量将增加一倍,因为200.0 / 100.0 == 2.0如果当前值为50米,我们将复制的数量减半,因为50.0 / 100.0 == 0.5. 如果比率足够接近1.0(在全局可配置公差范围内,从——horizontal-pod-autoscaler-tolerance标志,默认为0.1)。

当一个targetAverageValuetargetAverageUtilization是指定的,currentMetricValue是通过对HorizontalPodAutoscaler的缩放目标中所有pod的给定度量值取平均值来计算的。然而,在检查公差和决定最终值之前,我们将考虑pod就绪和缺失的度量。

所有带有删除时间戳集的Pods(即关闭过程中的Pods)和所有失败的Pods将被丢弃。

如果一个特定的Pod缺少指标,它将被留到以后使用;缺少度量的豆荚将用于调整最终的缩放量。

当扩展CPU时,如果任何pod还没有准备好(即它仍在初始化)豆荚最近的度量点是在它准备好之前,豆荚也被放在一边。

由于技术限制,HorizontalPodAutoscaler控制器在确定是否留出某些CPU指标时,无法准确确定pod第一次准备就绪的时间。相反,如果一个Pod还没有准备好,并且在启动后的一个可配置的短时间内转换为未准备好,它会认为该Pod“还没有准备好”。此值配置为——horizontal-pod-autoscaler-initial-readiness-delay标记,其默认值为30秒。一旦pod准备好了,它认为任何准备就绪的转换都是第一次,如果它发生在启动后较长的可配置时间内。该值配置为——horizontal-pod-autoscaler-cpu-initialization-period标志,其默认值为5分钟。

这个currentMetricValue / desiredMetricValue然后使用剩余的豆荚计算基础比例,不保留或丢弃从上面。

如果有任何缺失的指标,我们将更保守地重新计算平均值,假设这些豆荚在规模下降时消耗了所需值的100%,在规模上升时消耗了0%。这降低了任何潜在规模的大小。

此外,如果存在任何尚未就绪的豆荚,我们将在不考虑缺失的指标或尚未就绪的豆荚的情况下扩大规模,我们保守地假设尚未就绪的豆荚消耗了所需的指标的0%,进一步抑制了扩大的幅度。

在考虑到尚未就绪的豆荚和缺失的指标之后,我们重新计算使用率。如果新比率与刻度方向相反,或者在公差范围内,则跳过刻度。否则,我们使用新的比例来缩放。

请注意原始平均利用率的值通过HorizontalPodAutoscaler状态报告回来,而不考虑尚未就绪的Pod或缺少的指标,即使使用了新的使用率。

如果在HorizontalPodAutoscaler中指定了多个指标,则对每个指标进行计算,然后选择所需副本计数中最大的一个。如果这些指标中的任何一个都不能转换成所需的复制计数(例如,由于从指标api中获取指标的错误),并且可以获取的指标建议缩小规模,那么伸缩将被跳过。这意味着,如果一个或多个指标给出一个渴望救济大于当前值。

最后,在HPA缩放目标之前,会记录缩放建议。控制器考虑可配置窗口内的所有建议,从该窗口中选择最高建议。可以使用——horizontal-pod-autoscaler-downscale-stabilization标志,默认为5分钟。这意味着缩小将逐渐发生,消除快速波动的度量值的影响。

API对象

水平Pod自动缩放器是Kubernetes中的一个API资源自动缩放API。当前的稳定版本只支持CPU自动伸缩,可以在自动定量/ v1API版本。

beta版本包括对内存扩展和自定义指标的支持,可以在自动定量/ v2beta2. 年引进的新领域自动定量/ v2beta2在使用自动定量/ v1

当您创建HorizontalPodAutoscaler API对象时,确保指定的名称是有效的DNS域名.关于这个API对象的更多细节可以在HorizontalPodAutoscaler对象

在kubectl中支持水平Pod自动scaler

与所有API资源一样,Horizontal Pod Autoscaler也以标准方式由kubectl.我们可以用kubectl创建命令。我们可以列出自动缩放器kubectl获得hpa并得到详细的描述kubectl描述hpa.最后,我们可以使用kubectl删除hpa

此外,还有一个特别的kubectl自动定量命令创建HorizontalPodAutoscaler对象。例如,执行Kubectl autoscale rs foo——min=2——max=5——cpu-percent=80将为复制集创建自动缩放器喷火,目标CPU利用率设置为80%复制的数量在2到5之间。详细的文档德赢是不是大平台kubectl自动定量可以找到在这里

滚动更新期间的自动缩放

Kubernetes允许在部署上执行滚动更新。在这种情况下,Deployment会为您管理底层的ReplicaSets。当您为部署配置自动伸缩时,您将HorizontalPodAutoscaler绑定到单个部署。HorizontalPodAutoscaler管理复制品部署的领域。部署控制器负责设置复制品,以便它们在推出期间和之后加起来都是一个合适的数字。

如果对具有自动缩放副本数量的StatefulSet执行滚动更新,则StatefulSet将直接管理它的Pods集合(不存在类似于ReplicaSet的中间资源)。

支持冷却/延迟

当使用Horizontal Pod Autoscaler管理一组副本的规模时,副本的数量可能会由于所评估指标的动态特性而频繁波动。这有时被称为抖动

从v1.6开始,集群操作符可以通过调优作为标志的全局HPA设置来缓解这个问题kube-controller-manager组件:

从v1.12开始,新的算法更新消除了对高标度延迟的需要。

  • ——horizontal-pod-autoscaler-downscale-stabilization:指定缩尺稳定时间窗口的持续时间。水平吊舱自动缩放器会记住历史推荐的尺寸,并且只作用于此时间窗口内的最大尺寸。默认值为5分钟(5 m0).

对资源度量的支持

任何HPA目标都可以根据伸缩目标中豆荚的资源使用情况进行伸缩。在定义pod规范时,资源请求如下中央处理器内存应指定。这用于确定资源利用率,并由HPA控制器用于向上或向下扩展目标。要使用基于资源利用率的缩放,请指定如下度量源:

类型:资源资源:的名字:中央处理器目标:类型:利用averageUtilization:60

有了这个指标,HPA控制器将保持豆荚的平均利用率在60%的缩放目标。利用率是当前资源使用与豆荚请求资源之间的比率。看到算法有关如何计算和平均利用率的更多详细信息。

容器资源度量

功能状态: Kubernetes v1.20(α)

水平足自动秤还支持容器度量源,其中HPA可以跨一组POD跟踪单个容器的资源使用情况,以便扩展目标资源。这允许您为特定Pod中最重要的容器配置缩放阈值。例如,如果您有一个web应用程序和一个日志侧车,则可以根据web应用程序的资源使用情况进行扩展,而忽略侧车容器及其资源使用情况。

如果修改目标资源以使其具有具有不同容器集的新Pod规范,则如果新添加的容器也应用于伸缩,则应修改HPA规范。如果度量源中的指定容器不存在或只存在于豆荚的子集中,那么这些豆荚将被忽略,并重新计算建议。看到算法有关计算的更多细节。要使用容器资源进行自动伸缩,定义一个度量源如下:

类型:ContainerResourcecontainerResource:的名字:中央处理器容器:应用目标:类型:利用averageUtilization:60

在上面的例子中,HPA控制器调整目标,使cpu的平均利用率应用所有豆荚的容器为60%。

支持多种指标

Kubernetes 1.6增加了基于多个指标的扩展支持。你可以使用自动定量/ v2beta2API版本,以指定水平Pod自动缩放器可伸缩的多个指标。然后,水平Pod自动缩放控制器将评估每个度量,并提出基于该度量的新尺度。新比额表将采用拟议比额表中最大的一个。

支持自定义指标

Kubernetes 1.6增加了在水平Pod自动scaler中使用自定义指标的支持。控件中可以为水平Pod自动缩放器添加自定义指标自动定量/ v2beta2API。然后Kubernetes查询新的定制指标API以获取适当的定制指标的值。

看到支持指标api的需求。

支持指标api

默认情况下,HorizontalPodAutoscaler控制器从一系列api中检索指标。为了让它访问这些api,集群管理员必须确保:

  • 这个API聚合层启用。

  • 相应的api已注册:

    • 对于资源度量,这是metrics.k8s.ioAPI,通常由metrics-server.它可以作为一个集群插件启动。

    • 对于自定义指标,这是custom.metrics.k8s.io应用程序编程接口。它由metrics解决方案供应商提供的“适配器”API服务器提供。检查您的度量管道,或已知解决方案列表.如果你想自己写,请查看样板开始。

    • 对于外部指标,这是external.metrics.k8s.ioAPI。它可以由上面提供的自定义度量适配器提供。

有关这些不同度量路径及其差异的更多信息,请参阅的相关设计方案HPA V2,custom.metrics.k8s.ioexternal.metrics.k8s.io

关于如何使用它们的例子,请看使用自定义度量的演练使用外部度量的演练

支持可配置的伸缩行为

v1.18这个v2beta2API允许通过HPA配置伸缩行为行为字段。行为被分别指定用于向上和向下缩放鳞片scaleDown下一节行为字段。可以为两个方向指定一个稳定窗口,以防止缩放目标中的副本数目的振荡。类似地,指定扩展策略可以控制扩展时副本的更改速率。

缩放策略

属性中可以指定一个或多个伸缩策略行为节。当指定多个策略时,允许最大更改量的策略是默认选择的策略。下面的例子展示了这种行为:

行为:scaleDown:政策:-类型:豆荚价值:4.周期秒:60-类型:百分比价值:10周期秒:60

周期秒指示过去的时间长度,该策略必须保持为真。第一个政策(舱)一分钟内最多可缩小4个副本。第二个政策(百分比)允许最多10%的当前副本在一分钟内被缩小。

由于默认情况下选择允许最大更改量的策略,所以只有当pod副本的数量超过40时才会使用第二个策略。对于40个或更少的副本,将应用第一个策略。例如,如果有80个副本,目标必须缩小到10个副本,那么在第一步中将减少8个副本。在下一次迭代中,当复制数为72时,10%的豆荚是7.2,但这个数字四舍五入为8。在自动缩放控制器的每个循环上,将根据当前副本的数量重新计算要更改的豆荚数量。当副本数量降到40以下时,第一个策略(舱)应用,一次将减少4个副本。

属性可以更改策略选择selectPolicy缩放方向的场。通过将值设置为最小值它将选择允许对副本计数进行最小更改的策略。将值设置为禁用完全禁止向那个方向扩展。

稳定的窗口

当用于缩放的指标持续波动时,稳定窗口用于限制副本的振荡。自动缩放算法使用稳定窗口来考虑从过去计算的期望状态,以防止缩放。在下面的例子中,稳定化窗口被指定为scaleDown

scaleDown:stabilizationWindowSeconds:300

当指标表明目标应该缩小时,算法会查看以前计算的所需状态,并使用指定间隔中的最高值。在上面的例子中,将考虑过去5分钟内的所有期望状态。

默认的行为

要使用自定义缩放,不必指定所有字段。只能指定需要自定义的值。这些自定义值与默认值合并。默认值与HPA算法中的现有行为匹配。

行为:scaleDown:stabilizationWindowSeconds:300政策:-类型:百分比价值:One hundred.周期秒:15鳞片:stabilizationWindowSeconds:0政策:-类型:百分比价值:One hundred.周期秒:15-类型:豆荚价值:4.周期秒:15selectPolicy:马克斯

为缩小稳定窗口300的值——horizontal-pod-autoscaler-downscale-stabilization标记(如果提供)。只有一个用于缩小的策略允许删除100%当前运行的副本,这意味着可以将缩放目标缩小到允许的最小副本。对于放大,没有稳定窗口。当指标指示应放大目标时,立即放大目标。有两种策略,每15秒添加4个POD或100%当前运行的副本,直到HPA达到稳定状态。

例如:改变降级稳定窗口

为了提供1分钟的自定义降级稳定窗口,以下行为将被添加到HPA中:

行为:scaleDown:stabilizationWindowSeconds:60

例如:限制缩放率

为了将HPA脱除豆荚的速率限制在10% /分钟,我们将在HPA中添加以下行为:

行为:scaleDown:政策:-类型:百分比价值:10周期秒:60

要确保每分钟删除的pod不超过5个,可以添加第二个缩小策略,其大小固定为5,并设置selectPolicy最低。设置selectPolicy最小值意味着自动缩放器选择影响最小pod数量的策略:

行为:scaleDown:政策:-类型:百分比价值:10周期秒:60-类型:豆荚价值:5.周期秒:60selectPolicy:最小值

例如:disable scale down

这个selectPolicy价值禁用关闭缩放给定方向。因此,为了防止缩减规模,将使用以下政策:

行为:scaleDown:selectPolicy:禁用

隐式维护模式停用

您可以隐式地停用目标的HPA,而不需要更改HPA配置本身。如果目标的所需副本数设置为0,并且HPA的最小副本数大于0,则HPA停止调整目标(并设置ScalingActive以自身为条件),直到通过手动调整目标的期望副本计数或HPA的最小副本计数重新激活它。

接下来是什么

最后修改时间为2021年9月9日太平洋标准时间上午6:50:改进:从HPA中删除堆内容。(# 29547) (975 bd9e9b)