Kubernetes HPA 动态弹性扩缩容

news2024/11/19 7:35:49

1.HPA

1.1HPA介绍

1.在Kubernetes中,HPA自动更新工作负载资源(例如:Deployment或者StatefulSet),目的是自动扩缩工作负载以满足需求,水平扩缩意味着对增加的负载的响应是部署更多的 Pod,与垂直扩缩不同,对于Kubernetes,垂直扩缩意味着将更多资源(例如:内存或CPU)分配给已经为工作负载运行的Pod;如果负载减少,并且Pod的数量高于配置的最小值,HPA会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减,HPA不适用于无法扩缩的对象(例如:DaemonSet)

2.HPA会通过调整副本数量使得CPU使用率尽量向期望值靠近,而且不是完全相等.另外,官方考虑到自动扩展的决策可能需要一段时间才会生效;例如当pod所需要的CPU负荷过大,从而在创建一个新pod的过程中,系统的CPU使用量可能会同样在有一个攀升的过程;所以,在每一次作出决策后的一段时间内,将不再进行扩展决策;对于扩容而言,这个时间段为3分钟,缩容为5分钟

        官网地址:

https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/

1.2工作原理

kubernetes中的Metrics Server会持续采集Pod的指标数据,HPA控制器通过Metrics Server的API获取这些数据,基于用户定义的扩缩容规则进行计算,得到目标Pod副本数量;当目标Pod副本数量与当前副本数量不同时,HPA控制器就向Pod的副本控制器(Deployment、StatefulSet或ReplicaSet)发起scale操作,然后副本控制器会调整Pod的副本数量,完成扩缩容操作

2.Metrics Server

2.1Metrics Server介绍

Metrics Server是Kubernetes容器资源指标的可扩展、高效来源、内置自动缩放管道,是由用户开发的一个api server,集群范围的资源使用情况的指标监控器,在HAP早期版本使⽤的是⼀个叫Heapster组件来提供CPU和内存指标的,在后期的版本Kubernetes转向了使⽤Metrcis Server组件来提供Pod的CPU和内存指标,Metrcis Server通过Metrics API将数据暴露出来,然后我们就可以使⽤Kubernetes的API来获取相应的数据;

        文档地址:

https://github.com/kubernetes-sigs/metrics-server

2.1Metrics Server安装

        下载项⽬yaml⽂件

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml

        修改配置文件

spec:
hostNetwork: true                    #使⽤host⽹络模式
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls             #跳过证书检查
image: bitnami/metrics-server:0.6.0  #修改为本地的镜像

        创建资源

kubectl apply -f high-availability.yaml

        查看结果

3.创建dp资源压测

3.1autoscaling/v1

        CPU指标实践

1)创建deployment资源

$ vim nginx-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hpa
spec:
  replicas: 1
  selector:
     matchLabels:
       app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/nginx
        ports:
        - containerPort: 80
        resources:
          limits:
             cpu: 200m
          requests:
             cpu: 200m

2)创建hpa资源

$ vim nginx-hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  maxReplicas: 5
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-hpa
  targetCPUUtilizationPercentage: 10

清单解释:

apiVersion: autoscaling/v1            #版本为autoscaling/v1
kind: HorizontalPodAutoscaler         #类型为HPA
metadata:     
  name: nginx-hpa                     #HPA的名称
  labels:
    app: nginx                        #选择app=nginx的pod
spec:     
  maxReplicas: 5                      #伸缩最大副本数
  minReplicas: 1                      #伸缩最小副本数
  scaleTargetRef:                     #要伸缩的目标资源,这里为 deployment
    apiVersion: apps/v1               #伸缩类型的版本,这里为 deployment,版本为apps/v1         
    kind: Deployment                  #扩缩容的对象是deployment
    name: nginx-hpa                   #deployment的名称
  targetCPUUtilizationPercentage: 10  # 定义检测的CPU使用率指标的阈值,这里为10,当小于10%的时候就会缩容,大于的时候就会扩容

        查看

3)增大负载压测

        创建一个 busybox 的Pod,并且循环访问上面创建的Pod

kubectl run -it --image busybox test-hpa --restart=Never --rm /bin/sh

/ # while true; do wget -q -O- http://10.224.102.190; done

        新开一个窗口查看

         如果CPU使⽤率降下来了,默认5分钟后进⾏收缩

