Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hpa #161

Open
aibangjuxin opened this issue Jul 17, 2024 · 1 comment
Open

Hpa #161

aibangjuxin opened this issue Jul 17, 2024 · 1 comment

Comments

@aibangjuxin
Copy link
Owner

学习下面这个文章https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
在 Kubernetes 中,Horizontal Pod Autoscaling(HPA)通过自动调整工作负载的 Pod 副本数量来匹配需求。其计算公式为:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
其中,ceil表示向上取整。
HPA会监控所有Pod的内存使用情况。当集群中所有Pod的平均内存使用量超过800Mi时,HPA会增加Pod的数量

  • type: Resource
    resource:
    name: memory
    target:
    type: Average
    averageValue: 800Mi
    1 我现在想确认这样一个问题 上面的这个算法是不是对memory averageValue 这种模式同样适用
    2如果同样适用我需要考虑内存的浮动比例
    那么请推断出 假设我的Pod数量从3变2 的内存的触发值大概是多少?
    3 针对我的环境 我的内存limited 有三个限制比如768Mi 1024Mi 2048Mi 三种限制
    那么我如果想让平均值分别对应其比例的90%
    那么请给出我Pod 缩小的一个可能的内存值

好的,我们来一步一步回答和推导你的问题。

回答问题

  1. 算法适用性

    • 是的,上述公式对于 memory averageValue 这种模式同样适用。HPA会基于当前的指标值(如内存使用量)与目标值(如averageValue)的比率来决定是否扩展或缩减Pod的数量。
  2. 从3个Pod缩减到2个Pod的内存触发值

    • 根据公式 desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )],我们可以推算出从3个Pod缩减到2个Pod的内存使用触发值。
  3. 计算目标值为各内存限制的90%的触发缩减值

    • 对于各内存限制值(768Mi、1024Mi、2048Mi),分别计算90%的目标值。
    • 推算出从当前Pod数量减少1个Pod的触发内存使用值。

详细计算

从3个Pod缩减到2个Pod的内存触发值

假设 currentReplicas = 3, desiredReplicas = 2, desiredMetricValue = 800Mi。

根据公式:
[ \text{desiredReplicas} = \lceil \text{currentReplicas} \times \left( \frac{\text{currentMetricValue}}{\text{desiredMetricValue}} \right) \rceil ]

设 desiredReplicas = 2:
[ 2 = \lceil 3 \times \left( \frac{\text{currentMetricValue}}{800} \right) \rceil ]

解此方程求 currentMetricValue:
[ 2 \leq 3 \times \left( \frac{\text{currentMetricValue}}{800} \right) < 3 ]
[ \frac{1600}{3} \leq \text{currentMetricValue} < 800 ]
[ 533.33 \leq \text{currentMetricValue} < 800 ]

因此,当所有Pod的平均内存使用量低于533.33Mi时,HPA会将Pod的数量从3个缩减到2个。

各内存限制下的90%目标值

内存限制 (Mi) 90% 目标值 (Mi)
768 Mi 691.2 Mi
1024 Mi 921.6 Mi
2048 Mi 1843.2 Mi

根据上面的公式,推导各内存限制下从3个Pod缩减到2个Pod的触发内存值:

  1. 768Mi 内存限制
    [ 2 = \lceil 3 \times \left( \frac{\text{currentMetricValue}}{691.2} \right) \rceil ]
    [ \frac{1382.4}{3} \leq \text{currentMetricValue} < 691.2 ]
    [ 460.8 \leq \text{currentMetricValue} < 691.2 ]

  2. 1024Mi 内存限制
    [ 2 = \lceil 3 \times \left( \frac{\text{currentMetricValue}}{921.6} \right) \rceil ]
    [ \frac{1843.2}{3} \leq \text{currentMetricValue} < 921.6 ]
    [ 614.4 \leq \text{currentMetricValue} < 921.6 ]

  3. 2048Mi 内存限制
    [ 2 = \lceil 3 \times \left( \frac{\text{currentMetricValue}}{1843.2} \right) \rceil ]
    [ \frac{3686.4}{3} \leq \text{currentMetricValue} < 1843.2 ]
    [ 1228.8 \leq \text{currentMetricValue} < 1843.2 ]

结果汇总

内存限制 (Mi) 90% 目标值 (Mi) Pod 缩小触发值 (Mi)
768 Mi 691.2 Mi 460.8 - 691.2
1024 Mi 921.6 Mi 614.4 - 921.6
2048 Mi 1843.2 Mi 1228.8 - 1843.2

这样,你可以根据上述计算结果来配置和调整你的HPA策略,以确保在合适的内存使用水平下进行Pod的扩展和缩减。

@aibangjuxin
Copy link
Owner Author

你提供的内容中包含一些错误,以下是修正后的内容:

是的,实际上 averageUtilization 和 averageValue 的触发条件在逻辑上是相似的,区别在于:

• averageUtilization:以百分比形式表示,目标是所有 Pod 的平均利用率。

• averageValue:以具体的资源值(如内存量)表示,目标是所有 Pod 的平均资源使用量。

配置示例

假设目标是内存利用率的 80%,即 averageUtilization: 80,我们来计算具体的扩缩条件。

扩容和缩容条件

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

• 内存使用达到 88%。

• 公式:

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

• 内存使用达到 88%。

• 公式:

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

• 内存使用降至 53%。

• 公式:

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

• 内存使用降至 40%。

• 公式:

配置示例
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-memory-utilization
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: your-deployment-name
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleUp:
stabilizationWindowSeconds: 300 # 300 秒的扩容稳定窗口期
policies:
- type: Pods
value: 2 # 每次最多扩展 2 个 Pod
periodSeconds: 60 # 每 60 秒检查一次
selectPolicy: Max
scaleDown:
stabilizationWindowSeconds: 300 # 300 秒的缩容稳定窗口期
policies:
- type: Pods
value: 1 # 每次最多缩减 1 个 Pod
periodSeconds: 60 # 每 60 秒检查一次
selectPolicy: Min
解释

• averageUtilization:HPA 会根据所有 Pod 的平均内存使用率进行扩缩容操作。

• 扩容和缩容的触发条件:通过配置扩容和缩容的触发条件,可以确保在内存使用量达到特定比例时进行扩容或缩容操作。

对比 averageUtilization 和 averageValue

本质上,averageUtilization 和 averageValue 在触发扩缩容的条件和逻辑上是类似的。不同的是,averageUtilization 使用百分比形式,而 averageValue 使用具体值。两者都遵循相同的公式来计算所需的副本数。

总结

无论使用 averageUtilization 还是 averageValue,HPA 的扩缩容机制都基于当前的实际指标值和目标值的比率进行计算和调整。因此,它们在触发条件和行为上没有本质区别,只是表示方式不同。通过正确配置 behavior 字段,你可以更精细地控制扩缩容的行为,以满足具体的需求。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant