当前位置: 首页 > news >正文

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?

目录

  • 1 概念
    • 1.1 什么是HPA
    • 1.2 Deployment 与 HPA 的关系
      • 1.2.1 工作原理
    • 1.3 StatefulSet 与 HPA 的关系
      • 1.3.1 工作原理
  • 2 实验案例:HPA 控制 StatefulSet 进行扩缩容
    • 2.1 部署一个有状态应用
    • 2.2 创建 HPA
    • 2.3 验证HPA扩缩容
  • 3 总结
    • 3.1 注意事项:

❤️ 摘要:Kubernetes 作为当前最流行的容器编排平台,提供了 Horizontal Pod Autoscaler (HPA) 以便根据资源利用情况自动调整 Pod 副本数。本文将深入探讨 HPA 如何自动扩缩容 DeploymentStatefulSet,并通过实验演示其工作原理。

❤️ 本文内容关联文章:

  • 《一文读懂Deployment以及实践攻略》
  • 《一文读懂StatefulSet以及实践攻略》
  • 《一文读懂HPA弹性扩展以及实践攻略》

1 概念

1.1 什么是HPA

❔ 说明:如果想更好理解下面的描述, 建议先看《一文读懂HPA弹性扩展以及实践攻略》,了解HPA弹性扩展的基本原理。

Horizontal Pod Autoscaler (HPA) 是 Kubernetes 中的一个控制器,它通过监控 Pod 的资源使用情况(如 CPU 或内存使用率),根据设定的指标自动调整 Pod 副本的数量。HPA 常用于解决云原生应用中负载波动的问题,确保在高负载时增加 Pod 副本以提升服务能力,在负载下降时减少 Pod 副本以节约资源。

HPA 可以结合 DeploymentStatefulSet 这两种常见的 Kubernetes 资源类型,分别应对无状态和有状态应用的弹性扩缩容需求。

1.2 Deployment 与 HPA 的关系

❔ 说明:如果想更好理解下面的描述, 建议先看《一文读懂Deployment以及实践攻略》,了解Deployment与Replicas,以及Deployment的滚动更新。

当为 Deployment 配置了自动扩缩容,HPA 接管 Deployment ,通过调节replicas字段来实现 Pod 副本数量的控制。当 HPA 检测到负载变化时,它会自动调整 Deployment 的副本数。

在滚动更新期间,Deployment 控制器会负责通知底层的 ReplicaSets,再由ReplicaSet 管理 Pod 副本。当发生滚动更新时,Deployment 控制器通过调整新旧版本的 ReplicaSets 副本数,确保在更新期间的总副本数满足 HPA 的要求。例如,如果 HPA 设定 Deployment 需要 10 个副本,Deployment 控制器会动态调整新旧版本的 Pod 数量,使它们的总数一直为 10。

1.2.1 工作原理

HPA 在控制 Deployment 时,主要通过如下步骤工作:

  1. 指标采集:HPA 从 Metrics Server 或者 Prometheus 等监控系统中获取 Pod 的资源使用情况,如 CPU 或内存利用率。
  2. 扩缩容计算:HPA 根据设定的目标值(例如目标 CPU 使用率)与实际的资源使用情况进行对比,计算需要增加或减少的 Pod 副本数量。
  3. 副本调整:HPA 调用 Deployment 的 API 更新其 replicas,从而增加或减少实际运行的 Pod 数量。
  4. 监控和调整:HPA 持续监控资源使用情况,周期性地进行扩缩容操作,以保持系统的平稳运行。

1.3 StatefulSet 与 HPA 的关系

❔ 说明:如果想更好理解下面的描述, 建议先看《一文读懂StatefulSet以及实践攻略》,了解StatefulSet的滚动更新。

