作者:之卫

前语

云核算带来的优势之一便是弹性才能,云原生场景下 Kubernetes 供给了水平弹性扩容才能(HPA),让运用能够跟着实时目标进行扩/缩。然而 HPA 的实践作业状况或许和咱们直观预想的状况是不一样的,这儿面存在一些认知误区。本文总结了一下 EDAS 用户在运用 HPA 经常遇到的三个认知误区,详细如下:

误区一:HPA 存在扩容死区

现象:当 Request=Limit 时,希望运用率超越 90%时,无法正常扩容。

原因分析:HPA 中存在容忍度(默以为 10%),目标改变起伏小于容忍度时,HPA 会疏忽本次扩/缩动作。若当希望运用率为 90%时,则实践运用率在 81%-99%之间,都会被 HPA 疏忽。

避坑攻略:当 Request=Limit 时,防止设置过高的希望运用率,一来防止扩容死区;二来被迫扩容有必定的迟滞时刻,留下更多的缓冲余量以应对突增流量。

Kubernetes HPA 的三个误区与避坑指南

误区二:误解运用率核算方法,HPA 扩容与预期运用量不符

现象:当 Limit > Request 时,装备 50%的运用率,运用量未到达 Limit 的 50%便扩容。

原因分析:HPA 核算运用率是根据 Request 核算,当 Limit > Request 时,实践运用率是能够超越 100%。

避坑攻略:关于较为重要的运用,应当设置 Request=Limit 确保资源的独占。关于能够容忍资源共享的运用,对应的希望运用率也不该设置的过高,在集群资源紧张时,超量运用资源的 Pod 很有或许会被杀死,然后造成服务中止。

Kubernetes HPA 的三个误区与避坑指南

误区三:弹性行为总是滞后的,扩缩行为与心思预期不符

现象:目标突增时,HPA 不会马上扩容,且扩容或许是分屡次进行,终究安稳时的实例数也与预期不同。

原因分析:HPA 的规划架构决议了,HPA 扩/缩容总是滞后的,且扩/缩容收到弹性行为(behavior)与容忍度共同效果。其间弹性行为约束了扩/缩容速率,不会一口气扩/缩到希望实例数。而容忍度会疏忽目标的小起伏改变,然后导致在屡次扩容的场景下,终究核算的实例数或许与一开始核算出的实例数不同。

避坑攻略:阅览下文了解一下 HPA 作业原理,装备合理的弹性行为(behavior)。

Kubernetes HPA 的三个误区与避坑指南

HPA 作业机理

在打破认知误区前,咱们有必要梳理一下 HPA 的作业机理。

Kubernetes HPA 的三个误区与避坑指南

如图所示,HPA 控制器履行弹性功用首要分为四个过程:

  1. 监听 HPA 资源,一旦生成 HPA 资源或者是更改 HPA 装备,HPA 控制器能及时感知并调整。
  2. 从 Metrics API 获取对应的目标数据,这儿的 Metrics Server 又能够分为三类:
    1. Kubernetes MetricServer:供给容器等级CPU/内存运用量
    2. Custom MetricServer:供给来自Kubernetes集群自界说资源的目标数据
    3. External MetricServer:供给来自Kubernetes集群外的目标数据
  1. 每个目标项单独核算希望实例数,最后取所有希望实例数中的最大值,作为当时作业负载的希望实例数
  2. 调整对应的作业负载

其间过程 2-4 约每 15 秒履行一次,如需改变时刻周期,能够调整 KCM 的装备参数–horizontal-pod-autoscaler-sync-period。

数据源

Kubernetes HPA 的三个误区与避坑指南

如上图所示,HPA 现在供给了五种目标来历,以及三种目标服务(MetricsServer),简单介绍如下:

  1. Resource:供给 Pod 等级的 CPU/内存运用量
  2. ContainerResource:供给容器等级的 CPU/内存运用量
  3. Object:供给 Kubernetes 集群内任意资源的相关目标
  4. Pods:供给 Kubernetes集群内 pod 相关的目标
  5. External:供给 Kubernetes 集群外的目标数据

值得一提的是,在自建 Kubernetes 场景下,这三种 MetricsServer 都需求额外装置,它们均运转于 KCM 之外。下表列举了几种 Kubernetes 集群 MetricsServer 的部署状况。

