6

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

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

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

4

1 回答 1

0

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

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

  1. HPA 计算所需副本所需的时间
  2. 吊舱启动所需的时间。
  3. 液滴旋转所需的时间。
  4. 吊舱减速所需的时间。
  5. 液滴旋转所需的时间。

案例 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 个吊舱或在 20 秒内启动 100% 的当前可用吊舱。

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

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

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

所用时间:

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

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

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

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

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

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

Digital Ocean 将 Taints 设置为类似节点DeletionCandidate...=<timestamp>:NopreferSchedule

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

结论:

如果您需要节点一小时才能保持活力(由于按小时收费,最多使用)并且不超过一小时(如果超过 1 小时,则按 2 小时计费)

您可以设置,StabilizatioWindowSeconds = 1 hr - 要删除的 DigitalOcean 时间间隔

理论上, 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
于 2021-06-10T14:12:13.493 回答