如果为 StatefulSet 配置了 HPA,HPA 直接管理 StatefulSet 的 Pod 数量(replicas 字段)。但StatefulSet 不同于 Deployment,StatefulSet 是直接管理一组有状态的 Pod,而不像 Deployment 通过ReplicaSet 作为中间资源管理一组无状态的应用。所以在滚动更新过程中,StatefulSet 需要同时参与处理 Pod 的更新和副本数的动态调整,保证每个 Pod 在 StatefulSet 中有固定的身份和顺序。

1.3.1 工作原理

HPA 在控制 StatefulSet 时,主要通过如下步骤工作:

  1. 指标采集:HPA 从 Metrics Server 或者 Prometheus 等监控系统中获取 Pod 的资源使用情况,如 CPU 或内存利用率。
  2. 扩缩容计算:HPA 根据设定的目标值(例如目标 CPU 使用率)与实际的资源使用情况进行对比,计算需要增加或减少的 Pod 副本数量。
  3. 副本调整: 不同于无状态的 DeploymentStatefulSet 的 Pod 是有序创建和删除的,每个 Pod 都有一个固定的身份和独立的数据卷。例如,扩容时,新 Pod 会按顺序从 pod-0 增加到 pod-1pod-2 依次类推。缩容时则是相反,StatefulSet 会从最后一个 Pod 开始有序删除。
  4. 状态保持: 由于 StatefulSet 通常管理有状态应用(如数据库),这些应用需要保留数据持久化。即使 Pod 被删除,存储卷也不会被删除,而是在重新启动或扩容时重新附加到相应的 Pod。因此,在扩缩容时,HPA 不会影响 StatefulSet 中 Pod 的状态或数据。

2 实验案例:HPA 控制 StatefulSet 进行扩缩容

❔ 环境说明:

  • Kubernetes 集群已安装
  • Metrics Server已安装

❔ 说明:《一文读懂HPA弹性扩展以及实践攻略》文章实践案例是“HPA自动扩缩Deployment应用的案例”,所以下面演示HPA 自动扩缩 StatefulSet。

2.1 部署一个有状态应用

创建一个简单的 StatefulSet,例如 Redis。

---
apiVersion: v1
kind: Service
metadata:name: redis-service
spec:clusterIP: Noneselector:app: redisports:- port: 6379name: redis---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: redis
spec:serviceName: "redis"replicas: 1minReadySeconds: 20selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: harbor.zx/hcie/redis:7.2.4resources:requests:cpu: "100m"limits:cpu: "300m"ports:- containerPort: 6379volumeMounts:- name: redis-storagemountPath: /datavolumeClaimTemplates:- metadata:name: redis-storagespec:storageClassName: "nfs-class"accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi

创建Redis应用

kubectl apply -f redis-hpa.yaml

创建成功输入如下:

service/redis created
statefulset.apps/redis created

查看redis-service信息

kubectl describe svc redis-service

输出如下:

Name:              redis-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=redis
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              redis  6379/TCP
TargetPort:        6379/TCP
Endpoints:         172.16.135.254:6379
Session Affinity:  None
Events:            <none>

❔ 说明: redis-0已经成功关联redis-service

2.2 创建 HPA

为该 StatefulSet 配置 HPA,编制hpa部署文件:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: redis-hpa
spec:# 关联StatefulSet资源scaleTargetRef:apiVersion: apps/v1kind: StatefulSetname: redisminReplicas: 1maxReplicas: 5targetCPUUtilizationPercentage: 50

创建HPA资源:

kubectl apply -f autoscaling.yaml

创建成功输入如下:

horizontalpodautoscaler.autoscaling/redis-hpa created

查看hpa信息

 kubectl describe hpa redis-hpa

输出如下:

Name:                                                  redis-hpa
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Fri, 20 Sep 2024 17:00:39 +0800
Reference:                                             StatefulSet/redis
Metrics:                                               ( current / target )resource cpu on pods  (as a percentage of request):  2% (2m) / 50%Min replicas:                                          1
Max replicas:                                          5StatefulSet pods:                                      1 current / 1 desiredConditions:Type            Status  Reason              Message----            ------  ------              -------AbleToScale     True    ReadyForNewScale    recommended size matches current sizeScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range

