【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 的强大功能,并根据实际业务场景选择合适的扩缩容策略。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[产品管理-28]:NPDP新产品开发 - 26 - 产品生命周期管理 - 产品上市的八大步骤

目录 一、产品发布 1.1 传统的产品上市发布步骤&#xff1a;线性一次性发布 1. 产品概念提出与市场调研 2. 产品开发与测试 3. 生产准备与质量控制 4. 营销策略制定 5. 产品上市发布 6. 持续优化与迭代 1.2 新型的产品上市发布步骤&#xff1a;逐步迭代&#xff0c;多…

【mysql技术内幕】

MySQL之技术内幕 1.MVCC模式2. 实现mvcc模式的基础点3.MySQL锁的类型4. 谈谈分库分表5. 分表后的id咋么保证唯一性呢&#xff1f;6. 分表后非sharding key的查询咋么处理的&#xff1f; 1.MVCC模式 MVCC, 是multi-version concurrency control的缩写&#xff0c;即多版本并发控…

基于RK3588,AI边缘模块,单片6TOPS,可集群堆叠,Mixtile Blade 3

Mixtile Blade 3 是一款经济实惠、节能的 SBC&#xff0c;围绕下一代 8 纳米瑞芯微 RK3588 处理器构建。它非常适合快速开发、AI 应用程序原型设计和边缘计算&#xff0c;允许您集群多个 Mixtile Blade 3 SBC 以扩展您的部署。 硬件布局正反面 开箱即用的 Mixtile Blade 3 是一…

Jordan标准型

Jordan(若尔当)标准型知识梳理 szmike Keep curious 已关注 raDar 等 634 人赞同了该文章 本文主要介绍什么是Jordan标准型以及怎么把一个矩阵化为Jordan标准型。 一&#xff0c;Jordan标准型的定义 矩阵 J 除了主对角线和主对角线上方元素之外&#xff0c;其余都是0&…

漫步者头戴式耳机怎么样?漫步者、西圣、索尼三大耳机测评对比

自头戴式耳机诞生以来&#xff0c;凭借其出色的音质表现和时尚造型&#xff0c;迅速赢得了音乐爱好者的青睐。头戴式耳机不仅能够带来更加沉浸的听觉体验&#xff0c;还具备较强的降噪功能&#xff0c;让用户在嘈杂环境中依然能专注于音乐世界。 与入耳式耳机相比&#xff0c;…

AIGC生图基础知识

一、引言 AIGC&#xff0c;即AI-Generated Content&#xff0c;是一种利用大型预训练模型如生成对抗网络&#xff08;GAN&#xff09;、扩散网络&#xff08;Diffusion&#xff09;和语言大模型&#xff08;Transformer&#xff09;等人工智能技术&#xff0c;通过对大量数据进…

通过springcloud gateway优雅的进行springcloud oauth2认证和权限控制

代码地址 如果对你有帮助请给个start&#xff0c;本项目会持续更新&#xff0c;目标是做一个可用的快速微服务开发平台&#xff0c;成为接私活&#xff0c;毕设的开发神器&#xff0c; 欢迎大神们多提意见和建议 使用的都是spring官方最新的版本&#xff0c;版本如下&#xff1…

样本册3D翻页电子版和印刷版同时拥有是一种什么体验

​在数字化时代&#xff0c;样本册3D翻页电子版的兴起&#xff0c;让传统印刷版样本册面临着前所未有的挑战。与此同时&#xff0c;许多企业也开始尝试将两者相结合&#xff0c;以满足更多元化的市场需求。那么&#xff0c;拥有一份既具备数字化优势&#xff0c;又保留传统印刷…

生信初学者教程(一):欢迎

文章目录 配套数据R包版本安装包版权答疑在生物信息学(生信)领域,随着高通量测序技术的不断发展,大量数据涌现,为科研工作者提供了丰富的资源。然而,对于初学者而言,如何从海量的数据中挖掘有价值的信息,并开展一个完整的生信项目,仍然是一个挑战。目前,市面上针对初…

