预测水平伸缩(EHPA)

最近更新时间:2025-09-08 18:05:52

我的收藏

简介

EffectiveHorizontalPodAutoscaler(简称 EHPA)是 Crane 提供的弹性伸缩产品,基于社区 HPA 进行底层弹性控制,支持更丰富的弹性触发策略(预测、观测、周期),让弹性更加高效,并保障了服务的质量。详情请参见 使用 EHPA 实现基于流量预测的弹性。TKE 将该功能进行产品化包装,用户可以在控制台上一键安装配置 craned 组件,创建 EHPA,便捷实现基于流量预测的弹性伸缩。

工作原理


crane-ehpa


EHPA 的工作原理如下:
1. EffectiveHPAController 创建 HorizontalPodAutoscaler 和 TimeSeriesPrediction 对象。
2. PredictionCore 从 Prometheus 获取历史指标,通过预测算法计算,将结果记录到 TimeSeriesPrediction。
3. HPAController 通过 metric client 从 KubeApiServer 读取指标数据。
4. KubeApiServer 将请求路由到 Crane 的 MetricAdapter。
5. HPAController 计算所有指标返回的结果,得到最终的弹性副本推荐。
6. HPAController 调用 scale API 对目标应用进行扩/缩容。

预期效果

通过一个生产环境的客户案例介绍 EHPA 的实际效果。我们将生产数据在预发环境重放,对比使用 EHPA 和社区 HPA 的弹性效果。
下图的红线是应用在一天内的实际 CPU 使用量曲线,可以看到在8点,12点,晚上8点时是使用高峰。绿线是 EHPA 预测的 CPU 使用量。
craen-ehpa-metrics-chart


下图是对应的自动弹性的副本数曲线,红线是社区 HPA 的副本数曲线,绿线是 EHPA 的副本数曲线。
crane-ehpa-metrics-replicas-chart


EHPA 具有以下优势:
在流量高峰来临前提前扩容。
当流量先降后立刻升时,不进行无效缩容。
相比 HPA,弹性次数更少但更高效。

安装和配置

EHPAController 集成在 craned 中,同时依赖 Prometheus 组件获取历史指标。需要在组件管理中安装或升级最新版本的 craned,开启 EHPA 配置,并设置 Prometheus 访问地址和用户名、密码。
操作步骤如下:
1. 登录容器服务控制台,选择左侧导航栏中的 集群
2. 集群页面,选择集群 ID,进入集群的基本信息页面。
3. 选择左侧导航栏中的运维中心 > 组件管理
若已有 craned 组件,需要升级 craned 组件至最新版本,选择更新配置
若无 craned 组件,需要安装 craned 组件,在新建组件管理页面,选择 craned,并选择参数配置
4. Craned 组件参数设置页面,勾选是否开启 ehpa,并设置 Prometheus 数据查询地址、用户名和密码。
5. 单击确定

创建 EHPA

控制台创建

1. 登录容器服务控制台,选择左侧导航栏中的 集群
2. 集群页面,选择集群 ID,进入集群的基本信息页面。
3. 选择运维中心 > 自动伸缩,在 EffectiveHorizontalPodAutoscaler 页面单击新建
4. 触发策略可选:
CPU:CPU 利用率(占 Request)、CPU 使用量。
内存:内存利用率(占 Request)、内存使用量。
5. 弹性预测配置可选:
Auto:Auto 策略下 EHPA 会自动执行弹性行为。默认 EHPA 的策略是 Auto。在这个模式下 EHPA 会创建一个社区的 HPA 对象并自动接管它的生命周期。我们不建议用户修改或者控制这个底层的 HPA 对象,当 EHPA 被删除时,底层的 HPA 对象也会一并删除。
Preview:Preview 策略提供了一种让 EHPA 不自动执行弹性的能力。用户可以通过 EHPA 的 desiredReplicas 字段观测 EHPA 计算出的副本数。用户可以随时在两个模式间切换,当用户切换到 Preview 模式时,可以通过 spec.specificReplicas 调整应用的副本数,如果 spec.specificReplicas 为空,则不会对应用执行弹性,但是依然会执行副本数的计算。




YAML 创建

您也可以通过编写 YAML 文件来创建 EHPA。需要通过 Kubectl 创建。以下是一个示例:
apiVersion: autoscaling.crane.io/v1alpha1
kind: EffectiveHorizontalPodAutoscaler
metadata:
name: test
namespace: default
spec:
maxReplicas: 10
minReplicas: 1
metrics:
- resource:
name: cpu
target:
averageValue: "2"
type: AverageValue
type: Resource
prediction:
predictionAlgorithm:
algorithmType: dsp
dsp:
estimators: {}
historyLength: 7d
sampleInterval: 60s
predictionWindowSeconds: 3600
scaleStrategy: Auto
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
通过下面的命令创建 EHPA:
vim pod1.yaml
kubectl apply -f pod1.yaml