七、HorizontalPodAutoscaler(HPA)

目录

一、HPA概述:

二、HPA工作机制:

三、HPA流程:

 四、HPA API对象:

五、示例:

1、基于CPU的HPA

2、常见问题:

3、基于内存的HPA

一、HPA概述:

  1. Horizontal Pod Autoscaler,中文就是水平自动伸缩
  2. 可以基于CPU利用率自动扩缩,Replicationcontroller、Deployment、ReplicaSet、和StatefulSet中的pod 的数量
  3. 除了CPU利用率、内存占用外,也可以积极与其他应用程序提供的自定义度量指标来执行自动扩缩
  4. Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
  5. Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。
  6. 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

二、HPA工作机制:

        Pod水平自动扩容器的实现是一个控制回路,由控制器管理的--horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒)通过Status.PodSelector来查询pods的状态,获取pod的CPU使用率,然后,通过现有的pod的CPU使用率的平均值跟目标使用率进行比较,并且在扩容时,还要遵循预先这顶的副本数显示:MinReplicas

三、HPA流程:

  1. 创建HPA资源,设定目标CPU使用率限额,以及最大、最小实例数
  2. 收集一组中(PodSelector)每个pod最近一分钟内的cpu使用率,并计算平均值
  3. 读取hpa中设定的cpu使用限额
  4. 计算:平均值之和/限额,求出目标调整的实例个数
  5. 目标调整的个数不能超过设定的最大最小实例数,如果没有超过就扩容,超过,就扩容至最大实例数
  6. 回环到2,不断循环

 四、HPA API对象:

#有三个版本
[root@k8s-master-1 cfg]# kubectl api-versions |grep autoscal
autoscaling/v1 #只通过CPU为参考,来改变pod副本数
autoscaling/v2beta1 #支持通过CPU、内存、连接数以及用户自定义
的资源指标数据为参考
autoscaling/v2beta2 #同上kubectl explain hpa ##默认查询到的是autoscaling/v1版本
kubectl explain hpa --api-version=autoscaling/v2beta1 
##如果使用其他版本,可以使用--api-version指明版本

五、示例:

1、基于CPU的HPA

1、创建HorizontalPodAutoscaler.yaml
[root@k8s-master-1 test]# vim HorizontalPodAutoscaler.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: hpa-demo
spec:maxReplicas: 10minReplicas: 1scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: hpa-demotargetCPUUtilizationPercentage: 10
#或者使用命令:
[root@k8s-master-1 test]# kubectl autoscale deployment hpa-demo --cpu-percent=10 --min=1 --max=102、创建Deployment.如果要想让HPA生效,对应的Pod资源必须添加requests资源声明
[root@k8s-master-1 test]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: hpa-demo
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.3ports:- containerPort: 80resources:requests:memory: 50Micpu: 50m

2、常见问题:

1、HPA无法计算副本计数:无法获取资源cpu的指标:没有从资源指标API返回指标

解决:由于我前期添加了聚合 API,没有重启kube-controller-manager.service、kube-scheduler.service,所以一直报错,在这就是在HorizontalPodAutoscaler.yaml文件中spec.scaleTargetRef.apiVersion: apps/v1,忘记加s了。这里要和Deployment的apiVersion 一致。

[root@k8s-master-1 test]# kubectl get hpa
NAME       REFERENCE             TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-demo   Deployment/hpa-demo   0%/10%    1         10        1          11m[root@k8s-master-1 test]# kubectl describe hpa
Name:                                                  hpa-demo
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Fri, 05 May 2023 13:55:49 +0800
Reference:                                             Deployment/hpa-demo
Metrics:                                               ( current / target )resource cpu on pods  (as a percentage of request):  0% (0) / 10%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:Type            Status  Reason               Message----            ------  ------               -------AbleToScale     True    ScaleDownStabilized  recent recommendations were higher than current one, applying the highest recent recommendationScalingActive   True    ValidMetricFound     the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)ScalingLimited  False   DesiredWithinRange   the desired count is within the acceptable range

压力测试

暴露端口给service

