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

前言

云计算带来的优势之一便是弹性能力,云原生场景下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控制器执行弹性功能主要分为四个步骤:

  1. 监听HPA资源,一旦生成HPA资源或者是更改HPA配置,HPA控制器能及时感知并调整。
  2. 从Metrics API获取对应的指标数据,这里的Metrics Server又可以分为三类
    1. Kubernetes MetricServer:提供容器级别CPU/内存使用量
    2. Custom MetricServer:提供来自Kubernetes集群自定义资源的指标数据
    3. External MetricServer:提供来自Kubernetes集群外的指标数据
  3. 每个指标项单独计算期望实例数,最后取所有期望实例数中的最大值,作为当前工作负载的期望实例数
  4. 调整对应的工作负载

其中步骤2-4约每15秒执行一次,如需改变时间周期,可以调整KCM的配置参数--horizontal-pod-autoscaler-sync-period。

数据源

如上图所示,HPA目前提供了五种指标来源,以及三种指标服务(MetricsServer),简单介绍如下:

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

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

指标计算方法

HPA提供了三种期望值类型

  1. 总量(Value)
  2. 平均量(AverageValue)= 总量 / 当前实例数
  3. 利用率(Utilization)= 平均量 / Request

值得一提的是,利用率是基于Request进行计算的,所以没有设置Request的场景下,HPA可能无法正常工作。

下图介绍了五种指标来源支持的期望类型,不难看出所有指标来源都支持平均量。

对于单个指标的期望实例数计算规则如下:

这里面引入了容忍度的概念,即认为在期望值附近小范围的抖动是可以容忍忽略的。这个参数的来源是因为指标值是一个一直在抖动变化的值,如果不忽略微小的变动,那么很有可能造成应用不断的扩容缩容,进而影响整个系统的稳定性。

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

对于配置了多条指标规则,最终期望实例数计算规则如下:

用一句话简要概括计算方法:单个指标波动小时忽略不计,多个指标之间取最大值,最终实例数会落在下限和上限之间。

扩缩行为

在某些情况下,指标数据会有一个频繁且大幅度的抖动。如下图所示的一段CPU指标数据,存在一些指标抖动或间歇流量下降导致利用率下降,指标的变化范围已经超出了容忍度的范围。此时,从应用稳定性角度来看,我们不期望应用缩容。为了解决这个问题,HPA引入了配置来控制扩缩容,即扩缩行为(behavior),它是在HPA(autoscaling/v2beta2)中引入,要求Kubernetes集群版本>=1.18。

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)能结合云厂商在计算、存储、网络上的技术基础能力,能让使用云的成本更低。但是这里对于业务应用会提出一点点挑战(如:无状态/配置代码解耦等等)。从更广的侧面来看,这是云原生时代应用架构面临的挑战。不过应用越来越原生的话,云的技术红利也会离我们越来越近。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s有损发布问题探究

问题提出 流量有损是在应用发布时的常见问题,其现象通常会反馈到流量监控上,如下图所示,发布过程中服务RT突然升高,造成部分业务响应变慢,给用户的最直观体验就是卡顿;或是请求的500错误数突增&#xff0c…

解读 K8s Pod 的13种典型异常

在K8s中,Pod作为工作负载的运行载体,是最为核心的一个资源对象。Pod具有复杂的生命周期,在其生命周期的每一个阶段,可能发生多种不同的异常情况。K8s作为一个复杂系统,异常诊断往往要求强大的知识和经验储备。结合实战…

实践教程之如何快速使用 PolarDB-X

PolarDB-X 为了方便用户体验,提供了免费的实验环境,您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验,PolarDB-X 也提供免费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。 本期实验可以让您快…

实践教程之如何将 PolarDB-X 与大数据等系统互通

本期实验将指导您使用PolarDB-XCanalClickHouse搭建实时分析系统。 本期免费实验地址 本期教学视频地址 前置准备 假设已经根据前一讲内容完成了PolarDB-X的搭建部署,可以成功链接上PolarDB-X数据库。 实践教程之如何快速安装部署PolarDB-X 部署Canal Canal是…

加载速度提升 15%,关于 Python 启动加速探索与实践的解析

编者按:在刚刚结束的 PyCon China 2022 大会上,龙蜥社区开发者严懿宸分享了主题为《Python 启动加速的探索与实践》的技术演讲。本次演讲,作者将从 CPython 社区相关工作、本方案的设计及实现,以及业务层面的集成等方面进行介绍。…

统信软件高级工程师:关于云原生技术在容器方面的应用介绍

编者按:随着近几年来云原生生态的不断壮大,众多企业纷纷开展了用云上云的工作,学习云原生及容器技术对于现代工程师是必不可少的。本文整理自龙蜥大讲堂 54 期,统信高级研发工程师参与技术分享,为大家介绍了云原生的介…