自建Kubernetes 阿里云容器服务 EDAS托管集群
Kubernetes MetricsServer 手动装置 主动装置 主动装置
Custom MetricsServer(如Prometheus Adapter) 手动装置 手动装置 手动装置
External MetricsServer(如KEDA) 手动装置 手动装置 主动装置

目标核算方法

HPA 供给了三种希望值类型:

  1. 总量(Value)
  2. 均匀量(AverageValue)= 总量 / 当时实例数
  3. 运用率(Utilization)= 均匀量 / Request

值得一提的是,运用率是根据 Request 进行核算的,所以没有设置 Request 的场景下,HPA 或许无法正常作业。

下图介绍了五种目标来历支撑的希望类型,不难看出所有目标来历都支撑均匀量。

Kubernetes HPA 的三个误区与避坑指南

关于单个目标的希望实例数核算规矩如下:

Kubernetes HPA 的三个误区与避坑指南

这儿面引进了容忍度的概念,即以为在希望值邻近小规模的颤动是能够容忍疏忽的。这个参数的来历是因为目标值是一个一直在颤动改变的值,假如不疏忽微小的改变,那么很有或许造成运用不断的扩容缩容,从而影响整个体系的安稳性。

如下图所示,当目标值落入粉色区域内(容忍度规模)时,希望实例数等于当时实例数。粉色区域(容忍度规模)的上下限分别是 0.9 倍希望值与 1.1 倍希望值。

Kubernetes HPA 的三个误区与避坑指南

关于装备了多条目标规矩,终究希望实例数核算规矩如下:

Kubernetes HPA 的三个误区与避坑指南

其间 target1, …, target n 分别是每个目标核算出来的希望实例数。

用一句话简要归纳核算方法:单个目标动摇小时疏忽不计,多个目标之间取最大值,终究实例数会落在下限和上限之间。

扩缩行为

在某些状况下,目标数据会有一个频频且大起伏的颤动。如下图所示的一段 CPU 目标数据,存在一些目标颤动或间歇流量下降导致运用率下降,目标的改变规模现已超出了容忍度的规模。此刻,从运用安稳性角度来看,咱们不希望运用缩容。为了解决这个问题,HPA引进了装备来控制扩缩容,即扩缩行为(behavior),它是在HPA(autoscaling/v2beta2)中引进,要求 Kubernetes 集群版别>=1.18。

Kubernetes HPA 的三个误区与避坑指南

HPA 的弹性行分为扩容行为和缩容行为。行为详细由以下三部分组成:

  • 安稳窗口:安稳窗口会参阅曩昔一段时刻核算出的希望实例数,选取极值作为终究成果,然后确保体系在一段时刻窗口内是安稳的。关于扩容取极小值,关于缩容取极大值。
  • 步长战略:约束一段时刻内实例改变的规模。由步长类型、步长值、时刻周期三个部分组成。值得一提的是时刻周期这个概念与上述的安稳窗口是两回事,此处的时刻周期界说了回溯多长历史时刻,核算实例数改变状况。
  • 挑选战略:用于选取多个步长战略核算后的成果,支撑 取最大值、取最小值、关闭 这三种战略。

Kubernetes HPA 的三个误区与避坑指南

回忆与总结

至此,咱们现已大致了解了 HPA 的作业机理。合理运用 HPA 能够有用提高资源运用率,在这之中咱们总结了一些注意事项,熟记这些点能够在运用 HPA 时“有用避坑”。

  1. HPA 的规划架构导致了 HPA 只能被迫响应目标进行弹性扩缩,这种形式下,弹性滞后是必定存在的。现在阿里云容器服务推出了带猜测才能的 AHPA,能够有用减少弹性迟滞。
  2. HPA 的运用率核算方法是根据 Request,实践运用率/希望运用率超越 100%是正常的,装备较高的希望运用率需求合理规划集群资源和审视相应风险。
  3. HPA 中的容忍度概念能缓解目标动摇带来的体系震动问题,但与此同时引进的扩容死区问题需求运维人员避开。
  4. HPA 的规划架构允许扩展各种类型目标,需求开发/装置相应的 MetricsServer,如 EDAS 则为用户供给了微服务 RT 和 QPS 目标。
  5. HPA 中存在扩缩容行为,即使不装备相应参数也有默许行为,扩容行为的安稳窗口默许是 0,假如运用常因噪声数据造成扩容,能够设置一个较短的扩容安稳窗口躲避尖锐噪声。
  6. 单个 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/…