#暴露端口给service
[root@k8s-master-1 test]# kubectl expose deployment hpa-demo --port=80 --target-port=80^C
[root@k8s-master-1 test]# 
[root@k8s-master-1 test]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
hpa-demo     ClusterIP   10.0.0.56    <none>        80/TCP    21m
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   15d[root@k8s-master-1 test]# [root@k8s-master-1 test]# kubectl exec -it busybox -- sh
/ # 
/ # while true; do wget -q -O- 10.0.0.56; done#在查看hpa  数量在增加
[root@k8s-master-1 ~]# [root@k8s-master-1 ~]# kubectl get hpa
NAME       REFERENCE             TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
hpa-demo   Deployment/hpa-demo   316%/10%   1         10        1          30m[root@k8s-master-1 ~]# kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
hpa-demo   8/8     8            8           13m
web        1/1     1            1           11d
[root@k8s-master-1 ~]# [root@k8s-master-1 ~]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
busybox                    1/1     Running   0          94s
hpa-demo-f45447f69-59zsv   1/1     Running   0          13m
hpa-demo-f45447f69-5nd8k   1/1     Running   0          22s
hpa-demo-f45447f69-9whvx   1/1     Running   0          7s
hpa-demo-f45447f69-pv7gb   1/1     Running   0          22s
hpa-demo-f45447f69-qwcrp   1/1     Running   0          7s
hpa-demo-f45447f69-tk4x9   1/1     Running   0          7s
hpa-demo-f45447f69-wvrt8   1/1     Running   0          22s
hpa-demo-f45447f69-xnrcd   1/1     Running   0          7s
web-96d5df5c8-vmxgr        1/1     Running   0          5h51m#接下来我们ctrl+c取消压力测试,过1分钟,甚至更久就看到cpu和pod数量都回去了
[root@k8s-master-1 test]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
hpa-demo-f45447f69-59zsv   1/1     Running   0          19m
web-96d5df5c8-vmxgr        1/1     Running   0          5h57m
[root@k8s-master-1 test]# [root@k8s-master-1 test]# kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
hpa-demo   1/1     1            1           19m
web        1/1     1            1           11d
[root@k8s-master-1 test]# [root@k8s-master-1 test]# kubectl get hpa
NAME       REFERENCE             TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-demo   Deployment/hpa-demo   0%/10%    1         10        1          36m

3、基于内存的HPA

        创建deployment

apiVersion: apps/v1
kind: Deployment
metadata:name: hpa-demo
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.3ports:- containerPort: 80resources:requests:memory: 25Micpu: 0.01limits:memory: 60Micpu: 0.05
[root@k8s-master-1 test]# kubectl apply -f deployment.yaml 
deployment.apps/hpa-demo created[root@k8s-master-1 test]# vim HorizontalPodAutoscaler.yaml
apiVersion: autoscaling/v2beta1    # v2beta1版本
kind: HorizontalPodAutoscaler
metadata:name: hpa-demo
spec:maxReplicas: 10minReplicas: 1scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: hpa-demometrics:- type: Resourceresource:name: memorytargetAverageUtilization: 50 # 50%内存利用[root@k8s-master-1 test]# kubectl apply -f HorizontalPodAutoscaler.yaml 
horizontalpodautoscaler.autoscaling/hpa-demo created[root@k8s-master-1 test]# kubectl get hpa
NAME       REFERENCE             TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-demo   Deployment/hpa-demo   5%/50%    1         10        1          47s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

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

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

相关文章

【洛谷千题详解】P7072 [CSP-J2020] 直播获奖

输入样例&#xff1a; 10 60 200 300 400 500 600 600 0 300 200 100 输出样例&#xff1a; 200 300 400 400 400 500 400 400 300 300 #include<bits/stdc.h> using namespace std; int main() {int n,w,s,a[605]{0};cin>>n>>w;for(int i1;i<n;i){sca…

Java Math类库 | 算法实用总结 | 蓝桥杯java组备赛

Java Math类是Java标准库中的一个数学计算类&#xff0c;可以为我们在算法应用中提供很大的帮助。 且由于Math类中的方法都是静态的&#xff0c;因此可以直接通过类名调用&#xff0c;而不需要创建Math类的实例。使用起来十分便捷&#xff0c;下面列出Math中各函数、常量的使用…

【MySQL】数据处理之增删改

文章目录 一、增加&#xff08;插入&#xff09;INSERT INTO...VALUES(...,...)VALUES的方式添加情况一&#xff1a;为表的所有字段按默认顺序插入数据情况二&#xff1a;为表的指定字段插入数据情况三&#xff1a;同时插入多条记录 将查询结果插入到表中 二、修改&#xff08;…

AcWing 843. n-皇后问题

#include <iostream> #include <cstring> #include <algorithm>using namespace std; const int N 10; int n; int col[N], dg[N N], rdg[N N]; // 列占用// 正对角线占用// 副对角线占用 char table[N][N]; // 棋盘void dfs(int index) {if(i…

彻底理解字符编码

一、前言 为什么要进行编码&#xff0c;这些编码的关系如何&#xff0c;如ASCII&#xff0c;IOS-8859-1&#xff0c;GB2312&#xff0c;GBK&#xff0c;Unicode之间的关系&#xff0c;笔者想要彻底理解字符编码背后的故事&#xff0c;遂进行了探索&#xff0c;具体笔记如下。如…

“绿智中国”亚洲绿色数字生态发展论坛暨中泰基业集团2024产品发布会在渝举行

