Horizontal Pod Autoscaler 初探

什么是HPA?

The Horizontal Pod Autoscaler automatically scales the number of pods in a replication controller, deployment or replica set based on observed CPU utilization (or, with custom metrics support, on some other application-provided metrics). Note that Horizontal Pod Autoscaling does not apply to objects that can’t be scaled, for example, DaemonSets.

Horizontal Pod Autoscaler根据观察到的CPU利用率自动调整复制控制器,部署或副本集中的容器数量(或者,通过自定义指标支持,根据其他一些应用程序提供的指标)。 请注意,Horizontal Pod Autoscaling不适用于无法缩放的对象,例如DaemonSet。

The Horizontal Pod Autoscaler is implemented as a Kubernetes API resource and a controller. The resource determines the behavior of the controller. The controller periodically adjusts the number of replicas in a replication controller or deployment to match the observed average CPU utilization to the target specified by user.

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

Horizontal Pod Autoscaling仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩所容,在v1alpha版本中,支持根据内存和用户自定义的metric扩缩容。

提问:

1. Deployment, Replication controller, ReplicaSet的区别?

2. 为什么DaemonSet不支持?


Horizontal Pod Autoscaler 初探_第1张图片


为什么HPA

应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高集群的整体资源利用率,让service中的Pod个数自动调整呢?这就有赖于Horizontal Pod Autoscaling了,顾名思义,使Pod水平自动缩放。这个Object(跟Pod、Deployment一样都是API resource)也是最能体现kubernetes之于传统运维价值的地方,不再需要手动扩容了,终于实现自动化了,还可以自定义指标,没准未来还可以通过人工智能自动进化呢!例如联动Prometheus实现预测告警和预测伸缩。

Metrics支持

在不同版本的API中,HPA autoscale时可以根据以下指标来判断:

autoscaling/v1

CPU

autoscaling/v1alpha1

内存

自定义metrics

kubernetes1.6起支持自定义metrics,但是必须在kube-controller-manager中配置如下两项:

--horizontal-pod-autoscaler-use-rest-clients=true

--api-server指向kube-aggregator,也可以使用heapster来实现,通过在启动heapster的时候指定--api-server=true。查看kubernetes metrics

多种metrics组合

HPA会根据每个metric的值计算出scale的值,并将最大的那个值作为扩容的最终结果。


演示根据CPU进行伸缩

1. 创建一个部署Deployment并把它通过服务暴露出来

kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80

2. 创建HPA

kubectl autoscale deployment php-apache --cpu-percent=50--min=1--max=10 

3. 检查HPA状态

kubectl get hpa

4. 加压

kubectl run -i --tty load-generator --image=busybox /bin/sh

whiletrue;dowget -q -O- http://php-apache.default.svc.cluster.local;done

5. 过1分钟左右再次检查HPA状态和部署状态

kubectl get hpa

kubectl get deployment php-apache

6. 停压,等1分钟查看状态

演示根据自定义指标http_requests实现伸缩



参考:

Horizontal Pod Autoscaling · Kubernetes Handbook - Kubernetes中文指南/云原生应用架构实践手册 by Jimmy Song(宋净超)

GitHub - stefanprodan/k8s-prom-hpa: Kubernetes Horizontal Pod Autoscaler with Prometheus custom metrics

你可能感兴趣的:(Horizontal Pod Autoscaler 初探)