Kubernetes Horizontal Pod Autoscaling

HPA介绍

Horizo​​ntal Pod Autoscaler基于观察到的CPU利用率(或借助自定义指标 支持,基于其他一些应用程序提供的指标)自动缩放复制控制器,部署或副本集中的Pod数量 。请注意,自动伸缩不适用于无法缩放的对象,例如DaemonSets。

Horizo​​ntal Pod Autoscaler被实现为Kubernetes API资源和控制器。该资源确定控制器的行为。控制器会定期调整复制控制器或部署中副本的数量,以使观察到的平均CPU利用率与用户指定的目标相匹配。

简单的理解:自动水平伸缩,是指运行在k8s上的应用负载(POD),可以根据资源使用率进行自动扩容、缩容;我们知道应用的资源使用率通常都有高峰和低谷,所以k8s的HPA特性应运而生;它也是最能体现区别于传统运维的优势之一,不仅能够弹性伸缩,而且完全自动化!

工作原理图

Kubernetes Horizontal Pod Autoscaling

 

 下面我们进行实验:

# 创建deploy和service

$ kubectl run php-apache --image=pilchard/hpa-example --requests=cpu=200m --expose --port=80

Kubernetes Horizontal Pod Autoscaling

# 创建autoscaler
$ kubectl autoscale deploy php-apache --cpu-percent=50 --min=1 --max=10

Kubernetes Horizontal Pod Autoscaling

# 等待3~5分钟查看hpa状态
$ kubectl get hpa php-apache

Kubernetes Horizontal Pod Autoscaling

# 增加负载 
$ kubectl run --rm -it load-generator --image=busybox /bin/sh 
$ while true; do wget -q -O- http://php-apache; done; 

Kubernetes Horizontal Pod Autoscaling

# 等待约5分钟查看hpa显示负载增加,且副本数目增加
# 注意k8s为了避免频繁增删pod,对副本的增加速度有限制
# 实验过程可以看到副本数目从1到4到8到10,大概都需要4~5分钟的缓冲期
$ kubectl get hpa php-apache -w

Kubernetes Horizontal Pod Autoscaling

# 清除负载,CTRL+C 结束上述循环程序,稍后副本数目变回1

 Kubernetes Horizontal Pod Autoscaling

 通过注解annotations添加自动伸缩例子:

Deployment / StatefulSet:

 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
   name: example
   labels:
   annotations:
     hpa.autoscaling.banzaicloud.io/minReplicas: "1"
     hpa.autoscaling.banzaicloud.io/maxReplicas: "3"
     cpu.hpa.autoscaling.banzaicloud.io/targetAverageUtilization: "70"

chart模板:https://github.com/helm/charts/blob/master/stable/nginx-ingress/templates/controller-hpa.yaml

参考:

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

 

上一篇:各种实体类的命名方式


下一篇:EF Core 快速上手——EF Core 入门