什么是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不支持?
为什么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(宋净超)