绿智中国&#xff0c;逐梦未来。2024年1月11日-12日&#xff0c;“绿智中国”亚洲绿色数字生态发展论坛暨中泰基业集团2024产品发布会在重庆盛大举行。以“以数字化引领绿色化&#xff0c;以绿色化带动数字化”为主题&#xff0c;共同见证“绿智中国”崛起的力量。 为积极响应《…

目标检测-One Stage-YOLOv7

文章目录 前言一、YOLOv7的不同版本二、YOLOv7的网络结构二、YOLOv7的创新点三、创新点的详细解读ELAN和E-ELANBoF训练技巧计划型重参化卷积辅助训练模块标签分配Lead head guided label assignerCoarse-to-fine lead head guided label assigner 基于级联模型的复合缩放方法 总…

【MySQL】子查询 综合练习

题目&#xff1a; #1.查询和Zlotkey相同部门的员工姓名和工资#2.查询工资比公司平均工资高的员工的员工号&#xff0c;姓名和工资。#3.选择工资大于所有JOB_ID SA_MAN的员工的工资的员工的last_name, job_id, salary#4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和…

canvas设置圆锥形渐变

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

隧道应用4-内网穿透EW的简单使用

与netsh端口映射内网类似&#xff0c;也是通过跳板机实现 EW官网地址&#xff1a;http://rootkiter.com/EarthWorm EW 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 注&#xff1a; 考虑…

【MATLAB源码-第111期】基于matlab的SCMA系统误码率仿真,采用polar码编码,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 SCMA&#xff08;Sparse Code Multiple Access&#xff09;系统是一种先进的多用户多输入多输出&#xff08;MU-MIMO&#xff09;通信系统&#xff0c;它采用了一种独特的多址访问技术&#xff0c;旨在提高无线通信网络的效率…

Ubuntu 22.04 Cron使用

需要定时处理的场景还是比较多的&#xff0c;比如信息推送、日志清理等。 这篇文章我们来说说如何使用cron来实现定时处理&#xff0c;以及监控任务的执行。 使用 Ubuntu中使用cron&#xff0c;要用到的命令是crontab。不加sudo时&#xff0c;处理的是个人的定时任务。当加上…

STEGNN

STEGNN 摘要 随着智能交通系统(ITS)逐渐融入我们的日常生活,人们普遍认为路网预测是智能交通系统的杀手锏,具有很高的社会和经济效益。然而,目前的解决方案忽视了时空交通数据的异质性,无法捕捉隐藏的时空相关性。本文介绍了 STEGNN:一种用于路网预测的新型时空嵌入图神…

Java控制结构解析

在 Java 编程语言中&#xff0c;控制结构用于控制程序的执行流程。以下是几种常见的控制结构及其解析&#xff1a; 条件语句&#xff08;If-else 语句&#xff09;&#xff1a;根据条件的真假来执行不同的操作。Switch 语句&#xff1a;根据一个表达式的值&#xff0c;选择不同…

让Windows上vscode的C语言scanf函数可以读取中文字符

windows的默认字符集保存为GBK不要修改 区域设置–时钟和区域–区域–管理–更系统区域设置–&#xff08;不要勾选&#xff09;使用UTF-8。 查看验证当前字符集&#xff1a; cmdchcp 活动代码页: 936936就是简体中文GBK vscode的setting.json文件添加如下代码 点击左下角…

P4学习(一) 环境搭建

系列文章目录 第一章 P4学习入门之虚拟机环境搭建 文章目录 系列文章目录前言一、P4是什么&#xff1f;二、搭建步骤1.下载虚拟机镜像2.虚拟机管理软件载入镜像2.1 找到你镜像的所在位置2.2 打开VMware Workstation2.3 载入镜像 3.检验环境是否配置成功 P4 的真机环境搭建 前言…

js map方法的使用

在 JavaScript 中&#xff0c;map() 方法是数组对象的一个内置方法&#xff0c;用于对数组中的每个元素执行指定的操作&#xff0c;并返回一个新的数组&#xff0c;该数组包含了操作后的结果。 map() 方法接受一个回调函数作为参数&#xff0c;该回调函数会被应用于数组中的每…

【100条git命令】

100条git命令 git init: 创建一个新的Git仓库。git clone: 从现有仓库克隆一个新的仓库。git add: 将更改添加到暂存区域。git commit: 提交暂存区中的更改到本地仓库。git push: 将本地仓库中的更改推送到远程仓库。git pull: 从远程仓库拉取更改并合并到本地仓库。git fetch:…

Android 9.0ota升级关于Systemui下拉状态栏quick_settings_tiles_default值减少时更新的功能实现

1.前言 在9.0的系统rom定制化开发中,在进行systemui的下拉状态栏定制以后,当需要ota升级的时候,发现在systemui下拉状态栏的快捷功能键部分去掉的 一些快捷功能并没有减少,这是因为systemui有缓存造成的只有清理缓存或者恢复出厂设置后才正常,所以今天就来实现不需要清理缓…

10.9.2 std::function 代替函数指针

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…