理解Kubernetes中HPA是什么

Kubernetes-HPA

什么是Horizontal Pod Autoscaler

HPA简介 HPA全称Horizontal Pod Autoscaling(Pod横向自动扩容,简称HPA)在kubernetes 1.1版本首次发布这一重量级新特性

通过手工执行kubectl scale命令,我们可以实现Pod扩容或缩容。如果仅仅到此显然不符合Kubernetes的定位目标--自动化、智能化,HPA会从Heapster或者用户自定义的RESTclient端获取每个Pod利用率或原始值的平均值,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值并进行相应的操作,目前HPA可以从两个地方获取数据
   --- Heapster: 仅支持CPU使用率
   --- 自定义监控
   
HPA与之前的RC、Deployment 一样,也属于一种Kubernetes资源对象。通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

HPA有以下两种方式作为Pod负载的度量指标
1.CPUUtilizationPercentage 
2.应用程序自定义的尺度指标,比如服务在每秒内的相应的请求书(TPS或OPS)

CPUUtilizationPercentage是一个算术平均值,即目标Pod所有副本自身的CPU利用率的平均值。一个Pod自身的CPU利用率是该Pod当前CPU的使用量除以它的Pod Request的值

举例:比如我们定义一个Pod的Pod Request为0.4,而当前Pod的CPU使用量为0.2,则它的CPU使用率为50%,这样我们就可以算出来一个RC控制的所有Pod副本的CPU利用率的算术平均值了

如某一刻CPUUtilizationPercentage的值超过80%,则意味着当前的Pod副本数很可能不足以支撑接下来的更多请求,需要进行动态扩容,而当请求高峰时段过去后,Pod CPU利用率又会降下来,此时对应Pod副本书应该自动减少到一个合理的水平。

CPUUtilizationPercentage 计算过程中使用到的Pod的CPU使用量通常是1min内的平均值,通过查询Heapster扩展组件来得到这个值,所以需要安装Heapster,这样一来便增加了系统的复杂度和实施HPA特性的复杂化。

未来Kubernetes自身实现一个基础性能数据采集模块,从而更好地支持HPA和其他需要用到的基础性能数据的功能模块。此外如果Pod没有定义Pod Request的值,则无法使用CPUUtilizationPercentage来实现Pod横向自动扩容的能力

定义HPA
创建HPA的方式有2种,一种是基于yaml文件进行创建,另外一个是使用命令进行创建
用yaml定义HPA例子:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  minReplicas: 1                   #最小pod数量
  maxReplicas: 10                    #最大pod数量
  scaleTargetRef:           #针对扩容deployment
    apiVersion: v1
    kind: Deployment        #需要扩容的类型
    name: os        #需要扩容的deployment名称
  targetCPUUtilizationPercentage: 90  #CPU使用率,平均数
  
  
[root@kubernetes-m media]# kubectl apply -f nginx.yaml 
deployment.apps/nginx created
horizontalpodautoscaler.autoscaling/nginx-hpa created
[root@kubernetes-m media]# kubectl get hpa
NAME        REFERENCE          TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx   <unknown>/1%   1         10        0          4s
  
参数解释:当CPUUtilizationPercentage的值超过90%时会触发自动动态扩容行为,扩容或缩容时必须满足的一个约束条件是Pod的副本数要介于1与10之间
HPA一般都是配合metric-server使用
  
使用命令定义HPA例子
前提是得有个deployment
[root@kubernetes-m media]# kubectl create -f pod-svc.yaml 
deployment.apps/nginx created
service/svc created
[root@kubernetes-m media]# kubectl get deployments.apps 
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           3s
[root@kubernetes-m media]# kubectl autoscale deployment nginx --cpu-percent=10 --max=5 --min=1
horizontalpodautoscaler.autoscaling/nginx autoscaled
[root@kubernetes-m media]# kubectl get hpa
NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   <unknown>/10%   1         5         3          80s

--cpu-percent  cpu平均数
--min 最小Pod数量
--max 最大Pod数量

创建完成后可以通过下面命令查看hpa创建的状态
[root@kubernetes-m media]# kubectl describe hpa nginx 
Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Thu, 04 Nov 2021 05:03:59 -0400
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  <unknown> / 10%
Min replicas:                                          1
Max replicas:                                          5
Deployment pods:                                       3 current / 0 desired
Conditions:
  Type           Status  Reason                   Message
  ----           ------  ------                   -------
  AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
  ScalingActive  False   FailedGetResourceMetric  the HPA was unable to compute the replica count: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
Events:
  Type     Reason                        Age                 From                       Message
  ----     ------                        ----                ----                       -------
  Warning  FailedGetResourceMetric       13s (x7 over 104s)  horizontal-pod-autoscaler  unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
  Warning  FailedComputeMetricsReplicas  13s (x7 over 104s)  horizontal-pod-autoscaler  invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)


测试的时候可以新建一个busybox镜像,执行一个死循环即可,同时HPA是每30秒轮训一次
while true;do wget -q -O- http://www.baidu.com;done
目前hpa仅支持cpu使用,不是很方便,可以通过prometheus operator进行自定义的扩容
posted @ 2021-12-17 10:38  Layzer  阅读(186)  评论(0编辑  收藏  举报