七、HorizontalPodAutoscaler(HPA)

2024-01-14 16:28

本文主要是介绍七、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                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

这篇关于七、HorizontalPodAutoscaler(HPA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/605783

相关文章

k8s之HPA实践——实现Web服务器的自动伸缩特性

文章目录 在生产环境中,总会有一些意想不到的事情发生,比如公司网站流量突然升高,此时之前创建的Pod已不足以支撑所有的访问,而运维人员也不可能24小时守着业务服务,这时就可以通过配置HPA,实现负载过高的情况下自动扩容Pod副本数以分摊高并发的流量,当流量恢复正常后,HPA会自动缩减Pod的数量。 安装minikube minikube start --image-reposi

优化Kubernetes横向扩缩HPA

Pod水平自动扩缩(Horizontal Pod Autoscaler, 简称HPA)可以基于 CPU/MEM 利用率自动扩缩Deployment、StatefulSet 中的 Pod 数量,同时也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。默认HPA可以满足一些简单场景,对于生产环境并不一定适合,本文主要分析HPA的不足与优化方式。 HPA Resource类型不足 默认HPA提供

k8s学习(九) 使用metrics-server 进行hpa扩容

Horizontal Pod Autoscaling(Pod水平自动伸缩),简称HPA。HAP通过监控分析RC或者Deployment控制的所有Pod的负载变化情况来确定是否需要调整Pod的副本数量,这是HPA最基本的原理。 当你创建了HPA后,HPA会从metrics-server或者用户自定义的监控获取每一个一个Pod利用率或原始值的平均值,然后和HPA中定义的指标进行对比,同时计算出需要伸

k8s-hpa

一、产线当前是基于cpu和memory,当前考虑增加QPS来做HPA 二、指标来源应用容器自身采集、ingress-nginx-controller采集、 外部网关、 外部SLB 三、步骤(测试)1、使用prometheus采集ingress-controller的指标(其他一样)2、helm部署prometheus-adapter-3.0.0.tgz3、配置prometheus-ada

【Kubernetes】k8s 自动伸缩机制—— HPA 部署

一、在K8s中扩缩容分为两种: ●Node层面:对K8s物理节点扩容和缩容,根据业务规模实现物理节点自动扩缩容 ●Pod层面:我们一般会使用Deployment中的Replicas参数,设置多个副本集来保证服务的高可用,但是这是一个固定的值,比如我们设置10个副本,就会启10个pod同时Running来提供服务。如果这个服务平时流量很少的时候,也是10个Pod同时在Running,而流量突然

Kubernetes——HPA自动伸缩机制

目录 前言 一、概念 1.定义 2.核心概念 3.工作原理 4.HPA的配置关键参数 5.关键组件 5.1HPA控制器(HPA Controller) 5.2Metrics Server 5.3自定义指标适配器(Custom Metrics Adapter) 5.4Deployment/ReplicaSet 5.5Pods 5.6API服务器(API Server) 5

Kubernetes 系统监控Metrics Server、HorizontalPodAutoscaler、Prometheus

Metrics Server Linux 系统命令 top 能够实时显示当前系统的 CPU 和内存利用率,它是性能分析和调优的基本工具。 Kubernetes 也提供了类似的命令,就是 kubectl top,不过默认情况下这个命令不会生效,必须要安装一个插件 Metrics Server 才可以。 Metrics Server 是一个专门用来收集 Kubernetes 核心资源指标(met

K8S/ hpa分享

在 Kubernetes 中,HorizontalPodAutoscaler 自动更新工作负载资源 (例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。 hpa的使用本身还是很简单的 示例如下: 官网示例 apiVersion: apps/v1kind: Deploymentmetadata:name: php-apachespec:sele

K8S哲学 - 资源调度 HPA (horizontal pod autoScaler-sync-period)

kubectl exec: kubectl exec -it pod-name -c container-name -- /bin/sh kubectl run    通过一个 deployment来 演示 apiVersion: apps/v1kind: Deploymentmetadata:name: deploylabels: app: deployspec: rep

kubernetes中的附件组件Metrics-server与hpa资源实现对pod的自动扩容和缩容

一、概述         Metrics-Server组件目的:获取集群中pod、节点等负载信息;         hpa资源目的:通过metrics-server获取的pod负载信息,自动伸缩创建pod; 二、安装部署 Metrics-Server组件 安装目的,就是给k8s集群安装top命令 1、下载Metrics-Server资源清单 wget  https://githu