首页 > 其他分享 >云原生:使用HPA和VPA实现集群扩缩容

云原生:使用HPA和VPA实现集群扩缩容

时间:2024-02-29 09:15:33浏览次数:26  
标签:副本 扩缩容 CPU VPA HPA Pod 资源

1 背景

我们之前介绍过,随着业务流量上涨之后,我们的系统需要适时的进行扩容。
数据存储层我们也介绍过MySQL的扩容 Scale UP(纵向扩展) 和 Scale Out(横向扩展)

  • 垂直拆分(Scale Up 纵向扩展):包括垂直分库、垂直分表
  • 水平拆分(Scale Out 横向扩展):包括库内分表、分库分表

详细可以参考笔者这几篇:
MySQL全面瓦解28:分库分表
MySQL全面瓦解29:分库分表之Partition功能详解
数据库系列:数据库高可用及无损扩容

存储层有高效动态的扩缩容机制,那计算服务也应该同步有这种能力,这样才能保证流量上涨时能够快速扩容。
如下图, 蓝色部件是扩容的部分,每一分层都有自己的扩容机制。
image

现在服务大都为云上服务,所以接下来我们详细介绍下Kubernetes中的HPA和VPA。

2 容器扩缩容介绍

2.1 先看下 HPA 和 VPA 的概念

VPA(Vertical Pod Autoscaler)和HPA(Horizontal Pod Autoscaler)都是Kubernetes中的自动扩展功能,但它们的作用对象和扩展方式不同。

HPA(纵向)的作用对象是Pod的数量。 它通过监控CPU使用率、内存使用率等指标,根据预设的阈值自动调整Pod的数量(即当个集群副本的数量)。当Pod的CPU和内存使用率超过阈值时,HPA会自动增加Pod的数量;当使用率下降时,HPA会自动减少Pod的数量。

VPA的作用对象是Pod的资源需求,如CPU、内存等。 它通过监控Pod的资源使用情况,根据实际的资源需求自动调整Pod的资源限制和请求。当Pod的资源使用率高于资源请求时,VPA会自动增加Pod的资源Request和Limit;当资源使用率下降时,VPA会自动减少Pod的资源Requist和Limit。这种方式可以帮助优化资源利用率,避免资源浪费。

2.2 HPA实现详解

HPA(纵向)的作用对象是Pod的数量。可针对CPU使用率、内存使用率进行扩缩容配置,会根据期望指标,会触发扩容或者缩容,若同时有多个指标,会取Max值。

如下图:
image

解读下:

  1. 设计HPA资源,包含实现扩容的条件
  2. 策略Yaml应用到HPA控制器中
  3. HPA控制器监听Prometheus,获取多个Metrix指标,如内存、CPU、连接数等
  4. 当监听的数据值大于等于扩容条件的阈值的时候,执行扩容操作
  5. 修改 replication controller, deployment, replica set, stateful set 中的pod数量
  6. 控制器定期调整 副本控制器(replica set) 或 部署(deploy) 中副本的数量

算法解析:

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

即 (当前指标值 ➗ 期望指标值) ✖️ 当前副本数 ,结果再向上取整,最终结果就是期望的副本数量

举例说明:

apiVersion: autoscaling/v2beta2  
kind: HorizontalPodAutoscaler  
metadata:  
  name: hpa-example  
spec:  
  scaleTargetRef:  
    apiVersion: apps/v1  
    kind: Deployment  
    name: hpa-example  
  minReplicas: 10  # Pod副本数下限
  maxReplicas: 20  # Pod副本数上限
  metrics:  
  - type: Resource  
    resource:  
      name: cpu  
      target:  
        type: Utilization  
        averageUtilization: 60  # 当CPU利用率大于60%或者内存占用大于60%的时候,执行调整
  1. 假设当前指标:CPU利用率 70%
  2. 期望指标:CPU利用率60%
  3. 假设当前副本数:10
  4. 期望副本数:ceil(10*(70/60))=12
  5. 最终总的Pod副本数应该是12,即扩容数量为2
  6. 注意扩容和缩容幅度不能超过 HorizontalPodAutoscaler 资源中的副本上下限

2.3 VPA实现详解

因为VPA影响的是Pod的Request和Limit这两个参数,所以我们先了解下这两个属性的含义。
1. Request表示容器在运行过程中所需的最小资源量,即容器启动时的资源保证。
当Pod被调度到节点上时,Kubernetes会确保该节点上至少有足够的资源来满足Pod中所有容器的Request值。如果节点的可用资源无法满足Pod的Request值,则不会被调度到该节点上,而是保持在Pending状态,直到找到满足条件的节点为止。
因此,合理设置Request值可以确保Pod的稳定性和可靠性。

2. Limit则表示容器在运行过程中可以使用的最大资源量,即容器可以消耗的资源上限。
如果容器的实际资源使用量超过了Limit值,Kubernetes会采取相应的措施来限制容器的资源使用,例如限制CPU使用率、杀死进程等,以确保不会因资源不足而导致系统崩溃或性能下降。
通过设置Limit值,可以有效地防止单个容器或整个Pod占用过多的资源,从而影响整个集群的性能和稳定性。

apiVersion: v1
kind: Pod
  - apiVersion: v1
  name: xx-default-756gh8588cc
  namespace: xx-ns
spec:  
  containers:    
    name: xx-default
    resources:
      limits:  # 对应上限最大值
        cpu: "2"
        memory: 8G
      requests:  # 对应下限最小值
        cpu: 200m
        memory: 500Mi

而 VPA 是Kubernetes的一种自动调整Pod资源请求(Request)配额的工具。通过VPA,您可以根据Pod的实际资源使用情况动态地调整其CPU和内存资源请求(Request),以实现更精细的资源管理和更好的资源利用率。
简单理解就是 取服务一定周期内(如8天内) CPU 和内存资源用量的 TP90 分位数据作为推荐值可以参考kubernetes的算法