#坑:
创建的pod一定要加资源限制,否则hpa会报错unknown

3.2autoscaling/v2beta2

        基于resource类型cpu和内存的限制实践

1)创建deployment资源

$ vim nginx-dpv2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hpa
spec:
  replicas: 1
  selector:
     matchLabels:
       app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/nginx
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: 32Mi
            cpu: 50m
          limits:
            memory: 256Mi
            cpu: 100m

2)创建hpa资源

$ vim nginx-hpav2.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpav2
  labels:
    app: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-hpa
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 300Mi

        清单解释:

apiVersion: autoscaling/v2beta2       #版本为autoscaling/v2beta2
kind: HorizontalPodAutoscaler         #类型为HPA
metadata:     
  name: nginx-hpav2                   #HPA的名称
  labels:     
    app: nginx                        #选择app=nginx的pod
spec:     
  scaleTargetRef:                     #要伸缩的目标资源,这里为deployment
    apiVersion: apps/v1               #伸缩类型的版本,这里为deployment,版本为apps/v1
    kind: Deployment                  #扩缩容的对象是deployment
    name: nginx-hpa                   #deployment的名称
  minReplicas: 1                      #最小副本数
  maxReplicas: 10                     #最大副本数
  metrics:                            #动态伸缩的控制指标
  - type: Resource          
    resource:                         #当前伸缩对象下的pod的指标,只支持Utilization和AverageValue类型的阈值
      name: cpu                       #限制cpu
      target:
        type: Utilization
        averageUtilization: 80        #当整体的资源利用率超过百分之80的时候,会进行扩容
  - type: Resource
    resource:
      name: memory                    #限制内存
      target:
        type: AverageValue            
        averageValue: 300Mi           #当指标的平均值或资源的平均利用率超过300的时候,会进行扩容

        运行

kubectl apply -f nginx-dpv2.yaml
kubectl apply -f nginx-hpav2.yaml

3)增大负载压测

#创建一个 busybox 的Pod,并且循环访问上面创建的Pod
kubectl run -it --image busybox test-hpa --restart=Never --rm /bin/sh

/ # while true; do wget -q -O- http://10.224.102.133; done

        查看pod可以看到扩容了2个pod

         查看hpa

4.hpa资源配置清单不同类型模板