❔ 说明:目前hpa已经正常获取redis的pod负载数据,但现在负载比较低。

2.3 验证HPA扩缩容

模拟对 Redis 的高负载请求,redis镜像自带的 Redis Benchmark 工具进行测试。

 kubectl run -it --rm --restart=Never --image=harbor.zx/hcie/redis:7.2.4 redis-test -- redis-benchmark -h redis-service -p 6379 -c 50 -n 100000

使用 kubectl get hpa 监控扩缩容效果:

kubectl get hpa

观察到负载从2%到296%, 副本数扩展到最大5个

NAME        REFERENCE           TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
redis-hpa   StatefulSet/redis   2%/50%    1         5         1          44m
redis-hpa   StatefulSet/redis   125%/50%   1         5         1          44m
redis-hpa   StatefulSet/redis   296%/50%   1         5         3          44m
redis-hpa   StatefulSet/redis   277%/50%   1         5         5          44m
redis-hpa   StatefulSet/redis   256%/50%   1         5         5          45m
redis-hpa   StatefulSet/redis   239%/50%   1         5         5          45m

暂停redis-benchmark测试,再等待一会(默认缩容间隔5分钟):

redis-hpa   StatefulSet/redis   2%/50%     1         5         5          47m
redis-hpa   StatefulSet/redis   2%/50%     1         5         5          52m
redis-hpa   StatefulSet/redis   2%/50%     1         5         2          52m
redis-hpa   StatefulSet/redis   2%/50%     1         5         1          52m

❔说明: 可以观察到StatefulSet缩减到1个了。在负载上升时,HPA 会逐步增加 StatefulSet 的 Pod 数量,并以有序的方式启动新 Pod;当负载减小时,Pod 数量会逐步减少。


3 总结

通过本文的介绍和实验,我们了解了 HPA 如何通过监控 CPU 或内存等资源利用率,动态调整 DeploymentStatefulSet 的原理,实践了 StatefulSet的自动扩缩容。

3.1 注意事项:

  1. 指标收集准确性:确保 Metrics Server 或 Prometheus 能够准确采集 Pod 的资源使用情况,否则可能导致 HPA 失效。
  2. 资源配置:为容器设置合理的 requestslimits,以确保 HPA 能够正常工作。
  3. StatefulSet 扩容速度:由于需要保持有序性,StatefulSet 的扩缩容速度可能较 Deployment 慢,应根据应用需求进行调整。

通过这些实验,我们可以更好地理解 Kubernetes 中 HPA 的强大功能,并根据实际业务场景选择合适的扩缩容策略。

相关文章:

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容&#xff1f; 目录 1 概念 1.1 什么是HPA1.2 Deployment 与 HPA 的关系 1.2.1 工作原理 1.3 StatefulSet 与 HPA 的关系 1.3.1 工作原理 2 实验案例&#xff1a;HPA 控制 StatefulSet 进行扩缩容 2.1 部署一个有状态…...

adb devices不显示连接设备怎么解决

adb devices不显示设备&#xff0c;首先用老办法检查。假如是显示adb这个命令不认识&#xff0c;那就是系统路径问题。假如能认识adb这个命令&#xff0c;那就检查一下手机有没有开usb调试。 但是我遇到了更奇怪的问题&#xff1a;我把网上的攻略都试了一遍&#xff0c;设备驱…...

经典sql题(一)求连续登录不少于三天用户

示例数据 假设我们的 test 表有以下数据&#xff1a; iddate12023-10-01 08:00:0012023-10-01 09:00:0012023-10-02 10:00:0012023-10-03 11:00:0022023-10-01 10:00:0022023-10-02 12:00:0022023-10-03 14:00:0022023-10-04 15:00:0032023-10-01 16:00:00 第一步&#xff1…...

2024java面试-软实力篇

