当前位置: 首页 > 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;进行分类和编号。 商品分类貌似…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...