aibangjuxin / knowledge

My knowledge
1 stars 0 forks source link

HPA MEMORY #159

Open aibangjuxin opened 4 months ago

aibangjuxin commented 4 months ago

Horizontal Pod Autoscaler (HPA) 详解

Horizontal Pod Autoscaler (HPA) 通过监控 Pod 的资源利用率(如 CPU、内存等)来动态调整 Pod 的副本数量。其基本工作原理如下:

公式:

$$ \text{desiredReplicas} = \left\lceil \text{currentReplicas} \times \left( \frac{\text{currentMetricValue}}{\text{desiredMetricValue}} \right) \right\rceil $$

$$ \text{desiredReplicas} = \left\lceil \text{currentReplicas} \times \left( \frac{\text{currentMetricValue}}{\text{desiredMetricValue}} \right) \right\rceil $$

其中,ceil 表示向上取整。

describe information

根据kubernets官方文档,如果创建Horizontal Pod Autoscaler时 指定了多个指标,那么会按照每个指标分别计算扩缩的副本数,然后选择最大的那个值进行扩缩 ,比如我的场景中,内存计算后为最大值,因此理论上进行扩缩,但取最大值为2,因此副本数为2,保持不变

对于我上面的配置,HPA 将根据 CPU 和内存的利用率来调整 Pod 的副本数量。

分析 CPU

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{375}{750} \right) \right\rceil = \left\lceil 0.5 \right\rceil = 1 $$

所以,当 CPU 利用率低于 375% 时,HPA 将删除一个副本。

分析 Memory

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{40}{80} \right) \right\rceil = \left\lceil 0.5 \right\rceil = 1 $$

所以,当内存利用率低于 40% 时,HPA 将删除一个副本。

结论

虽然CPU 利用率低于375%,但内存利用率为58%,因此HPA将选择内存利用率的计算结果作为最终的副本数,即2个副本。

HPA 配置

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: aibang-deployment-hpa
  namespace: aibang
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: aibang-deployment
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 750
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

CPU 扩容和缩容的触发条件

1. 从1个副本扩容到2个副本的条件 825%

具体公式如下:

$$ \text{desiredReplicas} = \left\lceil 1 \times \left( \frac{825}{750} \right) \right\rceil = \left\lceil 1.1 \right\rceil = 2 $$

所以,当 CPU 利用率超过 825% 时,HPA 将创建第二个副本。

2. 从2个副本扩容到3个副本的条件 825%

具体公式如下:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{825}{750} \right) \right\rceil = \left\lceil 2.2 \right\rceil = 3 $$

所以,当 CPU 利用率超过 825% 时,HPA 将创建第三个副本。

3. 从3个副本缩容到2个副本的条件 500%

具体公式如下:

$$ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{675}{750} \right) \right\rceil = \left\lceil 2.7 \right\rceil = 3 $$

所以,当 CPU 利用率低于 675% 时,HPA 将不会立即删除一个副本。

再看下如果是500%的情况:

$$ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{500}{750} \right) \right\rceil = \left\lceil 3 \times 0.6666 \right\rceil = 2 $$

所以,当 CPU 利用率低于 500% 时,HPA 将删除一个副本,副本数变为 2。

4. 从2个副本缩容到1个副本的条件 375%

具体公式如下:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{675}{750} \right) \right\rceil = \left\lceil 2 \times 0.9 \right\rceil = 2 $$

所以,当 CPU 利用率低于 675% 时,HPA 将不会立即删除一个副本。

再看下如果是500%的情况:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{500}{750} \right) \right\rceil = \left\lceil 2 \times 0.6666 \right\rceil = 2 $$

所以,当 CPU 利用率低于 500% 时,HPA 将不会立即删除一个副本。

所以再看下如果是375%的情况:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{375}{750} \right) \right\rceil = \left\lceil 2 \times 0.5 \right\rceil = 1 $$

所以,当 CPU 利用率低于 375% 时,HPA 将删除一个副本,副本数变为 1。

验证结论

