是的,我们可以做到这一点。我目前正在做这个实验几乎与你的问题有关。
尝试在自动缩放时查找以下内容。
- HPA 计算所需副本所需的时间
- 吊舱启动所需的时间。
- 液滴旋转所需的时间。
- 吊舱减速所需的时间。
- 液滴旋转所需的时间。
案例 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