简述

HPA全称HorizontalPodAutoscaler Pod水平自动扩缩容,Kubernetes控制器HPA是一种用于自动调整Pod数量的控制器。它可以根据资源使用情况自动增加或减少Pod的数量,以确保应用程序的高可用性和性能。HPA可以根据CPU使用率或自定义指标来进行调整,例如请求延迟或网络吞吐量

Pod 水平自动扩缩中文文档

工作原理

HPA一般通过指示工作负载资源如Deployment、StatefulSet 或其他类似资源进行扩缩容,对于像DaemonSet这种无法扩缩的对象不适用

使用之前我们先安装metrics-server,它可以用来收集集群中的资源使用情况。hpa通过metrics-server的api获取这些数据,然后进行扩缩容的副本计算,得到目标副本数量,如果与当前副本数不相同就通过副本控制器进行scale操作

metrics-server的yaml清单获取
metrics-server

安装完后使用top命令查看

[root@master hpa]# kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master   124m         6%     2508Mi          69%
node01   59m          2%     1941Mi          54%
node02   53m          2%     2010Mi          55%

hpa资源文件清单

apiVersion: autoscaling/v2beta1  # 使用autoscaling/v2beta1版本的HPA API
kind: HorizontalPodAutoscaler   # 定义HPA控制器
metadata:name: example-hpa   # HPA资源的名称namespace: default  # HPA资源所在的命名空间
spec:scaleTargetRef:apiVersion: apps/v1kind: Deployment   # 所有Pod数量将根据该Deployment对象的副本数量进行自动缩放name: example-deployment  # HPA将控制的Deployment对象名称minReplicas: 2   # 最小Pod数量maxReplicas: 10  # 最大Pod数量metrics:- type: Resource   # 使用资源指标类型resource:name: cpu   # 使用CPU使用率作为资源指标target:type: Utilization   # 使用CPU利用率作为度量标准averageUtilization: 50   # 目标CPU利用率,达到该利用率时触发自动扩缩容- type: Object   # 使用对象指标类型object:metricName: example_http_requests_total   # 自定义指标名称target:type: Value   # 目标值类型,可以是Value或AverageValuevalue: "100"  # 触发自动扩缩容的目标值describedObject:apiVersion: v1kind: Service   # 该对象指标作用于Service对象name: example-service   # 该对象指标作用于的Service对象名称

上面的自定义指标配置不会再本章讲解

案例

下面以一个案例来解释hpa的使用

使用hpa来控制deployment自动扩缩容,当pod资源平均使用率达到3%时进行扩容

创建一个Deployment

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:selector:matchLabels:app: nginx-hpatemplate:metadata:labels:app: nginx-hpaspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80protocol: TCPresources:requests:memory: "50Mi"cpu: "100m"
# 创建deployment
[root@master hpa]# kubectl create -f hpa-deploy.yaml
deployment.apps/nginx created
# 记录下IP后面压测用到 10.244.2.104
[root@master hpa]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP             NODE     NOMINATED NODE   READINESS GATES
nginx-659b6d57bd-5tbg2   1/1     Running   0          10s   10.244.2.104   node02   <none>           <none>

创建HPA
最小副本数1,最大10 autoscaling/v1版本

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: hpa
spec:minReplicas: 1maxReplicas: 10targetCPUUtilizationPercentage: 3scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx

autoscaling/v2版本

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: hpa
spec:minReplicas: 1maxReplicas: 10scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginxmetrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 3
# 创建hpa
[root@master hpa]# kubectl create -f hpa.yaml
horizontalpodautoscaler.autoscaling/hpa created# 查看hpa,还没有完全启动完
[root@master hpa]# kubectl get hpa
NAME   REFERENCE          TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
hpa    Deployment/nginx   <unknown>/3%   1         10        0          6s# 再次查看hpa,启动完成 目前资源使用率 0%
[root@master hpa]# kubectl get hpa
NAME   REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa    Deployment/nginx   0%/3%     1         10        1          20s

