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

Nit*_*esh 6 autoscaling docker digital-ocean kubernetes hpa

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

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

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

ram*_*ran 2

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

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

  1. HPA 计算所需副本所需的时间
  2. Pod 旋转所需的时间。
  3. 液滴旋转所需的时间。
  4. Pod 减速所需的时间。
  5. 液滴旋转下降所需的时间。

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

HPA 检测到变化,立即或至少在 15 秒内获取指标。取决于horizontal-pod-autoscaler-sync-period默认情况下设置为 15 秒。一旦 HPA 获得指标,它就会计算所需的副本。

情况 2:Pod 旋转所需的时间。(HPA)

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

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

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

如果您需要立即扩大 Pod 数量,您可以将策略设置为在 1 秒内旋转 100% 的 Pod,因此它会尝试在每一秒内旋转当前副本数量的 100%,直到与所需的副本数量匹配。

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

所用时间:

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

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

情况 4:吊舱旋转所需的时间。(HPA)

这取决于缩减策略,如案例 2 所示。

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

所有 Target 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
Run Code Online (Sandbox Code Playgroud)