基于Heapster的HPA

基于Heapster的HPA

概述

Horizontal Pod Autoscaling,简称HPA,是Kubernetes中实现POD水平自动伸缩的功能。自动扩展主要分为两种:php

  • 水平扩展(scale out),针对于实例数目的增减
  • 垂直扩展(scal up),即单个实例可使用的资源的增减, 好比增长cpu和增大内存

HPA属于前者。它能够根据CPU使用率或应用自定义metrics自动扩展Pod数量(支持 replication controller、deployment 和 replica set)node

节点扩缩容层面,k8s集群的Cluster Autoscaler持续监控Pods,一旦发现Pods没法被schedule,则基于PodConditoin进行扩展,即node节点的自动扩缩容,具体内容在后续文章中介绍。git

监控数据获取

  • Heapster: heapster收集Node节点上的cAdvisor数据,并按照kubernetes的资源类型来集合资源。可是在v1.11中已经被废弃(heapster监控数据可用,但HPA再也不从heapster拿数据)
  • metric-server: 在v1.8版本中引入,官方将其做为heapster的替代者。metric-server依赖于kube-aggregator,所以须要在apiserver中开启相关参数。v1.11中HPA从metric-server获取监控数据

工做流程

  • 1.建立HPA资源,设定目标CPU使用率限额,以及最大、最小实例数, 必定要设置Pod的资源限制参数: request, 不然HPA不会工做。
  • 2.控制管理器每隔30s(能够经过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用状况
  • 3.而后与建立时设定的值和指标作对比(平均值之和/限额),求出目标调整的实例个数
  • 4.目标调整的实例数不能超过1中设定的最大、最小实例数,若是没有超过,则扩容;超过,则扩容至最大的实例个数

如何部署:

  • 1.6-1.8版本默认使用heapster
  • 1.11版本及以上默认使用metric-server(需单独安装,并开启参数)

1.部署和运行php-apache并将其暴露成为服务github

2.建立HPA
apache

若是为1.8及如下的k8s集群,指标正常,若是为1.11集群,须要执行以下操做。
api

4.向php-apache服务增长负载,验证自动扩缩容服务器

启动一个容器,并经过一个循环向php-apache服务器发送无限的查询请求(请在另外一个终端中运行如下命令)
spa

5.观察HPA是否生效
3d

用yaml建立HPA的方式为:code

实现细节

HPA由一个控制循环实现,循环周期由--horizontal-pod-autoscaler-sync-period 标志指定,默认是30秒,每一个周期内,controller-manager会查询HPA中定义的metric的资源利用率。

如上例子,pod的request定义为200M,而HPA定义的target为50%,即HPA将经过增长或者减小Pod副本的数量(经过Deployment)以保持全部Pod的平均CPU利用率在50%之内(即200*0.5=100M之内),循环周期到达时,获取pod的1分钟内的平均cpu利用率(从heaspter),发现超过了100M,为332M,因而经过下面的公式,决定最终的pod数量

TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

即 332/50 =6.xxx ceil为向上取整,获得7。若是获得的结果大于10,则为10

由于每次HPA生效都会建立或者删除pod,而这些操做其实会影响到metric监控值,如建立pod会暂时性的升高cpu,所以每次扩容都要间隔3分钟,缩容须要间隔5分钟。且须要知足:avg(CurrentPodsConsumption)/ Target降低9%,进行缩容,增长至10%才进行扩容

这样作好处是:
一、判断的精度高,不会频繁的扩缩pod,形成集群压力大。
二、避免频繁的扩缩pod,防止应用访问不稳定

实现hpa的条件:
一、hpa不能autoscale daemonset类型control
二、要实现autoscale,pod必须设置request

参考:https://github.com/kubernetes...

本文为容器监控实践系列文章,完整内容见:container-monitor-book

相关文章
相关标签/搜索