使用ab工具进行压测,没有该工具需要安装 httpd-tools

# 安装 httpd-tools
yum -y install httpd-tools# ab工具可以模拟多个用户(并发请求),向Web服务器发送请求,并统计响应时间和处理请求数量等信息
# ab -n requests -c concurrency url
# 参数说明:
#- requests:总请求数,例如:-n 1000。
#- concurrency:并发请求数,例如:-c 10。
#- url:测试的URL地址。

压测

ab -n 10000 -c 1000 http://10.244.2.104/

观察压测结果

# 监听hpa 发现压测中cpu达到60% ,后面又降回去了
[root@master ~]# kubectl get hpa -w
NAME   REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa    Deployment/nginx   0%/3%     1         10        1          7m30s
hpa    Deployment/nginx   60%/3%    1         10        1          9m1s
hpa    Deployment/nginx   0%/3%     1         10        4          9m16s
hpa    Deployment/nginx   0%/3%     1         10        8          9m31s
hpa    Deployment/nginx   0%/3%     1         10        10         9m46s
# 监听Pod 一开始只有一个nginx-659b6d57bd-5tbg2 运行了8m47s,压测后又创建了9个Pod,观察ContainerCreating数量
[root@master hpa]# kubectl get pod -w
NAME                     READY   STATUS    RESTARTS   AGE
nginx-659b6d57bd-5tbg2   1/1     Running   0          8m47s
nginx-659b6d57bd-47f98   0/1     Pending   0          0s
nginx-659b6d57bd-47f98   0/1     Pending   0          0s
nginx-659b6d57bd-qs4tr   0/1     Pending   0          0s
nginx-659b6d57bd-tvnmp   0/1     Pending   0          0s
nginx-659b6d57bd-tvnmp   0/1     Pending   0          0s
nginx-659b6d57bd-qs4tr   0/1     Pending   0          0s
nginx-659b6d57bd-47f98   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-qs4tr   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-tvnmp   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-47f98   1/1     Running             0          1s
nginx-659b6d57bd-tvnmp   1/1     Running             0          1s
nginx-659b6d57bd-qs4tr   1/1     Running             0          2s
nginx-659b6d57bd-mccdl   0/1     Pending             0          0s
nginx-659b6d57bd-mccdl   0/1     Pending             0          0s
nginx-659b6d57bd-w9r46   0/1     Pending             0          0s
nginx-659b6d57bd-498c2   0/1     Pending             0          0s
nginx-659b6d57bd-w9r46   0/1     Pending             0          0s
nginx-659b6d57bd-498c2   0/1     Pending             0          0s
nginx-659b6d57bd-mccdl   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-nvhgh   0/1     Pending             0          0s
nginx-659b6d57bd-nvhgh   0/1     Pending             0          0s
nginx-659b6d57bd-w9r46   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-498c2   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-nvhgh   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-mccdl   1/1     Running             0          1s
nginx-659b6d57bd-498c2   1/1     Running             0          1s
nginx-659b6d57bd-w9r46   1/1     Running             0          1s
nginx-659b6d57bd-nvhgh   1/1     Running             0          1s
nginx-659b6d57bd-gq6dc   0/1     Pending             0          0s
nginx-659b6d57bd-gq6dc   0/1     Pending             0          0s
nginx-659b6d57bd-k7vdz   0/1     Pending             0          0s
nginx-659b6d57bd-k7vdz   0/1     Pending             0          0s
nginx-659b6d57bd-gq6dc   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-k7vdz   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-gq6dc   1/1     Running             0          1s
nginx-659b6d57bd-k7vdz   1/1     Running             0          1s
# 观察deploy,看到副本数量也是达到10个
[root@master ~]# kubectl get deploy -w
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           9m19s
nginx   1/4     1            1           10m
nginx   1/4     1            1           10m
nginx   1/4     1            1           10m
nginx   1/4     4            1           10m
nginx   2/4     4            2           10m
nginx   3/4     4            3           10m
nginx   4/4     4            4           10m
nginx   4/8     4            4           10m
nginx   4/8     4            4           10m
nginx   4/8     4            4           10m
nginx   4/8     8            4           10m
nginx   5/8     8            5           10m
nginx   6/8     8            6           10m
nginx   7/8     8            7           10m
nginx   8/8     8            8           10m
nginx   8/10    8            8           11m
nginx   8/10    8            8           11m
nginx   8/10    8            8           11m
nginx   8/10    10           8           11m
nginx   9/10    10           9           11m
nginx   10/10   10           10          11m