举例说明:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: myapp-vpa-default
  namespace: xx-ns
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-vpa-default
  updatePolicy:
    updateMode: "Off"  # 不直接进行修改
status:
  recommendation:
    containerRecommendations:
    - containerName: msg-index-default
      lowerBound: # 下限值
        cpu: 480m
        memory: "7117753323"
      target:  # 推荐值
        cpu: 930m
        memory: "8701517761"
      uncappedTarget:
        cpu: 930m
        memory: "8701517761"
      upperBound: # 上限值
        cpu: 1100m
        memory: "8841153193"

在这个配置中,我们定义了一个名为myapp-vpa的VPA,它将调整名为myapp的Deployment中的Pod的资源。
从输出信息可以看出,VPA对Pod给出了推荐值:Cpu: 930m,Memory: 8Gi,因为 updatePolicy 策略设置了updateMode: "Off",所以不会主动更新Pod。

上面的案例可以通过下面的图进行演进:通过VPA的推荐,我们将Request值从 200m的CPU 和 500Mi 的内存,调整为 1 Core 的CPU 和 8Gi 的内存。
image
调优完成之后,资源分配更加合理,资源更充足,性能、稳定性更高。

3 总结

总的来说,HPA是通过自动调整Pod的数量来应对负载压力,而VPA是通过自动调整Pod的资源需求来优化资源利用率。它们可以配合使用,实现更加精细的自动扩展策略。保证流量动态变化的业务场景中实现资源的弹性伸缩,实现资源的最优合理性利用。

标签:副本,扩缩容,CPU,VPA,HPA,Pod,资源
From: https://www.cnblogs.com/wzh2010/p/18031123

相关文章

  • k8s hpa自定义指标
    参考链接 https://blog.csdn.net/fly910905/article/details/105375822这个大佬写的挺好的。不再搬运了,仅不不懂的地方记录一下。哈哈哈模拟增加memory的脚本解释一下,因为我也第一次见到这么玩,命令也是新鲜#!/bin/bashmkdir/tmp/memorymount-ttmpfs-osize=40Mt......
  • GraphPad Prism 10: 你的数据,我们的魔法 mac/win版
    GraphPadPrism10是GraphPadSoftware公司推出的一款功能强大的数据分析和可视化软件。它集数据整理、统计分析、图表制作和报告生成于一体,为科研工作者、学者和数据分析师提供了一个高效、便捷的工作平台。→→↓↓载GraphPadPrism10mac/win版Prism10拥有丰富的图表类型,......
  • 在k8S中,HPA V1 V2的区别是什么?
    在Kubernetes中,HPA(HorizontalPodAutoscaler)的不同版本主要指的是API资源对象的版本及其功能差异。以下是HPAV1和V2的主要区别:HPAv1(autoscaling/v1)稳定版:HPAv1是一个稳定的API版本,意味着其接口不会轻易发生变化。支持指标:只支持基于CPU利用率(targetCPUUtilizationPerce......
  • k8s pod自动扩缩容
    Pod自动扩缩容为什么要扩缩容?在实际的业务场景中,我们经常会遇到某个服务需要扩容的场景(如:对服务器性能压测、电商平台秒杀、大促活动、或由于资源紧张、工作负载降低等都需要对服务实例数进行扩缩容操作。)node节点默认可以跑110个pod在k8s中扩容分为两种:1、node层面:在使用k8......
  • 在K8S中,HPA原理是什么?
    在Kubernetes(简称K8s)中,HorizontalPodAutoscaler(HPA)是一种自动扩展Pod副本数量的机制,其原理是基于集群中运行的应用程序资源使用情况动态调整Pod副本的数量。HPA的工作原理可以概括为以下几个步骤:监控指标:HPA通过与KubernetesMetricsAPI交互,持续监控指定目标对象(如Deploy......
  • 若依页面刷新 $tabs.refreshPage()
    前言若依封装了$tab对象,其中有个刷新页签的方法。看了下refreshPage()的源码,发现是用router.replace()替换当前位置的。但是当前路由地址前加了/redirect前缀,不知这个有什么作用。查看相关源码,发现:如果不加该前缀,控制台会报错如下:定义了/redirect/:path(.*)公共......
  • openEuler欧拉使用sshpass不输入密码远程登录其他服务器
    ssh登陆不能在命令行中指定密码,sshpass的出现则解决了这一问题。用-p参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。操作步骤:一、关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld二、安装sshpassdnf-yinstallsshpass三......
  • 基于k8s Deployment的弹性扩缩容及滚动发布机制详解
    k8s第一个重要设计思想:控制器模式。k8s里第一个控制器模式的完整实现:Deployment。它实现了k8s一大重要功能:Pod的“水平扩展/收缩”(horizontalscalingout/in)。该功能从PaaS时代开始就是一个平台级项目必备编排能力。若你更新了Deployment的Pod模板(如修改容器的镜像),则Deployment......
  • openEuler欧拉使用sshpass不输入密码远程登录其他服务器
    ​​ssh登陆不能在命令行中指定密码,sshpass的出现则解决了这一问题。用-p参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。操作步骤:一、关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld二、安装sshpassdnf-yinstall......
  • 请求参数之@PathVariable与@PathParam
    初学springmvc容易分不清楚这两个参数之间的用法差别,如果较长一段时间不接触,可能又会搞忘,贴个笔记,方便以后回顾以及初学者参考。如有错误,还请指正。@PathVariable:@PathVariable适用于RESTFULL风格的请求。例://请求样式为restfulhttp://localhost:8080/user/张三@Ge......