如何防止在 Kubernetes 中由 HPA 创建的特定时间段内新扩展的 Pod 缩减?

Posted

技术标签:

【中文标题】如何防止在 Kubernetes 中由 HPA 创建的特定时间段内新扩展的 Pod 缩减?【英文标题】:How to prevent scale down of newly scaled up pod for specific period of time which was created by HPA in Kubernetes? 【发布时间】:2020-10-01 07:33:10 【问题描述】:

我在 DigitalOcean 中设置了一个 Kubernetes 集群。集群配置为使用 HPA(Horizo​​ntal Pod Autoscaler)自动扩展。我想防止终止在过去 1 小时内扩大规模的 pod,以避免颠簸和节省账单。 以下是相同的两个原因:

    由于不可预测的流量,有时新的 Pod 会在一小时内多次向上和向下扩展。由于应用程序的性质,50-60 个新用户需要一个新的 Pod 来处理流量。 DigitalOcean 液滴按小时收费。即使液滴上升15分钟,他们也会充电一个小时。因此,有时我们会在一小时内支付 5 滴,而这本来可以只支付 1 滴。

从documentation,我找不到与此相关的任何内容。任何相同的黑客都会有所帮助。

【问题讨论】:

【参考方案1】:

是的,我们可以做到这一点。我目前正在做这个实验,几乎与你的问题有关。

尝试在自动缩放时查找以下内容。

    HPA 计算所需副本所需的时间 吊舱启动所需的时间。 Droplet 旋转所需的时间。 吊舱减速所需的时间。 Droplet Spin down 所需的时间。

案例 1:HPA 计算所需副本 (HPA) 所需的时间

HPA 检测更改,立即或至少在 15 秒内获取指标。取决于 horizontal-pod-autoscaler-sync-period 默认设置为 15 秒。一旦 HPA 获得 Metric,它就会计算 Replica Needed。

案例 2:吊舱启动所需的时间。 (HPA)

只要 HPA 计算出所需的副本,Pod 就会开始启动。但这取决于ScaleUp Policy。您可以根据您的用例进行设置。还取决于可用的 Droplet,集群自动缩放器

例如: 您可以告诉 HPA,嘿,请在 15 秒内启动 4 个 pod 或在 20 秒内启动 100% 当前可用的 pod。

现在 HPA 将决定选择任何策略,这会产生更大的影响(副本数的大多数变化)。如果100% pods > 4 pods,第二个policy接管,否则第一个policy可以接管。 过程重复,直到到达所需的副本。

如果您需要立即增加 Pod 数量,您可以将策略设置为在 1 秒内启动 100% 的 Pod,因此它会尝试在每秒钟内启动 100% 的当前副本数,直到匹配所需的副本数。

案例 3:Droplet 旋转所需的时间。 (集群自动扩缩器)

所用时间:

用于检测待处理 pod 并开始旋转液滴的集群自动缩放器:1 min 05 secs(大约) 液滴旋转,但未就绪状态:1 min 20 secs Droplet 到每个 READY 状态:10 - 20 secs

Total Time taken to droplet Available: 2 min 40 secs (approx)

案例 4:吊舱减速所需的时间。 (HPA)

这取决于 ScalDown Policy,就像案例 2 一样。

案例 5:液滴旋转所需的时间。 (集群自动扩缩器)

在所有 Target pod 都从 Droplet 中终止之后(所用时间取决于案例 4)。

Digital Ocean 将 Taints 设置为像 DeletionCandidate...=<timestamp>:NopreferSchedule 这样的节点

污点设置十分钟后,液滴开始旋转。

结论:

如果您需要 Node 一小时来维持生命(由于按小时收费,请使用最大值) 并且不超过一小时(如果超过1小时,则计费为2小时)

您可以设置,StabilizatioWindowSeconds = 1 hr - DigitalOcean Time Interval to delete

理论上, StabilizatioWindowSeconds = 1 hr - 10 mins = 50 mins (3000 secs)

实际上 所有 Pod 终止所用的时间可能会因缩减策略、您的应用程序等而有所不同...

所以我设置了大约(根据我的情况) StabilizatioWindowSeconds = 1 hr - 20 mins = 40 mins (2400 secs)

因此,您的 Scaled up pod 现在可以存活 40 分钟,并在 40 分钟后开始终止(在我的情况下,所有 pod 最多在 5 分钟内终止)。所以平衡 15 分钟让数字海洋摧毁水滴。

注意:计算的时间取决于我的用例和环境等。

添加 HPA 行为配置以供参考

behavior:
    scaleDown:
      stabilizationWindowSeconds: 2400
      selectPolicy: Max
      policies:
      - type: percent
        value: 100
        periodSeconds: 15
    scaleUp:
      stabilizationWindowSeconds: 0
      selectPolicy: Max
      policies:
      - type: Percent
        value: 100
        periodSeconds: 1

【讨论】:

以上是关于如何防止在 Kubernetes 中由 HPA 创建的特定时间段内新扩展的 Pod 缩减?的主要内容,如果未能解决你的问题,请参考以下文章

HPA 缩减 kubernetes pod

Kubernetes 弹性伸缩全场景解析 - HPA 实践手册

Kubernetes pod cpu 使用率计算方法 HPA

具有 2 个或更多指标的 kubernetes HPA 的行为如何——尤其是副本数计算?

在 Kubernetes 中为 Statefulset 应用 HPA?

云原生之kubernetes实战kubernetes集群的HPA弹性伸缩