apiVersion: autoscaling/v2beta2         #版本为autoscaling/v2beta2
  kind: HorizontalPodAutoscaler         #类型为HPA
  metadata:           
    name: xxxx                          #HPA的名称
    namespace: xxxx                     #命名空间
    behavior:                           #用来精确控制hpa的扩容和缩容的速度
      scaleDown:                        #缩容速度策略
        policies:             
        - type: Pods                    #允许在一分钟内最多缩容4个副本
          value: 4    
          periodSeconds: 60 
        - type: Percent                 #允许在一分钟内最多缩容当前副本个数的百分之十
          value: 10     
          periodSeconds: 60             
        stabilizationWindowSeconds: 300 #5分钟后进⾏收缩
      scaleUp:                          #扩容速度策略
        policies:
        - type: Percent                 #每15秒扩容100%当前运行的副本数
          value: 100        
          periodSeconds: 15
        - type: Pods                    #每15秒添加4个Pod
          value: 4
          periodSeconds: 15
        selectPolicy: Max               #取两个策略中的最大改变值
        stabilizationWindowSeconds: 0
    maxReplicas: xx                     #最大副本数
    minReplicas: xx                     #最小副本数
    scaleTargetRef:                     #要伸缩的目标资源,这里为deployment
      apiVersion: apps/v1               #伸缩类型的版本,这里为deployment,版本为apps/v1
      kind: Deployment                  #扩缩容的对象是deployment
      name: xxxx                        #deployment的名称
    metrics:                            #动态伸缩的控制指标
    - type: Resource                    #Resource类型的指标
      resource:                         #当前伸缩对象下的pod的指标
        name: cpu                       #限制cpu
        target:
          type: Utilization             #Resource类型的指标只支持Utilization和AverageValue类型的目标值
          averageUtilization: xx        #当整体的资源利用率超过百分之xx的时候,会进行扩容
    - type: ContainerResource           #ContainerResource类型的指标
      containerResource:                #伸缩对象下的容器的cpu和memory指标
        container: xxxx                 #容器名
        name: cpu                       #限制cpu
        target: 
          type: Utilization
          averageUtilization: 60        #对容器执行扩缩操作确保所有Pod中容器的平均CPU用量为60%
    - type: Pods                        #Pods类型的指标
      pods:                             #伸缩对象Pods的指标,数据需要第三方的adapter提供
        metric:
          name: xxxx                    #Pod的指标名
          selector:                     #具有此标签的指标名
          - matchExpressions:           
            - key: xxxx               
              operator: In       
              values: 
              - xxxx
              - xxxx                    #可以定义多个标签              
        target:
          type: AverageValue            #Pods指标类型下只支持AverageValue类型的目标值
          averageValue: 1k              #在目标指标平均值为1000时触发扩缩容操作
    - type: External                    #External类型的指标
      external:                         #k8s外部的指标
        metric:
          name: xxxx                    #外部指标名
          selector:                     
            matchLabels:                #外部指标标签
              env: "xxxx"
              app: "xxxx"               #可以定义多个标签
        target:
          type: AverageValue            #External指标类型下只支持Value和AverageValue类型的目标值
          averageValue: 30              #在目标指标平均值为30时触发扩缩容操作
    - type: Object
      object:                           #用于描述k8s内置对象的指标
        describedObject:
          apiVersion: networking.k8s.io/v1beta1
          kind: Ingress                 #扩缩容的对象是deploymentIngress
          name: main-route
        metric:
          name: ingress_test            #指标名
        target:
          type: Value                   #Object类型的指标只支持Value和AverageValue类型的目标值
          value: 2k                     #在Ingress的每秒请求数量达到2000个时触发扩缩容
    - type: Object
      object:
        metric:
          name: 'http_requests'         #指标名
          selector: 'verb=GET'          #具有verb=GET标签的资源对象
        target:
          type: AverageValue
          AverageValue: 500             #在指标平均值达到500时触发扩缩容操作

        到此 Kubernetes HPA 动态弹性扩缩容介绍完成。

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

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

相关文章

算法工程师深度解构ChatGPT技术

引言 | 本栏目特邀腾讯知名语言文本项目算法工程师冉昱、薛晨,用专业视野带你由浅入深了解ChatGPT技术全貌。它经历了什么训练过程?成功关键技术是什么?将如何带动行业的变革?开发者如何借鉴ChatGPT思路和技术,投入到日…

西门子PLC S7-1500产生精确时间戳及各种数据处理的方法

目录 1、完整程序 2、将时钟转换成整型数 3、获取相对时间 4、转成微秒(μs),并转成32位无符号整数 5、翻转的问题 6、有时间戳采集时的对时机制 在数据采集时,精准的相对时间是非常重要的。尤其是高速采集时,上位…

算法训练第四十五天 | LeetCode 70、322、279背包问题

LeetCode 70爬楼梯 题目简析: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 思路分析: 用完全背包的思路来做,见注释 //普通dppublic int climbStairs(in…

Redis框架(四):大众点评项目 基于Redis的短信登录

大众点评项目 基于Session的短信登录需求:基于Redis实现短信验证登录基于Redis的短信登录实战优化为Redis login方法配置拦截器实现双重验证配置类实现异步/排序 拦截结果展示SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会…

【图像处理】DWT图像处理【含Matlab源码 198期】

