预测水平伸缩(EHPA)

最近更新时间:2024-10-29 15:56: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. 选择左侧导航栏中的运维中心 > 组件管理
4. 升级 craned 组件至最新版本,选择更新配置;或安装 craned 组件,选择参数配置
5. 勾选是否开启 ehpa,设置 Prometheus 访问地址、用户名和密码,单击确定。如下图所示:




创建 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。以下是一个示例:
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