解读最佳实践:倚天710 ARM芯片的 Python+AI 算力优化

编者按:在刚刚结束的 PyCon China 2022 大会上,龙蜥社区开发者朱宏林分享了主题为《ARM 芯片的 PythonAI 算力优化》的技术演讲。本次演讲,作者将向大家介绍他们在倚天 710 ARM 芯片上开展的 PythonAI 优化工作,以及在 ARM 云平台…

从敏捷协作到价值交付

前面我的同事在分享的时候,指出目前软件研发的最大问题不是效率,而是研发资源的浪费。可能产品经理半天写的需求,开发要埋头苦干三个月。如果错误的选择了一个对业务发展无益的需求,会带着大家往错误的方向越跑越远。 那么什么是…

行动策略过于复杂怎么办?试试下面一些解决方法

背景 随着使用SLS告警越来越深入,有些用户的行动策略会配置的特别复杂,有些时候可以让用户通过创建多个行动策略来进行一定的精简,但是在一些场景下,用户是无法创建多个行动策略的。例如用户想要通过SLS来统一管理其各个监控系统…

从效能公式解构研发效能

这几年,云原生、Web3.0、元宇宙等技术的出现和应用,正在深刻地改变着我们这个世界。以数字技术应用为主线的数字化转型是此次人类文明变革的核心动力。在这一变革过程中,软件研发模式的发展起到了重至关重要的作用。从早期瀑布式、精益敏捷、…

阿里CCO:基于 Hologres 的亿级明细 BI 探索分析实践

CCO是Chief Customer Officer的缩写,也是阿里巴巴集团客户体验事业部的简称。随着业务的多元化发展以及行业竞争的深入,用户体验问题越来越受到关注。CCO体验业务运营小二日常会大量投入在体验洞察分析中,旨在通过用户的声音数据结合交易、物…

sdut 数字三角形问题

数字三角形问题 Time Limit: 1000MS Memory Limit: 65536KBSubmit Statistic DiscussProblem Description 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。对于给定的由n行…

SSD( Single Shot MultiBox Detector)关键源码解析

SSD(SSD: Single Shot MultiBox Detector)是采用单个深度神经网络模型实现目标检测和识别的方法。如图0-1所示,该方法是综合了Faster R-CNN的anchor box和YOLO单个神经网络检测思路(YOLOv2也采用了类似的思路,详见YOLO…

YOLO升级版:YOLOv2和YOLO9000解析

论文笔记:YOLO9000: Better, Faster, Stronger;官方网站 评论:YOLO是基于深度学习方法的端到端实时目标检测系统(YOLO:实时快速目标检测)。YOLO的升级版有两种:YOLOv2和YOLO9000。作者采用了一系…

解读Batch Normalization

【活动】Python创意编程活动开始啦!!! CSDN日报20170424 ——《技术方向的选择》 程序员4月书讯:Angular来了!解读Batch Normalization 2016-02-23 16:03 5262人阅读 评论(1) 收藏 举报 本文章已收录于&#xf…

SSD+caffe︱Single Shot MultiBox Detector 目标检测+fine-tuning(二)

承接上一篇SSD介绍:SSDcaffe︱Single Shot MultiBox Detector 目标检测(一) 如果自己要训练SSD模型呢,关键的就是LMDB格式生成,从官方教程weiliu89/caffe来看,寥寥几行code,但是前面的数据整理…

sdut 双向队列(STL)

deque<ll>q;//定义一个双向队列q&#xff0c;类型为long long q.push_front(a);//将a从队首插入队列 q.push_back(a);//将a从队尾插入队列 q.pop_front();//队首弹掉一个元素 q.pop_back();//队尾弹出一个元素 aq.front();//返回队首元素 aq.back();//返回队尾元素 aq.si…

pip install scikit-image on windows 失败 解决方案

到官网下载包 http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-image 我们下载 scikit_image‑0.13.0‑cp35‑cp35m‑win_amd64.whl 也可到我的CNDS下载 安装时会出现一下错误 scikit_image-0.13.0-cp34-none-win_amd64.whl is not a supported wheel on this platform…

Caffe训练源码基本流程

苏的专栏 致力于学习计算机视觉、模式识别、机器学习、深度学习相关技术&#xff1a;&#xff1a;&#xff1a;&#xff1a;希望结识更多同道中人。 QQ&#xff1a;2816568984 微信&#xff1a;Suc1011 目录视图 摘要视图 订阅 【活动】2017 CSDN博客专栏评选 【评论送书】…

ubuntu16.04下安装opencv3.2版本

1、下载OpenCV的源码 OpenCV官网上有linux版本的源码包可以下载&#xff0c;不过最好是从git上下载&#xff0c;这样可以保证下载得到的是最新的代码&#xff1a;1 wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.2.0.zip 2 unzip opencv.zip 2、编译安装…