为什么说简历很重要&#xff1f; 一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情 况 下&#xff0c;写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢&#xff1f; 、 先从面试来说 假如你是网申&#xff0c;你的简历必然…...

「OC」present和push操作区别以及混合推出的实现

「OC」present和push操作区别以及混合推出的实现 文章目录 「OC」present和push操作区别以及混合推出的实现前言present用途while循环越级返回通知越级返回添加present动画 push模态视图和push视图混合跳转操作一&#xff1a;控制器Apresent控制器B&#xff0c;控制器B再将控制…...

【高分系列卫星简介】

高分系列卫星是中国国家高分辨率对地观测系统&#xff08;简称“高分工程”&#xff09;的重要组成部分&#xff0c;旨在提供全球范围内的高分辨率遥感数据&#xff0c;广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…...

八股文-多线程、并发

八股文-多线程、并发 最近学到了一种方法&#xff0c;可以用于简历项目经验编写以及面试题目的回答 STAR法则&#xff1a;在什么背景下&#xff0c;你需要解决什么问题&#xff0c;你做了啥&#xff0c;得到了什么结果 情境&#xff08;Situation&#xff09;&#xff1a; 描…...

xtu oj 折纸

折纸# 题目描述# 一个长为a,宽为b矩形的纸&#xff0c;我们沿b边(左边)的中点与右上顶点的边折叠&#xff0c;求左上顶点在折叠以后离下边的距离&#xff1f; 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例&#xff0c;为两个整数1≤a,b≤1000。…...

传知代码-多示例AI模型实现病理图像分类

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文将基于多示例深度学习EPLA模型实现对乳腺癌数据集BreaKHis_v1的分类。EPLA模型是处理组织病理学图像的经典之作。EPLA模型是基于多示例学习来进行了&#xff0c;那么多示例学习模型对处理病理学图像具有…...

Java知识点小结3:内存回收

文章目录 对象引用强引用软引用&#xff08;SoftReference&#xff09;弱引用&#xff08;WeakReference&#xff09;考一考 虚引用&#xff08;PhantomReference&#xff09;总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…...

LeetCode746:使用花费最小爬楼梯

题目链接&#xff1a;746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {int m cost.size();if(m 1) return min(cost[1], cost[0]);if(m 0) return cost[0]…...

列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型 一.Collections.sort() Collections.sort()用于List类型的排序&#xff0c;其提供了两个重载方法&#xff1a; 1.sort(List<T> list) &#xff08;1&#xff09;List指定泛型时只能指定引用数据类型&#xff0c;也就是说无法用于基本数据类型的排序。 &am…...

【资料分析】刷题日记3

第一套 √ 考点&#xff1a;基期比重差很温柔的题 普通专科女生 占比 52.5% - 1.7% 50.8% 成人本专科女生 占比 57.8% - 4.6% 53.2% 相比降低了2.4% 知比重和部分量&#xff0c;求整体在花生老师的解法中体会啥叫适当约分 0.1899 / 47.8% / 87.5% 》0.19 / &#xff08;4…...

基于SpringBoot+Vue的商场停车场管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...

4. 密码协议

4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…...

基于嵌入式的智能物流柜( 触摸屏/0.96寸oled屏)

演示 智能物流柜&#xff08;基础版&#xff09; 智能物流柜&#xff08;升级版&#xff09; 前言 这是本人在大二在学校接的一个简单的实验室项目&#xff0c;之前发布了一个&#xff0c;由于那是在暑假&#xff0c;家里器材有限&#xff0c;代码敲完之后&#xff0c;用面包板…...

VSCode创建C++项目和编译多文件

前言 在刚安装好VSCode后&#xff0c;我简单尝试了仅main.cpp单文件编译代码&#xff0c;没有问题&#xff0c;但是当我尝试多文件编译时&#xff0c;就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”&#xff1b;在菜单中选择“打开文件夹”&#xff1b;在…...

7个提升网站分页体验的 CSS 和 JavaScript 代码片段

文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具&#xff0c;能帮助用户更轻松…...

