如何防止在 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(Horizontal 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 缩减?的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 弹性伸缩全场景解析 - HPA 实践手册
Kubernetes pod cpu 使用率计算方法 HPA
具有 2 个或更多指标的 kubernetes HPA 的行为如何——尤其是副本数计算?