⛄一、数字图像处理简介 图像处理基础教程链接 1 【基础教程】基于matlab图像处理(表示方法数据结构基本格式类型转换读取点运算代数运算)【含Matlab源码 834期】 2 【基础教程】基于matlab图像处理(读写显示运算转换变换增强滤波分析统计&a…

jvm学习笔记(一)----jvm简史

文章目录1. JVM简单介绍2. java虚拟机介绍1. JVM简单介绍 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏…

ASP.NET微信快速开发框架源码【源码分享】

ASP.NET微信快速开发框架源码 微信公众平台快速开发框架源码 需要源码学习,查看文末卡片获取,或私信我。 框架主要技术: ASP.NET MVC5、ASP.NET Identity、Bootstrap、KnockoutJs、Entity Framework等。 主要特色: 1、快速迭代开…

Redis主从复制原理

前面的文章中我们演示过Redis主从配置的操作,可以查看之前的博文Redis主从配置教程。这篇文章主要介绍一下Redis主从复制的工作过程和原理。 Redis复制工作过程 Redis复制的工作过程如上图,主要包含以及几个阶段: 1. 设置IP端口并建立连接 …

C++学习笔记(十九)——stack和queue的模拟实现

容器适配器 deque的简单介绍 stack的模拟实现 queue的模拟实现 容器适配器 适配器:一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口. stack和queue的底层结构 可以看出的是,这两个容器 相比我们之间见过的容器多了一个模板参数,也就是容器类的模板参数,…

数据结构复习+答案

一、选择题:(每小题2分,共30分) 1、在数据的逻辑结构中,树结构和图结构都是( ) A.非线性结构 B.线性结构 C.动态结构 D.静态结构 2.在一个长度为n的顺序表中插入一个元素的算法的时间复杂度为&…

ThinkPHP文件包含漏洞分析

出品|长白山攻防实验室(ID:A_Tree) 0x00 声明 以下内容,来自长白山攻防实验室的A_Tree作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室…

全宇宙最强AI 聊天机器人模型ChatGPT惊艳来袭,你还不上车?居然能写演讲稿和帮忙写代码

目录1、ChatGPT介绍2、ChatGPT如何注册,国内不可用3、VS Code下载安装ChatGPT3.1 打开VS Code找到ChatGPT3.2 ChatGPT 详细安装步骤:3.3 用法3.4 国外模式’ 此模式下,速度会比较稳定,如果有条件,建议使用本模式。 理论…

大数据HDFS凭啥能存下百亿数据?

前言 大家平时经常用的百度网盘存放电影、照片、文档等,那有想过百度网盘是如何存下那么多文件的呢?难到是用一台计算机器存的吗?那得多大磁盘啊?显然不是的,那本文就带大家揭秘。 分布式存储思想 既然一台机器的存储…

Spring 核心与设计思想 · Spring IoC容器 · 控制反转式程序开发 · DI概念

Spring 是什么?一、什么是容器?二、什么是 IoC?2.1 传统程序开发2.2 控制反转式程序开发2.3 对比总结规律三、理解 Spring IoC四、DI 概念说明Spring 是什么? 我们通常说的 Spring 是指 Spring Framework(Spring 框架…

【Mysql】知识体系结构构建以及常见考题汇总

【Mysql】知识体系结构构建以及常见考题汇总1、基本SQL知识1.1、D_L语法以及表中常用约束1.2、mysql表列常用数据结构1.3、事务(此处展示并发事务问题以及解决方案、实现原理见2.3)read uncommitted有脏读问题read committed解决脏读、有不可重复读问题r…

Android基础学习(二十)—— 线程安全

1、Android中线程的常见用法 (1)继承 Thread class MyThread extends Thread{Overridepublic void run(){//处理具体的逻辑} } new MyThread().start(); //启动此线程//使用匿名类 new Thread(){Overridepublic void run(){//处理具体的逻辑} }.star…

【加油站会员管理小程序】03 创建应用

我们上一篇介绍了数据源的创建,本篇我们介绍应用的创建。 微搭低代码中一共有两类应用,一类是数据模型应用,一类是自定义应用。数据模型应用往往对应着PC端的管理后台,例如我们的小程序通常需要一个管理后台来录入数据。 自定义…

【linux】2022年还能用,网易真的是良心啊,网易云音乐linux版本现在还是可以使用的超赞!!官方网的下载地址还可以使用,音乐使用的是qt5进行开发的。

目录前言1,关于网易云音乐2,可以正常使用,可以登录前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/128261513 未经博主允许不得转载。 博主CSDN地址是:https://blog.csdn.net/freewebsys 博主掘金地址…

vue.js:父子组件的实训案例

作业需求 需求1:定义两个输入框,通过输入框输输入的值改变页面显示的值需求2:改变第一个输入框的值的同时使得第二个输入框的值变为100倍并显示需求3:改变第二个输入框的值的同时使得第一个输入框的值变为1/100并显示 实训代码实…

CentOS搭建基于ZIPKIN的数据追踪系统

ZipKin入门介绍 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。分布式跟踪系统还有其…