PACKMOL 一:手把手教你用Linux安装 packmol

文章目录 1. PACKMOL介绍PACKMOL的主要用途&#xff1a;使用场景&#xff1a;优点&#xff1a; 2. PACKMO安装3. PACKMO验证结束语 1. PACKMOL介绍 PACKMOL 是一个开源软件&#xff0c;用于生成分子动力学模拟所需的初始结构。它的主要功能是根据用户定义的几何约束&#xff0…

Excel--WPS 函数与公式技巧(轻松搞定各类排名)

一、直接按成绩或数值的排序&#xff08;rank函数轻松搞定&#xff09; 以上函数非常简单&#xff0c;记住两点&#xff1a; 1.rank排名同分作为同一名次&#xff0c;后面的名次需要占位&#xff0c;如&#xff0c;以上两个70分&#xff0c;同为第8名&#xff0c;那么第9名将被…

局域网变压器市场价值

2024 年全球局域网变压器市场价值为 3.056 亿美元&#xff0c;预计到 2030 年将达到 4.426 亿美元&#xff0c;2024-2030 年的复合年增长率为 5.4%。 局域网变压器市场包括用于改变电信号电压或格式的产品&#xff0c;以改善和简化局域网 (LAN) 上的数据传输。这些变压器对于保…

01_WebRtc_一对一视频通话

文章目录 通话网页的设计客户端实现Web的API 服务端实现 2024-9-20 很久没有写博客啦&#xff0c;回顾总结这段时间的成果&#xff0c; 写下博客放松下&#xff08;开始偷懒啦&#xff09;主要内容&#xff1a;实现网页&#xff08;html&#xff09;打开摄像头并显示到页面需要…

《 LiteFlow 规则引擎(1) - 入门篇》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

品牌力是什么?如何评估企业品牌影响力?

品牌影响力&#xff0c;其实就是指品牌在消费者心智中所占据的位置&#xff0c;以及它对消费者购买决策和行为的影响力。如果一个企业的品牌影响力越强&#xff0c;它在消费者心中的印象就越深刻&#xff0c;能够更有效地驱动消费者的购买行为&#xff0c;形成品牌忠诚度&#…

Windows用管理员运行cmd命令后无法切换盘符

解决方法&#xff1a;在你的切换的盘符前面加上/d&#xff0c;如原本命令是&#xff1a;cd d:\。变为&#xff1a;cd /d d:\。

C++的扩充和封装

作业&#xff1a; 手动封装一个顺序表&#xff08;SeqList&#xff09;,分文件编译实现 有私有成员&#xff1a;顺序表数组的起始地址 ptr、 顺序表的总长度&#xff1a;size、顺序表的实际长度&#xff1a;len 成员函数&#xff1a;初始化 init(int n) 判空&#xff1a;em…

Zabbix 6.4添加中文语言

/usr/share/zabbix/include/locales .inc .phplocale -agrep “zh_CN" yum install langpacks-zh_CN.noarch y y y

浅谈死锁以及判断死锁的方法

引言 我们在并发情况下见过很多种锁&#xff0c;synchronized&#xff0c;ReentrantLock 等等&#xff0c;这些锁是为了保证线程安全&#xff0c;使线程同步的锁&#xff0c;与今天所要学习的死锁并不相同&#xff0c;死锁并不是一种锁&#xff0c;而是一种现象。 官方定义&a…

【CTF Reverse】XCTF GFSJ1101 Mine- Writeup(反编译+动态调试+Base58编码)

Mine- 运气怎么这么差&#xff1f; 原理 Base58 Base58是用于比特币&#xff08;Bitcoin&#xff09;中使用的一种独特的编码方式&#xff0c;主要用于产生Bitcoin的钱包地址。 相比Base64&#xff0c;Base58不使用数字"0"&#xff0c;字母大写"O"&…