根据上面的分析和计算,您的结论是正确的:

  1. 从1个副本扩容到2个副本的条件是 CPU 利用率超过 825%。
  2. 从2个副本扩容到3个副本的条件是 CPU 利用率超过 825%。
  3. 从3个副本缩容到2个副本的条件是 CPU 利用率低于 500%。
  4. 从2个副本缩容到1个副本的条件是 CPU 利用率低于 375%。

Memory扩容和缩容的触发条件

公式:desiredReplicas = ceil[currentReplicas * (currentMetricValue / desiredMetricValue)] 其中,ceil 表示向上取整。

根据您的 HPA 配置,当内存利用率超过 80% 时,HPA 将尝试增加副本数量。具体来说,当内存利用率超过 80% 时,HPA 将根据以下公式计算所需的副本数量:

代入原始公式验证: desiredReplicas = ceil[3 (50 / 80)] = ceil[3 0.625] = ceil[1.875] = 2

1. 从1个副本扩容到2个副本的条件 88%

$$ \text{desiredReplicas} = \left\lceil 1 \times \left( \frac{88}{80} \right) \right\rceil = \left\lceil 1.1 \right\rceil = 2 $$

所以,当内存利用率超过 88% 时,HPA 将创建第二个副本。 例如 当内存利用率超过 90%的时候

$$ \text{desiredReplicas} = \left\lceil 1 \times \left( \frac{90}{80} \right) \right\rceil = \left\lceil 1.125 \right\rceil = 2 $$

所以,当内存利用率超过 90% 时,HPA 将创建第二个副本。

2. 从2个副本扩容到3个副本的条件 88%

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{88}{80} \right) \right\rceil = \left\lceil 2.2 \right\rceil = 3 $$

3. 从3个副本缩容到2个副本的条件 53%

$$ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{72}{80} \right) \right\rceil = \left\lceil 2.16 \right\rceil = 3 $$

所以,当内存利用率低于 72% 时,HPA 将不会立即删除一个副本。

再看下如果是70%的情况:

$$ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{70}{80} \right) \right\rceil = \left\lceil 2.625 \right\rceil = 3 $$

所以,当内存利用率低于 70% 时,HPA 将不会立即删除一个副本。

再看下如果是60%的情况:

$$ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{60}{80} \right) \right\rceil = \left\lceil 2.25 \right\rceil = 3 $$

所以,当内存利用率低于 60% 时,HPA 将不会立即删除一个副本。

再看下如果是55%的情况:

$$ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{55}{80} \right) \right\rceil = \left\lceil 2.0625 \right\rceil = 3 $$

所以,当内存利用率低于 55% 时,HPA 将不会立即删除一个副本。

再看下如果是53%的情况:

$$ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{53}{80} \right) \right\rceil = \left\lceil 1.9875 \right\rceil = 2 $$

所以,当内存利用率低于 53% 时,HPA 将删除一个副本,副本数变为 2。

4. 从2个副本缩容到1个副本的条件 40%

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{72}{80} \right) \right\rceil = \left\lceil 1.8 \right\rceil = 2 $$

所以,当内存利用率低于 72% 时,HPA 将不会立即删除一个副本。

再看下如果是70%的情况:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{70}{80} \right) \right\rceil = \left\lceil 1.75 \right\rceil = 2 $$

所以,当内存利用率低于 70% 时,HPA 将不会立即删除一个副本。

再看下如果是60%的情况:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{60}{80} \right) \right\rceil = \left\lceil 1.5 \right\rceil = 2 $$

所以,当内存利用率低于 60% 时,HPA 将不会立即删除一个副本。

再看下如果是55%的情况:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{55}{80} \right) \right\rceil = \left\lceil 1.375 \right\rceil = 2 $$

所以,当内存利用率低于 55% 时,HPA 将不会立即删除一个副本。

再看下如果是50%的情况:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{50}{80} \right) \right\rceil = \left\lceil 1.25 \right\rceil = 2 $$

所以,当内存利用率低于 50% 时,HPA 将不会立即删除一个副本。

