作者:之卫
前语
云核算带来的优势之一便是弹性才能,云原生场景下 Kubernetes 供给了水平弹性扩容才能(HPA),让运用能够跟着实时目标进行扩/缩。然而 HPA 的实践作业状况或许和咱们直观预想的状况是不一样的,这儿面存在一些认知误区。本文总结了一下 EDAS 用户在运用 HPA 经常遇到的三个认知误区,详细如下:
误区一:HPA 存在扩容死区
现象:当 Request=Limit 时,希望运用率超越 90%时,无法正常扩容。
原因分析:HPA 中存在容忍度(默以为 10%),目标改变起伏小于容忍度时,HPA 会疏忽本次扩/缩动作。若当希望运用率为 90%时,则实践运用率在 81%-99%之间,都会被 HPA 疏忽。
避坑攻略:当 Request=Limit 时,防止设置过高的希望运用率,一来防止扩容死区;二来被迫扩容有必定的迟滞时刻,留下更多的缓冲余量以应对突增流量。
误区二:误解运用率核算方法,HPA 扩容与预期运用量不符
现象:当 Limit > Request 时,装备 50%的运用率,运用量未到达 Limit 的 50%便扩容。
原因分析:HPA 核算运用率是根据 Request 核算,当 Limit > Request 时,实践运用率是能够超越 100%。
避坑攻略:关于较为重要的运用,应当设置 Request=Limit 确保资源的独占。关于能够容忍资源共享的运用,对应的希望运用率也不该设置的过高,在集群资源紧张时,超量运用资源的 Pod 很有或许会被杀死,然后造成服务中止。
误区三:弹性行为总是滞后的,扩缩行为与心思预期不符
现象:目标突增时,HPA 不会马上扩容,且扩容或许是分屡次进行,终究安稳时的实例数也与预期不同。
原因分析:HPA 的规划架构决议了,HPA 扩/缩容总是滞后的,且扩/缩容收到弹性行为(behavior)与容忍度共同效果。其间弹性行为约束了扩/缩容速率,不会一口气扩/缩到希望实例数。而容忍度会疏忽目标的小起伏改变,然后导致在屡次扩容的场景下,终究核算的实例数或许与一开始核算出的实例数不同。
避坑攻略:阅览下文了解一下 HPA 作业原理,装备合理的弹性行为(behavior)。
HPA 作业机理
在打破认知误区前,咱们有必要梳理一下 HPA 的作业机理。
如图所示,HPA 控制器履行弹性功用首要分为四个过程:
- 监听 HPA 资源,一旦生成 HPA 资源或者是更改 HPA 装备,HPA 控制器能及时感知并调整。
- 从 Metrics API 获取对应的目标数据,这儿的 Metrics Server 又能够分为三类:
-
- Kubernetes MetricServer:供给容器等级CPU/内存运用量
- Custom MetricServer:供给来自Kubernetes集群自界说资源的目标数据
- External MetricServer:供给来自Kubernetes集群外的目标数据
- 每个目标项单独核算希望实例数,最后取所有希望实例数中的最大值,作为当时作业负载的希望实例数
- 调整对应的作业负载
其间过程 2-4 约每 15 秒履行一次,如需改变时刻周期,能够调整 KCM 的装备参数–horizontal-pod-autoscaler-sync-period。
数据源
如上图所示,HPA 现在供给了五种目标来历,以及三种目标服务(MetricsServer),简单介绍如下:
- Resource:供给 Pod 等级的 CPU/内存运用量
- ContainerResource:供给容器等级的 CPU/内存运用量
- Object:供给 Kubernetes 集群内任意资源的相关目标
- Pods:供给 Kubernetes集群内 pod 相关的目标
- External:供给 Kubernetes 集群外的目标数据
值得一提的是,在自建 Kubernetes 场景下,这三种 MetricsServer 都需求额外装置,它们均运转于 KCM 之外。下表列举了几种 Kubernetes 集群 MetricsServer 的部署状况。
自建Kubernetes | 阿里云容器服务 | EDAS托管集群 | |
---|---|---|---|
Kubernetes MetricsServer | 手动装置 | 主动装置 | 主动装置 |
Custom MetricsServer(如Prometheus Adapter) | 手动装置 | 手动装置 | 手动装置 |
External MetricsServer(如KEDA) | 手动装置 | 手动装置 | 主动装置 |
目标核算方法
HPA 供给了三种希望值类型:
- 总量(Value)
- 均匀量(AverageValue)= 总量 / 当时实例数
- 运用率(Utilization)= 均匀量 / Request
值得一提的是,运用率是根据 Request 进行核算的,所以没有设置 Request 的场景下,HPA 或许无法正常作业。
下图介绍了五种目标来历支撑的希望类型,不难看出所有目标来历都支撑均匀量。
关于单个目标的希望实例数核算规矩如下:
这儿面引进了容忍度的概念,即以为在希望值邻近小规模的颤动是能够容忍疏忽的。这个参数的来历是因为目标值是一个一直在颤动改变的值,假如不疏忽微小的改变,那么很有或许造成运用不断的扩容缩容,从而影响整个体系的安稳性。
如下图所示,当目标值落入粉色区域内(容忍度规模)时,希望实例数等于当时实例数。粉色区域(容忍度规模)的上下限分别是 0.9 倍希望值与 1.1 倍希望值。
关于装备了多条目标规矩,终究希望实例数核算规矩如下:
其间 target1, …, target n 分别是每个目标核算出来的希望实例数。
用一句话简要归纳核算方法:单个目标动摇小时疏忽不计,多个目标之间取最大值,终究实例数会落在下限和上限之间。
扩缩行为
在某些状况下,目标数据会有一个频频且大起伏的颤动。如下图所示的一段 CPU 目标数据,存在一些目标颤动或间歇流量下降导致运用率下降,目标的改变规模现已超出了容忍度的规模。此刻,从运用安稳性角度来看,咱们不希望运用缩容。为了解决这个问题,HPA引进了装备来控制扩缩容,即扩缩行为(behavior),它是在HPA(autoscaling/v2beta2)中引进,要求 Kubernetes 集群版别>=1.18。
HPA 的弹性行分为扩容行为和缩容行为。行为详细由以下三部分组成:
- 安稳窗口:安稳窗口会参阅曩昔一段时刻核算出的希望实例数,选取极值作为终究成果,然后确保体系在一段时刻窗口内是安稳的。关于扩容取极小值,关于缩容取极大值。
- 步长战略:约束一段时刻内实例改变的规模。由步长类型、步长值、时刻周期三个部分组成。值得一提的是时刻周期这个概念与上述的安稳窗口是两回事,此处的时刻周期界说了回溯多长历史时刻,核算实例数改变状况。
- 挑选战略:用于选取多个步长战略核算后的成果,支撑 取最大值、取最小值、关闭 这三种战略。
回忆与总结
至此,咱们现已大致了解了 HPA 的作业机理。合理运用 HPA 能够有用提高资源运用率,在这之中咱们总结了一些注意事项,熟记这些点能够在运用 HPA 时“有用避坑”。
- HPA 的规划架构导致了 HPA 只能被迫响应目标进行弹性扩缩,这种形式下,弹性滞后是必定存在的。现在阿里云容器服务推出了带猜测才能的 AHPA,能够有用减少弹性迟滞。
- HPA 的运用率核算方法是根据 Request,实践运用率/希望运用率超越 100%是正常的,装备较高的希望运用率需求合理规划集群资源和审视相应风险。
- HPA 中的容忍度概念能缓解目标动摇带来的体系震动问题,但与此同时引进的扩容死区问题需求运维人员避开。
- HPA 的规划架构允许扩展各种类型目标,需求开发/装置相应的 MetricsServer,如 EDAS 则为用户供给了微服务 RT 和 QPS 目标。
- HPA 中存在扩缩容行为,即使不装备相应参数也有默许行为,扩容行为的安稳窗口默许是 0,假如运用常因噪声数据造成扩容,能够设置一个较短的扩容安稳窗口躲避尖锐噪声。
- 单个 HPA 支撑装备多个目标进行弹性,切勿对单个运用装备多个 HPA,会相互影响,导致运用震动。
云原生场景下弹性才能更为丰富,可供弹性的目标也更具有事务定制才能。运用 PaaS 平台(如企业级分布式运用服务 EDAS)能结合云厂商在核算、存储、网络上的技术根底才能,能让运用云的本钱更低。但是这儿关于事务运用会提出一点点应战(如:无状态/装备代码解耦等等)。从更广的侧面来看,这是云原生年代运用架构面对的应战。不过运用越来越原生的话,云的技术红利也会离咱们越来越近。
参阅链接
[1] Prometheus Adapter
github.com/kubernetes-…
[2] KEDA
github.com/kedacore/ke…
[3] HorizontalPodAutoscaler Walkthrough
kubernetes.io/docs/tasks/…
[4] Resource metrics pipeline
kubernetes.io/docs/tasks/…
[5] Horizontal Pod Autoscaling
kubernetes.io/docs/tasks/…
[6] HPA 常见问题与确诊*
help.aliyun.com/document_de…
[7] EDAS 主动弹性扩缩容
help.aliyun.com/document_de…
扩展阅览
Horizontal Pod Autoscaler with Arbitrary Metrics
github.com/kubernetes/…