Open aibangjuxin opened 4 months ago
您提供的文本包含了对Horizontal Pod Autoscaler (HPA) 工作原理的详细解释以及一些具体的数学公式。以下是格式化后的数学公式:
[ \text{desiredReplicas} = \left\lceil \text{currentReplicas} \times \left( \frac{\text{currentMetricValue}}{\text{desiredMetricValue}} \right) \right\rceil ]
这个公式用于计算基于当前指标值和期望指标值的期望副本数,ceil
表示向上取整。
从2个副本缩容到1个副本的条件 375%:
[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{375}{750} \right) \right\rceil = \left\lceil 0.5 \right\rceil = 1 ]
从2个副本缩容到1个副本的条件 40%:
[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{40}{80} \right) \right\rceil = \left\lceil 0.5 \right\rceil = 1 ]
[ \text{desiredReplicas} = \left\lceil 1 \times \left( \frac{825}{750} \right) \right\rceil = \left\lceil 1.1 \right\rceil = 2 ]
[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{825}{750} \right) \right\rceil = \left\lceil 2.2 \right\rceil = 3 ]
[ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{500}{750} \right) \right\rceil = \left\lceil 3 \times 0.6666 \right\rceil = 2 ]
[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{375}{750} \right) \right\rceil = \left\lceil 2 \times 0.5 \right\rceil = 1 ]
[ \text{desiredReplicas} = \left\lceil 1 \times \left( \frac{88}{80} \right) \right\rceil = \left\lceil 1.1 \right\rceil = 2 ]
[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{88}{80} \right) \right\rceil = \left\lceil 2.2 \right\rceil = 3 ]
[ \text{desiredReplicas} = \left\lceil 3 \times \left( \frac{53}{80} \right) \right\rceil = \left\lceil 1.9875 \right\rceil = 2 ]
[ \text{desiredReplicas} = \left\lceil 2 \times \left( \frac{40}{80} \right) \right\rceil = \left\lceil 1 \right\rceil = 1 ]
请注意,这些公式是根据您的描述进行格式化的,确保它们在您的环境中正确显示可能需要一些调整。
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
kubectl describe hpa aibang-deployment-hpa -n aibang
kubectl get hpa aibang-deployment-hpa -n aibang
根据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 配置
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。
验证结论
根据上面的分析和计算,您的结论是正确的:
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。
验证结论
根据上面的分析和计算,您的结论是正确的:
关键点:
总的来说,您的理解是正确的,只是在具体数值的计算上需要小心。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