Pod控制器之hpa
简述
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
简述 HPA全称HorizontalPodAutoscaler Pod水平自动扩缩容,Kubernetes控制器HPA是一种用于自动调整Pod数量的控制器。它可以根据资源使用情况自动增加或减少Pod的数量,以确保应用程序的高可用性和性能。HPA可以根据CPU使用率或自定义指标来进行调整&…...
发现一个白嫖GPT4.0的方法!真的是完胜3.5!
大家好,我是五竹。 先说个基本的科普,最近被问的人都嘛了。 1、ChatGPT账号只有两种:普通账号和plus账号。 2、普通账号升级到plus账号,需要绑定国外的支付方式,每个月大概130左右!plus账号更稳!更快&am…...
数据结构之第四章、ArrayList和顺序表
一、线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是…...
webase全家桶搭建教程过程记录+bug解决
前置条件 Ubuntu20 基础环境搭建 检查Java java -version 检查mysql(Ubuntu部署MySQL) mysql --version 在装MySQL的时候发现了一个问题 就是不管怎么sudo mysql_secure_installation,,第二步设置密码就是不对,解…...
openEuler Linux 部署 HadoopHA
openEuler Linux 部署 HadoopHA 升级操作系统和软件 yum -y update升级后建议重启 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make rsync vim man zip unzip net-tools zlib zlib-devel openssl openssl-devel pcre-devel tcpdump lrzsz tar wget修改…...
React-Hooks----useEffect()
文章目录前言用法前言 useEffect() 是 React 中最常用的 Hook 之一,它可以让函数组件拥有类似于类组件中 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期函数的功能。 用法 useEffect() 接受两个参数 第一个参数是一个函数,…...
JavaWeb基础-汇总
SSM框架课程汇总01-MySQL基础02-MySQL高级03-JDBC04-JDBC练习05-Maven&Mybatis基础06-Mybatis练习07-JavaScript08-Web概述09-HTTP10-Tomcat11-Servlet12-Request&Response13-用户注册登录案例14-JSP15-JSP案例16-会话技术17-用户登录注册案例18-Filter19-Listener&…...
Niuke:JZ36.二叉树与双向链表
文章目录Niuke:JZ36.二叉树与双向链表题目描述示例思路分析代码实现Niuke:JZ36.二叉树与双向链表 题目描述 描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点,只…...
javaScript---读懂promise、async/await
一、Promise Promise 是一个 Es 6 提供的类,目的是更加优雅地书写复杂的异步任务。可以解决嵌套式的回调地域问题,Promise 将嵌套格式的代码变成了顺序格式的代码。 //回调地域 setTimeout(function () {console.log("红灯");setTimeout(function () {console.lo…...
【Linux】TCP编程流程
TCP编程流程 socket()创建套接字,套接字TCP协议选择流式服务SOCK_STREAM。 bind()指定套接字使用的IP地址和端口。IP地址是自己主机地址,端口为一个16位的整形值。 listen()方法创建监听队列。监听队列分为存放未完成三次握手的连接和完成三次握手的连…...
SuperMap iDesktop 下载安装,生成本地瓦片,以及发布本地瓦片服务
SuperMap iDesktop 是插件式桌面GIS软件,提供基础版、标准版、专业版和高级版四个版本,具备二三维一体化的数据处理、制图、分析、海图、二三维标绘等功能,支持对在线地图服务的无缝访问及云端资源的协同共享,可用于空间数据的生产…...
【ONE·Data || 常见排序说明】
总言 数据结构基础:排序相关内容。 文章目录总言1、基本介绍2、插入排序2.1、直接插入排序:InsertSort2.1.1、单趟2.1.2、总趟2.2、希尔排序(缩小增量排序):ShellSort2.2.1、预排序1.0:单组分别排序2.…...
本节作业之跟随鼠标的天使、模拟京东按键输入内容、模拟京东快递单号查询
本节作业之跟随鼠标的天使、模拟京东按键输入内容、模拟京东快递单号查询1 跟随鼠标的天使2 模拟京东按键输入内容3 模拟京东快递单号查询1 跟随鼠标的天使 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><met…...
ChatGPT 被大面积封号,到底发生什么了?
意大利数据保护机表示 OpenAI 公司不但非法收集大量意大利用户个人数据,没有设立检查 ChatGPT 用户年龄的机制。 ChatGPT 似乎正在遭遇一场滑铁卢。 3月31日, 大量用户在社交平台吐槽,自己花钱开通的 ChatGPT 账户已经无法登录,更…...
教你精通JavaSE语法之第十一章、认识异常
一、异常的概念与体系结构 1.1异常的概念 在Java中,将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的: 1.算术异常 System.out.println(10 / 0); // 执行结果 Exception in thread "main" java.lang.ArithmeticExcep…...
display、visibility、opacity隐藏元素的区别
display、visibility、opacity隐藏元素的区别 display: none 事件监听:无法进行DOM事件监听。 元素从网页中消失,并且不占据位置再次从网页中出现会引起重排 进而引起重绘继承:不会被子元素继承,因为子元素也不被渲染。 visib…...
Linux Shell 实现一键部署tomcat10+java13
tomcat 前言 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当…...
软硬皆施,WMS仓库管理系统+PDA,实现效率狂飙
人工经验Excel表格,是传统第三方仓储企业常用的管理模式。在这种管理模式下,对仓库员工的Excel操作能力、业务经验和工作素养要求极高。一旦员工的经验能力不足,就会导致仓库业务运行不顺畅,效率低下,而员工也会因长时…...
DJ3-2 传输层(第二节课)
目录 一、如何实现可靠数据传输 1. 需要解决地问题 2. 使用的描述方法 二、rdt1.0:完全可靠信道上的可靠数据传输 1. 前提条件 2. 有限状态机 FSM 三、rdt2.0:仅具有 bit 错误的信道上的可靠数据传输 1. 前提条件 2. 有限状态机 FSM 3. 停等协…...
FrIf-FrIf功能模块概述和与底层驱动的交互
总目录链接==>> AutoSAR入门和实战系列总目录 总目录链接==>> AutoSAR BSW高阶配置系列总目录 文章目录 1 FlexRay 接口模块概述2 与FlexRay底层驱动的交互1 FlexRay 接口模块概述 FlexRay 接口模块通过 FlexRay 驱动程序模块间接与 FlexRay 控制器通信。 它…...
【巴法云】零代码安卓App开发:用App Inventor + MQTT + ESP8266打造智能硬件遥控器
1. 零代码开发智能硬件遥控器的魅力 想象一下,你躺在沙发上发现忘关客厅的灯,这时候掏出手机点一下就能远程关灯;或者夏天回家前提前打开空调,进门就能享受清凉。这些智能家居场景现在用App Inventor 巴法云 ESP8266组合就能轻松…...
K8s CronJob配置避坑指南:从并发策略到历史记录,这些细节你注意了吗?
K8s CronJob生产环境实战:避开那些让你夜不能寐的配置陷阱 凌晨三点,告警铃声刺破夜空——你的数据库备份任务已经连续三次未能执行,而监控面板上堆积的Job数量正在以肉眼可见的速度增长。这不是第一次了,每次CronJob出问题都像一…...
一、Cisco(静态端口映射实战:从零搭建外网可访问的多服务内网环境)
1. 环境准备与拓扑设计 第一次接触端口映射时,我也被那些专业术语搞得晕头转向。直到自己动手在Cisco Packet Tracer里搭了一套环境,才发现原来原理这么简单。这次我们就用最基础的设备,还原企业里常见的多服务发布场景。 实验设备清单就像搭…...
OpenClaw备份策略详解:百川2-13B模型自动化容灾方案
OpenClaw备份策略详解:百川2-13B模型自动化容灾方案 1. 为什么需要自动化备份策略 去年冬天我经历过一次惨痛的教训——硬盘突然损坏导致三个月积累的模型微调数据全部丢失。那次事件后,我开始系统性地研究如何为本地部署的百川2-13B模型构建自动化备份…...
【水果分类】基于GUI计算机视觉和前馈神经网络自动水果分类系统附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
Qwen3-VL-2B离线运行实测:无需联网,本地搭建视觉对话机器人
Qwen3-VL-2B离线运行实测:无需联网,本地搭建视觉对话机器人 1. 引言 在当今AI技术快速发展的时代,视觉语言模型(Vision-Language Model)正逐渐从云端走向本地。Qwen3-VL-2B-Instruct作为一款轻量级多模态模型,能够在普通电脑上实…...
技术赋能B端拓客:号码核验行业的破局与价值重塑,氪迹科技法人股东号码筛选系统,阶梯式价格
2026年,B端拓客正式迈入智能内卷时代,“精准获客、降本增效”成为企业突破业绩瓶颈的核心关键词,而号码核验作为拓客流程的前置过滤环节,直接决定了线索质量与人力效能,成为影响拓客投入回报比的关键变量。当前&#x…...
实时数据处理实战:使用 Apache Flink 消费 Kafka 数据并进行窗口聚合
在大数据时代,实时处理流式数据已经成为企业级应用的标配。无论是用户行为分析、实时监控告警,还是金融风控系统,都离不开低延迟、高吞吐的流处理引擎。本文将带你从零开始,使用 Apache Flink 和 Kafka 构建一个完整的实时数据处理…...
Marker:突破PDF转换瓶颈的革新性文档处理工具
Marker:突破PDF转换瓶颈的革新性文档处理工具 【免费下载链接】marker 一个高效、准确的工具,能够将 PDF 和图像快速转换为 Markdown、JSON 和 HTML 格式,支持多语言和复杂布局处理,可选集成 LLM 提升精度,适用于学术文…...
机器人状态估计——从IMU运动方程到ESKF误差状态建模(上)
1. 从IMU数据到机器人状态估计的挑战 当你第一次拿到一个IMU传感器时,可能会觉得它就像个魔法黑盒——只要把它装在机器人上,就能知道机器人的姿态、速度和位置。但实际操作起来,你会发现IMU数据就像个调皮的孩子,稍不注意就会给你…...
