【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 如何自动扩缩容
Deployment和StatefulSet,并通过实验演示其工作原理。
❤️ 本文内容关联文章:
- 《一文读懂Deployment以及实践攻略》
- 《一文读懂StatefulSet以及实践攻略》
- 《一文读懂HPA弹性扩展以及实践攻略》

1 概念
1.1 什么是HPA
❔ 说明:如果想更好理解下面的描述, 建议先看《一文读懂HPA弹性扩展以及实践攻略》,了解HPA弹性扩展的基本原理。
Horizontal Pod Autoscaler (HPA) 是 Kubernetes 中的一个控制器,它通过监控 Pod 的资源使用情况(如 CPU 或内存使用率),根据设定的指标自动调整 Pod 副本的数量。HPA 常用于解决云原生应用中负载波动的问题,确保在高负载时增加 Pod 副本以提升服务能力,在负载下降时减少 Pod 副本以节约资源。
HPA 可以结合 Deployment 和 StatefulSet 这两种常见的 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 时,主要通过如下步骤工作:
- 指标采集:HPA 从 Metrics Server 或者 Prometheus 等监控系统中获取 Pod 的资源使用情况,如 CPU 或内存利用率。
- 扩缩容计算:HPA 根据设定的目标值(例如目标 CPU 使用率)与实际的资源使用情况进行对比,计算需要增加或减少的 Pod 副本数量。
- 副本调整:HPA 调用
Deployment的 API 更新其replicas,从而增加或减少实际运行的 Pod 数量。 - 监控和调整: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 时,主要通过如下步骤工作:
- 指标采集:HPA 从 Metrics Server 或者 Prometheus 等监控系统中获取 Pod 的资源使用情况,如 CPU 或内存利用率。
- 扩缩容计算:HPA 根据设定的目标值(例如目标 CPU 使用率)与实际的资源使用情况进行对比,计算需要增加或减少的 Pod 副本数量。
- 副本调整: 不同于无状态的
Deployment,StatefulSet的 Pod 是有序创建和删除的,每个 Pod 都有一个固定的身份和独立的数据卷。例如,扩容时,新 Pod 会按顺序从pod-0增加到pod-1、pod-2依次类推。缩容时则是相反,StatefulSet会从最后一个 Pod 开始有序删除。 - 状态保持: 由于
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 或内存等资源利用率,动态调整 Deployment 和 StatefulSet 的原理,实践了 StatefulSet的自动扩缩容。
3.1 注意事项:
- 指标收集准确性:确保 Metrics Server 或 Prometheus 能够准确采集 Pod 的资源使用情况,否则可能导致 HPA 失效。
- 资源配置:为容器设置合理的
requests和limits,以确保 HPA 能够正常工作。 - StatefulSet 扩容速度:由于需要保持有序性,
StatefulSet的扩缩容速度可能较Deployment慢,应根据应用需求进行调整。
通过这些实验,我们可以更好地理解 Kubernetes 中 HPA 的强大功能,并根据实际业务场景选择合适的扩缩容策略。
相关文章:
【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?
【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容? 目录 1 概念 1.1 什么是HPA1.2 Deployment 与 HPA 的关系 1.2.1 工作原理 1.3 StatefulSet 与 HPA 的关系 1.3.1 工作原理 2 实验案例:HPA 控制 StatefulSet 进行扩缩容 2.1 部署一个有状态…...
adb devices不显示连接设备怎么解决
adb devices不显示设备,首先用老办法检查。假如是显示adb这个命令不认识,那就是系统路径问题。假如能认识adb这个命令,那就检查一下手机有没有开usb调试。 但是我遇到了更奇怪的问题:我把网上的攻略都试了一遍,设备驱…...
经典sql题(一)求连续登录不少于三天用户
示例数据 假设我们的 test 表有以下数据: 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 第一步࿱…...
2024java面试-软实力篇
为什么说简历很重要? 一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情 况 下,写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢? 、 先从面试来说 假如你是网申,你的简历必然…...
「OC」present和push操作区别以及混合推出的实现
「OC」present和push操作区别以及混合推出的实现 文章目录 「OC」present和push操作区别以及混合推出的实现前言present用途while循环越级返回通知越级返回添加present动画 push模态视图和push视图混合跳转操作一:控制器Apresent控制器B,控制器B再将控制…...
【高分系列卫星简介】
高分系列卫星是中国国家高分辨率对地观测系统(简称“高分工程”)的重要组成部分,旨在提供全球范围内的高分辨率遥感数据,广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…...
八股文-多线程、并发
八股文-多线程、并发 最近学到了一种方法,可以用于简历项目经验编写以及面试题目的回答 STAR法则:在什么背景下,你需要解决什么问题,你做了啥,得到了什么结果 情境(Situation): 描…...
xtu oj 折纸
折纸# 题目描述# 一个长为a,宽为b矩形的纸,我们沿b边(左边)的中点与右上顶点的边折叠,求左上顶点在折叠以后离下边的距离? 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例,为两个整数1≤a,b≤1000。…...
传知代码-多示例AI模型实现病理图像分类
代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文将基于多示例深度学习EPLA模型实现对乳腺癌数据集BreaKHis_v1的分类。EPLA模型是处理组织病理学图像的经典之作。EPLA模型是基于多示例学习来进行了,那么多示例学习模型对处理病理学图像具有…...
Java知识点小结3:内存回收
文章目录 对象引用强引用软引用(SoftReference)弱引用(WeakReference)考一考 虚引用(PhantomReference)总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…...
LeetCode746:使用花费最小爬楼梯
题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode) 代码如下 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类型的排序,其提供了两个重载方法: 1.sort(List<T> list) (1)List指定泛型时只能指定引用数据类型,也就是说无法用于基本数据类型的排序。 &am…...
【资料分析】刷题日记3
第一套 √ 考点:基期比重差很温柔的题 普通专科女生 占比 52.5% - 1.7% 50.8% 成人本专科女生 占比 57.8% - 4.6% 53.2% 相比降低了2.4% 知比重和部分量,求整体在花生老师的解法中体会啥叫适当约分 0.1899 / 47.8% / 87.5% 》0.19 / (4…...
基于SpringBoot+Vue的商场停车场管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...
4. 密码协议
4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…...
基于嵌入式的智能物流柜( 触摸屏/0.96寸oled屏)
演示 智能物流柜(基础版) 智能物流柜(升级版) 前言 这是本人在大二在学校接的一个简单的实验室项目,之前发布了一个,由于那是在暑假,家里器材有限,代码敲完之后,用面包板…...
VSCode创建C++项目和编译多文件
前言 在刚安装好VSCode后,我简单尝试了仅main.cpp单文件编译代码,没有问题,但是当我尝试多文件编译时,就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”;在菜单中选择“打开文件夹”;在…...
7个提升网站分页体验的 CSS 和 JavaScript 代码片段
文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具,能帮助用户更轻松…...
C++——用带有默认参数的函数实现,求两个整数或三个整数中的最大数。
没注释的源代码 #include <iostream> using namespace std; int max(int a,int b,int c0); int main() { int a,b,c; cout<<"请输入三个整数:"; cin>>a>>b>>c; cout<<"三个整数的最大值是&am…...
对商品分类系统的若干问题的思考
科学研究的目的就是研究事物的特征,并根据共同的特征加以分类 商品分类是商业,制造业中最普遍的活动,几乎所有的企业,电商平台都要对销售的商品,使用的原材料(BOM)进行分类和编号。 商品分类貌似…...
3种突破窗口限制的高效方案:WindowResizer让桌面管理更自由
3种突破窗口限制的高效方案:WindowResizer让桌面管理更自由 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 在数字化办公环境中,窗口尺寸管理直接影响工作效…...
终极指南:如何轻松提取Xbox Game Pass游戏存档,实现跨平台无缝迁移
终极指南:如何轻松提取Xbox Game Pass游戏存档,实现跨平台无缝迁移 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor …...
自用超香的 Navidrome 音乐库搭建分享,告别听歌各种糟心事!
前言 作为一个实打实的音乐爱好者,我曾被听歌这件事折腾得够呛 —— 手机播放器加载慢到让人没耐心,喜欢的歌动不动就因为版权问题听不了,充了会员也总觉得不划算,更别说囤了一堆无损音乐却只能在电脑上听的憋屈。直到用上 Navid…...
3分钟搞定Axure中文界面:终极汉化指南让原型设计更简单
3分钟搞定Axure中文界面:终极汉化指南让原型设计更简单 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure …...
Vin象棋:基于Yolov5的中国象棋智能视觉辅助系统,重新定义数字化对弈体验
Vin象棋:基于Yolov5的中国象棋智能视觉辅助系统,重新定义数字化对弈体验 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 在数字化对…...
Python对象生命周期管理失效了?——从引用计数到分代GC的隐性成本陷阱(附内存热力图诊断工具)
第一章:Python对象生命周期管理失效的典型现象与诊断范式Python 的自动内存管理依赖引用计数、循环垃圾收集器(GC)与弱引用机制协同工作,但当这些机制被意外绕过或干扰时,对象生命周期便可能失控。典型失效现象包括&am…...
三步快速配置:极简二维码插件让你的浏览器变身智能跨设备助手
三步快速配置:极简二维码插件让你的浏览器变身智能跨设备助手 【免费下载链接】chrome-qrcode chrome-qrcode - 一个 Chrome 浏览器插件,可以生成当前 URL 或选中文本的二维码,或解码网页上的二维码。 项目地址: https://gitcode.com/gh_mi…...
深入解析Kubernetes中的探针(Probe):Liveness、Readiness与Startup探针实战指南
引言:为什么Kubernetes需要探针?在Kubernetes集群中,我们常常会遇到这样的场景:应用进程还在运行,但内部已陷入死锁,无法处理请求。容器启动了,但依赖的数据库尚未连接成功,此时不应…...
OpenClaw多任务队列:gemma-3-12b-it并行处理技巧与实践
OpenClaw多任务队列:gemma-3-12b-it并行处理技巧与实践 1. 为什么需要多任务队列 去年冬天,我正尝试用OpenClaw自动化处理一批市场调研报告。当同时提交5个分析任务时,发现系统要么卡死,要么任务相互覆盖。这种经历让我意识到—…...
SUNFLOWER MATCH LAB 效果深度评测:对比传统CNN与LSTM的识别性能
SUNFLOWER MATCH LAB 效果深度评测:对比传统CNN与LSTM的识别性能 向日葵的生长过程,就像一部无声的纪录片,每一天的叶片舒展、花盘转动都蕴含着丰富的信息。过去,我们想读懂这部纪录片,要么靠农学专家日复一日的田间观…...