压测完后缩容
大概等待五分钟,会看到缩容效果

# deploy的pod副本书已经缩为1个
[root@master ~]# kubectl get deploy -w
nginx   10/10   10           10          11m
nginx   10/1    10           10          16m
nginx   10/1    10           10          16m
nginx   1/1     1            1           16m# 观察Pod,开始逐步缩容 Pod停止Terminating
[root@master ~]# kubectl get pod -w
nginx-659b6d57bd-mccdl   1/1     Terminating         0          5m45s
nginx-659b6d57bd-47f98   1/1     Terminating         0          6m
nginx-659b6d57bd-w9r46   1/1     Terminating         0          5m45s
nginx-659b6d57bd-gq6dc   1/1     Terminating         0          5m30s
nginx-659b6d57bd-nvhgh   1/1     Terminating         0          5m45s
nginx-659b6d57bd-k7vdz   1/1     Terminating         0          5m30s
nginx-659b6d57bd-498c2   1/1     Terminating         0          5m45s
nginx-659b6d57bd-qs4tr   1/1     Terminating         0          6m
nginx-659b6d57bd-tvnmp   1/1     Terminating         0          6m
nginx-659b6d57bd-498c2   0/1     Terminating         0          5m46s
nginx-659b6d57bd-498c2   0/1     Terminating         0          5m46s
nginx-659b6d57bd-498c2   0/1     Terminating         0          5m46s
nginx-659b6d57bd-k7vdz   0/1     Terminating         0          5m31s
nginx-659b6d57bd-k7vdz   0/1     Terminating         0          5m31s
nginx-659b6d57bd-k7vdz   0/1     Terminating         0          5m31s
nginx-659b6d57bd-nvhgh   0/1     Terminating         0          5m46s
nginx-659b6d57bd-nvhgh   0/1     Terminating         0          5m46s
nginx-659b6d57bd-nvhgh   0/1     Terminating         0          5m46s
nginx-659b6d57bd-47f98   0/1     Terminating         0          6m1s
nginx-659b6d57bd-47f98   0/1     Terminating         0          6m2s
nginx-659b6d57bd-47f98   0/1     Terminating         0          6m2s
nginx-659b6d57bd-gq6dc   0/1     Terminating         0          5m32s
nginx-659b6d57bd-gq6dc   0/1     Terminating         0          5m32s
nginx-659b6d57bd-gq6dc   0/1     Terminating         0          5m32s
nginx-659b6d57bd-mccdl   0/1     Terminating         0          5m47s
nginx-659b6d57bd-mccdl   0/1     Terminating         0          5m47s
nginx-659b6d57bd-mccdl   0/1     Terminating         0          5m47s
nginx-659b6d57bd-qs4tr   0/1     Terminating         0          6m2s
nginx-659b6d57bd-w9r46   0/1     Terminating         0          5m47s
nginx-659b6d57bd-qs4tr   0/1     Terminating         0          6m2s
nginx-659b6d57bd-qs4tr   0/1     Terminating         0          6m2s
nginx-659b6d57bd-w9r46   0/1     Terminating         0          5m47s
nginx-659b6d57bd-w9r46   0/1     Terminating         0          5m47s
nginx-659b6d57bd-tvnmp   0/1     Terminating         0          6m3s
nginx-659b6d57bd-tvnmp   0/1     Terminating         0          6m3s
nginx-659b6d57bd-tvnmp   0/1     Terminating         0          6m3s# 只有一个Pod
[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-659b6d57bd-5tbg2   1/1     Running   0          18m

欢迎关注,学习不迷路!

Pod控制器之hpa相关推荐

  1. Proteus模拟STM32F103R6微控制器之串口通信USART的方法

    Proteus模拟STM32F103R6微控制器之串口通信USART的方法,实验环境如下: 模拟软件:Proteus 8.11 SP0 开发环境:Keil MDK 5.33 参考资料:ST公司官方参考 ...

  2. Horizo​​ntal Pod Autoscaler (HPA) 根据资源横向扩展

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 Horizo​​ntal Pod Autoscaler根据观察到的CPU利用率自动调整复制控制器,部署或副本集中的容器数量(或者,通过 自定义指标 支 ...

  3. Kubernetes控制器之Deployment

    Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.只需要在Deployme ...

  4. 3.1 控制器之ReplicaSet/ReplicationController

    文章目录 ReplicaSet使用 1.创建ReplicaSet 2.删除一个pod 3.修改pod标签 4.标签选择器 4.修改ReplicaSet标签选择器 5.水平缩放pod 6.删除Repli ...

  5. Kubernetes控制器之ReplicaSet

    ReplicaSet用来维护一组在任何时候都处于运行状态的Pod保持稳定的副本数.因此,它通常用来保证给定数量的完全相同的Pod的可用性.现在ReplicaSet基本取代了ReplicationCon ...

  6. K8S控制器之Deployment详解及配置。

    目录: 一,引入Deployment 二,Deployment支持的功能 三,Deployment资源清单文件详解 四,滚动更新及回滚实验 五,弹性伸缩实验 一,引入Deployment 对于kube ...

  7. Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

  8. PID控制器改进笔记之六:改进PID控制器之参数设定

      前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提 ...

  9. PID控制器改进笔记之五:改进PID控制器之串级设定

    前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...

最新文章

  1. 软件项目中的需求分析具体方法探讨之一
  2. 面试常用shell脚本_Shell脚本编写及常见面试题
  3. Vuex 使用了 module 后的访问方法 ..
  4. MTK 添加自定义PMS权限 Patch
  5. MySQL 8.0.22执行器源码分析HashJoin —— BuildHashTable函数细节步骤
  6. centos7 mysql8.0.15_Centos7 安装MySQL8.0.15
  7. fscanf返回值被忽略怎么解决_pytest的fixture怎么用?
  8. 迅雷BT下载电影99.9%不动原地循环解决方案
  9. mysql视图,总结
  10. iOS15.4来袭:新增“男妈妈”表情及口罩面容解锁、AirTags反跟踪等新功能
  11. SQL Server 数据库调整表中列的顺序操作
  12. “奔跑吧”大数据!河北大数据产业“跑”向升级路
  13. shell: 脚本获取ssh 端口号
  14. 利用华为ENSP模拟器分析和配置中小型企业网络的综合实验(上)
  15. PS中的颜色深度1位8位16位32位的解释
  16. Tabbed Postman下载地址
  17. Java实现可换行文字转图片
  18. 分层网络有哪些最新发表的毕业论文呢?
  19. 分段存储管理+逻辑地址转化为物理地址+例题
  20. Linux 查看磁盘占用空间

热门文章

  1. 51单片机学习总结系列(一)之驱动流水灯(1)
  2. C语言:根据整型形参m的值,计算如下公式的值: T=1-1/2x2-1/3x3...1/mxm; 例如,若m中的值为5,则应输出:0.536389。
  3. 95- 后程序员一出校门就拿年薪 -30 多万?,android 开发文档百度云
  4. web前端大作业(基于HTML+CSS+JavaScript仿阴阳师游戏官网首页作业制作)
  5. 机器学习PS参数服务器——分布式计算是个什么鬼?
  6. 初学Spring遇到Unsupported class file major version 61 错误
  7. Egret之MC逐帧动画
  8. SQL:基础概念 + 在线数据库
  9. 【原创】GC/垃圾回收简介
  10. C# 使用 wkhtmltopdf 将HTML文本或文件转换为PDF