k8s群集之动态扩缩容——HPA
时间:2022-07-24
本文章向大家介绍k8s群集之动态扩缩容——HPA,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、HPA
HPA的全称为Horizontal Pod Autoscaling,它可以根据当前pod资源的使用率(如CPU、磁盘、内存等),进行副本数的动态的扩容与缩容,以便减轻各个pod的压力。当pod负载达到一定的阈值后,会根据扩缩容的策略生成更多新的pod来分担压力,当pod的使用比较空闲时,在稳定空闲一段时间后,还会自动减少pod的副本数量。
若要实现自动扩缩容的功能,还需要部署heapster服务,用来收集及统计资源的利用率,支持kubectl top命令,heapster服务集成在prometheus(普罗米修斯) MertricServer服务中,所以说,为了方便,我这里基于prometheus服务的环境上进行部署HPA(动态扩缩容)的服务。
可以参考博文:k8s群集的三种Web-UI界面部署中的第三个部署Prometheus服务,来运行prometheus服务,如果不想部署prometheus,那么可以参考github上来单独部署heapster服务,
//要想实现pod副本数量的一个扩缩容,就必须保证,可以在master上执行下面的命令
//查看节点的资源使用情况
[root@docker-k8s01 kube-prometheus]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
docker-k8s01 101m 5% 1315Mi 76%
docker-k8s02 59m 2% 1077Mi 62%
docker-k8s03 54m 2% 1131Mi 65%
二、实现Pod扩容与缩容
1、生成HPA控制器
//运行这个hpa-example,请求CPU的资源位200m,暴露一个80端口
[root@docker-k8s01 ~]# kubectl run php-apache --image=mirrorgooglecontainers/hpa-example --requests=cpu=200m --expose --port=80
//当deployment资源对象的CPU使用率高达50%时,就会进行扩容,最多扩容到10个
[root@docker-k8s01 ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
//上述的命令作用是生成了一个HPA的控制器,用于控制自动扩缩容
//查看php-apache对应的svc群集IP
[root@docker-k8s01 ~]# kubectl get svc | grep php-apache
php-apache ClusterIP 10.98.31.183 <none> 80/TCP 82s
//确定当前pod数量
[root@docker-k8s01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
php-apache-867f97c8cb-g8kl9 1/1 Running 0 2m30s
2、模拟消耗php-apache的资源,验证是否会自动扩容与缩容
//创建一个应用,用来不停的访问我们刚刚创建的php-apache的svc资源。也可以使用node节点,多开几个终端来进行访问。
//在多台节点上输入如下命令模拟多用户对php-apaache造成成吨伤害
[root@docker-k8s01 ~]# kubectl run -i --tty load-generator --image=busybox /bin/sh
/ # while true; do wget -q -O- 10.98.31.183; done
//每一次OK都是对php-apache的肯定,访问成功
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!O
//接下来我们查看资源使用情况
//查看hpa的资源使用,可以看到才第二次就直接飙到了300%多
[root@docker-k8s01 ~]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 6m17s
php-apache Deployment/php-apache 331%/50% 1 10 1 10m
php-apache Deployment/php-apache 331%/50% 1 10 4 11m
php-apache Deployment/php-apache 894%/50% 1 10 7 11m
php-apache Deployment/php-apache 894%/50% 1 10 10 11m
//可以看到我们的10个pod都已经就绪了
[root@docker-k8s01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
load-generator-7d549cd44-8x96c 1/1 Running 0 5m48s
php-apache-867f97c8cb-44d2p 1/1 Running 0 3m4s
php-apache-867f97c8cb-6qf6b 1/1 Running 0 3m34s
php-apache-867f97c8cb-bhjtd 1/1 Running 0 3m4s
php-apache-867f97c8cb-fwhvs 1/1 Running 0 3m34s
php-apache-867f97c8cb-g8kl9 1/1 Running 0 16m
php-apache-867f97c8cb-gjzl7 1/1 Running 0 3m4s
php-apache-867f97c8cb-ktgnv 1/1 Running 0 3m34s
php-apache-867f97c8cb-mhm75 1/1 Running 0 3m19s
php-apache-867f97c8cb-pnwkf 1/1 Running 0 3m19s
php-apache-867f97c8cb-zqd62 1/1 Running 0 3m19s
[root@docker-k8s01 ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
load-generator 1/1 1 1 6m42s
php-apache 10/10 10 10 17m
//当停止死循环请求后,也并不会立即减少pod数量,会等一段时间后减少pod数量,防止流量再次激增。
- NYOJ------汉诺塔(一)
- HDUOJ----Coin Change
- Golang语言社区--列出目录和遍历目录的方法
- HDUOJ-------单词数
- insert导致的性能问题大排查(r11笔记第26天)
- NYOJ-----最少乘法次数
- nyOJ-----韩信点兵
- HDUOJ-----A == B ?
- 用Oracle的眼光来学习MySQL 5.7的sys(上)(r11笔记第24天)
- Golang下通过syscall调用win32的api
- NYOJ----蛇形填数
- Golang语言 syscall 例子
- 用Oracle的眼光来学习MySQL 5.7的sys(下)(r11笔记第25天)
- HDUOJ-----Climbing Worm
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spark-2.4.0-hadoop2.7-安装部署 4.1. Spark安装4.2. 环境变量修改4.3. 配置修改4.4. 分发到其他机器4.5. 启动spark
- spark-2.4.0-hadoop2.7-高可用(HA)安装部署 5.1. Spark安装5.2. 环境变量修改5.3. 配置修改5.4. 分发到其他机器5.5.
- spark-2.4.0-hadoop2.7-简单操作 2.1. 相关截图
- Navicat Premium 12.0.24安装与激活(亲测已成功激活) 2.1. 下载激活文件2.2. 激活步骤准备工作2.3. 激活Navicat
- VMware实现iptables NAT及端口映射
- Saltstack_使用指南01_部署
- Saltstack_使用指南02_远程执行-验证 2.1. Master与哪些minion正常通信2.2. 查看master与指定minion通信是否正常
- Saltstack_使用指南03_配置管理
- Saltstack_使用指南04_数据系统-Grains 4.1. grains条目项信息4.2. grains全部信息4.3. 查询grains指定信息5.1. m
- 揭开spring初始化方法的神秘面纱
- Saltstack_使用指南05_数据系统-Pillar 4.1. 修改配置文件并重启服务4.2. 显示pillar信息6.1. pillar的sls文件编写6.2.
- Python Docker 查看私有仓库镜像【转】
- CentOS7 Docker私有仓库搭建及删除镜像 【转】
- spring的自定义标签都不会?你可能只学到了spring的皮毛
- 面试官:spring的BeanFatory和FactoryBean区别