EHPA 简介
EHPA(EffectiveHorizontalPodAutoscaler)是 Crane 开源项目 提供的弹性伸缩产品。它基于社区 HPA 做底层的弹性控制,支持更丰富的弹性触发策略(预测、观测、周期),以提高弹性控制的效率,并确保服务质量。 EHPA 的主要特点包括:
提前扩容,保证服务质量:通过算法预测未来的流量洪峰,提前扩容以避免扩容不及时导致的雪崩和服务稳定性故障。
减少无效缩容:通过预测未来的需求,减少不必要的缩容,稳定工作负载的资源使用率,消除突刺误判。
支持 Cron 配置:支持基于 Cron 的弹性配置,以应对大促等异常流量洪峰。
兼容社区:使用社区 HPA 作为弹性控制的执行层,能力完全兼容社区。
安装
产品功能
基于预测的弹性
大多数在线应用的负载都具有周期性的特征。用户可以根据按天或者按周的趋势预测未来的负载。EHPA 使用 DSP 算法来预测应用未来的时间序列数据。
以下代码为一个开启了预测能力的 EHPA 模版示例:
apiVersion: autoscaling.crane.io/v1alpha1
kind: EffectiveHorizontalPodAutoscaler
spec:
prediction:
predictionWindowSeconds: 3600
predictionAlgorithm:
algorithmType: dsp
dsp:
sampleInterval: "60s"
historyLength: "3d"
监控数据兜底
在使用预测算法进行预测时,您可能会担心预测数据的准确性,因此在计算副本数时,EHPA 不仅会按预测数据计算,同时也会考虑实际监控数据来兜底,以提升弹性的安全性。具体实现原理是,当您在 EHPA 中定义 spec.metrics 并且开启弹性预测时,EffectiveHPAController 会根据策略自动生成多个 Metric Spec 来创建底层管理的 HPA。
例如,当用户在 EHPA 的 yaml 文件中定义如下 Metric Spec:
apiVersion: autoscaling.crane.io/v1alpha1
kind: EffectiveHorizontalPodAutoscaler
spec:
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
将会自动转换为两条 HPA 的阈值配置:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
spec:
metrics:
- pods:
metric:
name: crane_pod_cpu_usage
selector:
matchLabels:
autoscaling.crane.io/effective-hpa-uid: f9b92249-eab9-4671-afe0-17925e5987b8
target:
type: AverageValue
averageValue: 100m
type: Pods
- resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
type: Resource
在上述示例中,用户在 EHPA 创建的 Metric 阈值配置将自动转换为底层 HPA 上的两条 Metric 阈值配置:预测 Metric 阈值和实际监控 Metric 阈值。
预测 Metric 阈值是一个 custom metric。其值由 Crane 的 MetricAdapter 提供。
实际监控 Metric 阈值是一个 resource metric,与用户在 EHPA 中定义的相同。这样 HPA 将根据应用程序实际监控的 Metric 计算副本数。
当配置了多个弹性 Metric 阈值时,HPA 将分别计算每个 Metric 对应的副本数,并选择最大的副本数作为最终的推荐弹性结果。
水平弹性的执行流程
1. EffectiveHPAController 创建 HorizontalPodAutoscaler 和 TimeSeriesPrediction 对象。
2. PredictionCore 从 Prometheus 获取历史 metric,通过预测算法计算,将结果记录到 TimeSeriesPrediction。
3. HPAController 通过 metric client 从 KubeApiServer 读取 metric 数据。
4. KubeApiServer 将请求路由到 Crane 的 MetricAdapter。
5. HPAController 计算所有的 Metric 返回的结果,得到最终的弹性副本推荐。
6. HPAController 调用 scale API 对目标应用进行扩/缩容。
用户案例
通过一个生产环境的客户案例,向您展示 EHPA 的实际效果。本案例在预发环境中重放了生产数据,并对比了使用 EHPA 和社区的 HPA 的弹性效果。
下图中的红线代表应用在一天内的实际 CPU 使用量曲线,您可以看到在早上8点、中午12点和晚上8点时出现了使用高峰。绿线代表 EHPA 预测的 CPU 使用量。
下图是对应的自动弹性的副本数曲线,红线表示社区 HPA 的副本数曲线,绿线表示 EHPA 的副本数曲线。
可以看出 EHPA 具有以下优势:
在流量洪峰到来之前进行扩容。
当流量先下降后立即上升时,不做无效的缩容。
相比 HPA,EHPA 具有更少的弹性次数却更高效。
ScaleStrategy 弹性策略
EHPA 提供了两种弹性策略:Auto 和 Preview。您可以随时切换它并立即生效。
Auto
Auto 策略下 EHPA 会自动执行弹性行为。默认 EHPA 的策略是 Auto。在这个模式下 EHPA 会创建一个社区的 HPA 对象并自动接管它的生命周期。不建议您修改或者控制这个底层的 HPA 对象,当 EHPA 被删除时,底层的 HPA 对象也会一并删除。
Preview
Preview 策略提供了一种让 EHPA 不自动执行弹性的能力。因此,您可以通过 EHPA 的 desiredReplicas 字段观测 EHPA 计算出的副本数。您可以随时在两个模式之间切换,当您切换到 Preview 模式时,您可以通过 spec.specificReplicas 调整应用的副本数,如果 spec.specificReplicas 为空,则不会对应用执行弹性,但仍会执行副本数的计算。
以下是一个配置为 Preview 模式的 EHPA 模板示例:
apiVersion: autoscaling.crane.io/v1alpha1
kind: EffectiveHorizontalPodAutoscaler
spec:
scaleStrategy: Preview
pecificReplicas: 5
status:
expectReplicas: 4
currentReplicas: 4
本页内容是否解决了您的问题?