C++——用带有默认参数的函数实现,求两个整数或三个整数中的最大数。

没注释的源代码 #include <iostream> using namespace std; int max(int a,int b,int c0); int main() { int a,b,c; cout<<"请输入三个整数&#xff1a;"; cin>>a>>b>>c; cout<<"三个整数的最大值是&am…...

对商品分类系统的若干问题的思考

科学研究的目的就是研究事物的特征&#xff0c;并根据共同的特征加以分类 商品分类是商业&#xff0c;制造业中最普遍的活动&#xff0c;几乎所有的企业&#xff0c;电商平台都要对销售的商品&#xff0c;使用的原材料&#xff08;BOM&#xff09;进行分类和编号。 商品分类貌似…...

学习Spring Ai的摸索实践

摸索AI&#xff08;一&#xff09;安装Ollama和本地大模型部署https://www.chendd.cn/blog/article/2012500757664628737.html摸索AI&#xff08;二&#xff09;Spring AI实现的Hello Worldhttps://www.chendd.cn/blog/article/2013071822723874817.html 摸索AI&#xff08;三…...

2025届最火的六大AI辅助论文助手推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下&#xff0c;学术研究愈发深入&#xff0c;AI论文工具成了科研人员和学生的得力帮手&…...

4个简单步骤:如何用OpenCore Legacy Patcher让老旧Mac焕发新生

4个简单步骤&#xff1a;如何用OpenCore Legacy Patcher让老旧Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一个开源…...

Autovisor:5分钟快速上手的智慧树自动化学习终极指南

Autovisor&#xff1a;5分钟快速上手的智慧树自动化学习终极指南 【免费下载链接】Autovisor 2025智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor Autovisor是一款专为智慧树在线课程平台设计的…...

WebPlotDigitizer:计算机视觉辅助的图表数据提取工具深度解析

WebPlotDigitizer&#xff1a;计算机视觉辅助的图表数据提取工具深度解析 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 在科研和数据…...

从零上手!用 Python+OpenCV 实现 LBPH 人脸识别,小白也能跑通

一、写在前面&#xff1a;人脸识别到底是什么&#xff1f;你有没有好奇过&#xff0c;手机的人脸解锁、门禁的刷脸开门&#xff0c;到底是怎么认出你的&#xff1f;其实核心逻辑很简单&#xff1a;先 “记住” 人脸&#xff1a;把你的多张照片喂给算法&#xff0c;让它学习你的…...

IQuest-Coder-V1功能实测:一键生成高质量SQL查询脚本

IQuest-Coder-V1功能实测&#xff1a;一键生成高质量SQL查询脚本 在数据驱动的时代&#xff0c;SQL查询脚本的编写是每个数据分析师、后端工程师乃至产品经理的日常。面对复杂的业务逻辑和多表关联&#xff0c;手动编写SQL不仅耗时&#xff0c;还容易出错。有没有一种工具&…...

别再手动算Offset了!Vector DaVinci里这样配置AUTOSAR OS Alarm,让任务调度更丝滑

Vector DaVinci实战&#xff1a;AUTOSAR OS Alarm智能配置与任务调度优化 在汽车电子系统开发中&#xff0c;任务调度就像交响乐团的指挥&#xff0c;需要精确协调各个执行单元的时间节奏。传统手动计算Alarm Offset的方式&#xff0c;不仅效率低下&#xff0c;还容易引入人为错…...

忍者像素绘卷开源镜像部署:支持国产昇腾芯片的适配可行性分析

忍者像素绘卷开源镜像部署&#xff1a;支持国产昇腾芯片的适配可行性分析 1. 项目概述与技术特点 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;专为二次元风格和复古像素艺术设计。该项目融合了现代AI图像生成技术与16-bit游戏美学&#xff0c;…...

突破网盘下载瓶颈:技术工具革新文件获取效率

突破网盘下载瓶颈&#xff1a;技术工具革新文件获取效率 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅…...