再看下如果是40%的情况:

$$ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{40}{80} \right) \right\rceil = \left\lceil 1 \right\rceil = 1 $$

所以,当内存利用率低于 40% 时,HPA 将删除一个副本,副本数变为 1。

验证结论

根据上面的分析和计算,您的结论是正确的:

  1. 从1个副本扩容到2个副本的条件是 内存利用率超过 88%。
  2. 从2个副本扩容到3个副本的条件是 内存利用率超过 88%。
  3. 从3个副本缩容到2个副本的条件是 内存利用率低于 53%。
  4. 从2个副本缩容到1个副本的条件是 内存利用率低于 40%。

关键点:

  1. HPA 在扩容时会考虑 10% 的容差,但在缩容时会更保守。
  2. 向上取整(⌈ ⌉)确保了副本数始终是整数。
  3. HPA 在缩容时比扩容更谨慎,这有助于防止资源波动导致的频繁伸缩。

总的来说,您的理解是正确的,只是在具体数值的计算上需要小心。HPA 的行为确实如您所描述,会根据当前的资源使用情况动态调整副本数,以保持资源利用率接近目标值[1].

Citations: [1] https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ [2] https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale/ [3] https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ [4] https://qiita.com/sheepland/items/37ea0b77df9a4b4c9d80 [5] https://blog.studysapuri.jp/entry/2020/04/10/hpa

aibangjuxin commented 4 months ago

您提供的文本包含了对Horizontal Pod Autoscaler (HPA) 工作原理的详细解释以及一些具体的数学公式。以下是格式化后的数学公式:

公式:

[ \text{desiredReplicas} = \left\lceil \text{currentReplicas} \times \left( \frac{\text{currentMetricValue}}{\text{desiredMetricValue}} \right) \right\rceil ]

这个公式用于计算基于当前指标值和期望指标值的期望副本数,ceil 表示向上取整。

分析 CPU

从2个副本缩容到1个副本的条件 375%:

[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{375}{750} \right) \right\rceil = \left\lceil 0.5 \right\rceil = 1 ]

分析 Memory

从2个副本缩容到1个副本的条件 40%:

[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{40}{80} \right) \right\rceil = \left\lceil 0.5 \right\rceil = 1 ]

CPU 扩容和缩容的触发条件

  1. 从1个副本扩容到2个副本的条件 825%:

[ \text{desiredReplicas} = \left\lceil 1 \times \left( \frac{825}{750} \right) \right\rceil = \left\lceil 1.1 \right\rceil = 2 ]

  1. 从2个副本扩容到3个副本的条件 825%:

[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{825}{750} \right) \right\rceil = \left\lceil 2.2 \right\rceil = 3 ]

  1. 从3个副本缩容到2个副本的条件 500%:

[ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{500}{750} \right) \right\rceil = \left\lceil 3 \times 0.6666 \right\rceil = 2 ]

  1. 从2个副本缩容到1个副本的条件 375%:

[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{375}{750} \right) \right\rceil = \left\lceil 2 \times 0.5 \right\rceil = 1 ]

Memory扩容和缩容的触发条件

  1. 从1个副本扩容到2个副本的条件 88%:

[ \text{desiredReplicas} = \left\lceil 1 \times \left( \frac{88}{80} \right) \right\rceil = \left\lceil 1.1 \right\rceil = 2 ]

  1. 从2个副本扩容到3个副本的条件 88%:

[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{88}{80} \right) \right\rceil = \left\lceil 2.2 \right\rceil = 3 ]

  1. 从3个副本缩容到2个副本的条件 53%:

[ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{53}{80} \right) \right\rceil = \left\lceil 1.9875 \right\rceil = 2 ]

  1. 从2个副本缩容到1个副本的条件 40%:

[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{40}{80} \right) \right\rceil = \left\lceil 1 \right\rceil = 1 ]

请注意,这些公式是根据您的描述进行格式化的,确保它们在您的环境中正确显示可能需要一些调整。