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

news2024/11/11 4:46:00

【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: None
  selector:
    app: redis
  ports:
  - port: 6379
    name: redis

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: "redis"
  replicas: 1
  minReadySeconds: 20
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: harbor.zx/hcie/redis:7.2.4
        resources:
          requests:
            cpu: "100m"
          limits:
            cpu: "300m"
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: redis-storage
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: redis-storage
    spec:
      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/v1
    kind: StatefulSet
    name: redis
  minReplicas: 1
  maxReplicas: 5
  targetCPUUtilizationPercentage: 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:                                          5
 StatefulSet pods:                                      1 current / 1 desired
 Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   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.coloradmin.cn/o/2150490.html

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

相关文章

7--SpringBoot-后端开发、原理详解(面试高频提问点)

目录 SpringBoot原理 起步依赖 自动配置 配置优先级 Bean设置 获取Bean 第三方Bean SpringBoot原理 内容偏向于底层的原理分析 基于Spring框架进行项目的开发有两个不足的地方&#xff1a; 在pom.xml中依赖配置比较繁琐&#xff0c;在项目开发时&#xff0c;需要自己去找…

使用Anaconda安装pyTorch

1.Anaconda简介 Anaconda 是一个流行的 Python 数据科学和机器学习平台&#xff0c;它简化了包管理和部署&#xff0c;使得安装、运行和升级包及其依赖变得非常容易。Anaconda 通过其内置的 Conda 包和环境管理器&#xff0c;提供了一个强大的环境&#xff0c;用于科学计算&…

OpenAI GPT o1技术报告阅读(3)-英文阅读及理解

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个英文阅读理解的案例。 原问题&#xff1a; The following passage is the draft of an excerpt from a contempora…

springboot调用python脚本实现ocr图片文字识别功能

OCR简介: OCR(Optical Character Recognition),即光学字符识别,是一种利用计算机自动识别和解析图像中的文字信息的技术。它能够将纸质文档、图片、照片等载体上的文字信息转化为计算机可编辑和处理的文本数据。 一,准备工作 1,java环境 2,springboot项目 3,python环境 …

【二级C语言考试】自定义数据类型

C语言二级考试——自定义数据类型 十、结构体&#xff08;即“结构”&#xff09;与共同体&#xff08;即“联合”&#xff09; 用 typedef说明一个新类型。结构体和共用体类型数据的定义和成员的引用。通过结构体构成链表&#xff0c;单向链表的建立&#xff0c;结点数据的输出…

Java中ArrayList和LinkedList的比较

注&#xff1a;Joshua Bloch 就是 LinkedList 的作者 在Java中&#xff0c;ArrayList和LinkedList都是常用的列表实现类&#xff0c;它们都实现了List接口&#xff0c;但在内部工作原理和性能方面有显著差异。 ArrayList&#xff1a;基于动态数组实现。随着元素的增加&#x…

小新-13 2019 Intel款IML版【81UQ】原装出厂Win10系统镜像下载

恢复lenovo联想开箱状态&#xff0c;自带预装OEM系统安装包 链接&#xff1a;https://pan.baidu.com/s/1wwPriBoIwNOAfL-YcX1F7g?pwdg7ki 提取码&#xff1a;g7ki 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软…

如何联系真正的开发者而非公司??

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

T9-猫狗识别2(暂时版qaq)

T9周&#xff1a;猫狗识别2 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****七、预测**八、总结&#xff08;暂时&#xff09; &…

信奥初赛解析:1-3-计算机软件系统

知识要点 软件系统是计算机的灵魂。没有安装软件的计算机称为“裸机”&#xff0c;无法完成任何工作硬件为软件提供运行平台。软件和硬件相互关联,两者之间可以相互转化&#xff0c;互为补充 计算机软件系统按其功能可分为系统软件和应用软件两大类 一、系统软件 系统软件是指…

【Redis入门到精通三】Redis核心数据类型(List,Set)详解

目录 Redis数据类型 ​编辑 1.List类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 2.Set类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 Redis数据类型 查阅Redis官方文档可知&#xff0c;Redis提供给用户的核…

【2024/09/20更新】植物大战僵尸杂交版V2.5下载

植物大战僵尸杂交版V2.5 2.5版本更新公告&#xff1a; 增加新关卡– 益智模式–两面夹击模式关卡 挑战模式关卡 增加新铲子–骷髅铲子 --银币购买-挖掉植物触发亡语或召唤骷髅僵尸 增加新植物– 4张白卡植物-通过两面夹击获得 2张金卡植物和4张星卡植物 游戏调整– 调整…

Coggle数据科学 | 科大讯飞AI大赛:玉米雄穗识别挑战赛

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;科大讯飞AI大赛&#xff1a;玉米雄穗识别挑战赛 赛题名称&#xff1a;玉米雄穗识别挑战赛 赛题类型&#xff1a;计算机视觉、物体检测 赛题任务&…

图的应用(关键路径)

基于你设计的带权有向无环图&#xff0c;写出所有合法的关键路径&#xff0c;并算出关键路径总长度 文字描述&#xff1a;关键路径总长度的现实意义是什么&#xff1f; 1.关键路径 总长度454316 2.现实意义 从源点到汇点的所有路径中&#xff0c;具有最大路径长度的路径称…

MySQL高阶1892-页面推荐2

目录 题目 准备数据 分析数据 总结 题目 您正在为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 &#xff0c;而 不被user_id喜欢 &#xff0c;你的系统将 推荐 一个页面到user_id。 编写一个解决方案来查找针对每个用户的所有可能的 页面…

感知笔记3:平面和物体检测

识别平面表面&#xff1a;这项技能使机器人能够检测物体通常所在的位置&#xff0c;如桌子和架子。这是搜索物体的第一步。识别物体&#xff1a;一旦您知道在哪里寻找&#xff0c;就必须在场景中识别不同的物体&#xff0c;并根据机器人的位置&#xff08;坐标系&#xff09;定…

【STL】pair 与 map:基础、操作与应用

C 标准库中提供了许多用于处理数据结构的容器和工具。pair 和 map 是两个非常有用的工具&#xff0c;广泛应用于存储和处理关联数据。在本文中&#xff0c;我们将详细介绍 pair 与 map 的相关操作&#xff0c;并结合代码实例为读者提供清晰的理解。 pair&#xff1a;成对数据的…

基于SpringBoot+Vue的家政预约平台系统

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

powerbi-L8-导入数据时候的动态列

背景&#xff1a; 在数据导入之后刷新的过程中出现了无法刷新的异常报错&#xff0c; 检查后发现是由于原始数据的列的名字变化导致了power BI在处理数据类型的时候 需求 处理方法是什么&#xff0c; &#xff1f; 方法 动态获取表格的列&#xff1a; 获取数据的时候&#xff…

身份证识别接口的应用场景和作用

引言 在信息化与数字化高速发展的今天&#xff0c;身份证作为个人身份的重要证明文件&#xff0c;在各行各业的应用越来越广泛。传统的身份证信息录入和审核过程通常需要人工操作&#xff0c;不仅效率低下&#xff0c;而且容易出现错误。为了解决这些问题&#xff0c;身份证识别…