暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s之Horizontal Pod Autoscaling(HPA)

云原生小记 2020-04-03
1213

一、HPA简介
  • 应用的资源使用率通常都有高峰和低谷的,对于Kubernetes中的POD集群来说,HPA就是实现这种水平伸缩的控制器, 它能在当POD中业务负载上升的时候,创建新的POD来保证业务系统稳定运行,当POD中业务负载下降的时候,可以销毁POD来提高资源利用率。
  • HPA
    全称Horizontal Pod Autoscaling
    (Pod水平自动扩容,简称HPA)。

为什么要水平而不叫垂直, 那是因为自动扩展主要分为两种:

  • 水平扩展,针对于实例数目的增减;
  • 垂直扩展,即单个实例可以使用的资源的增减。

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

在每个周期内,controller manager 会查询 HorizontalPodAutoscaler 中定义的 metric 的资源利用率。Controller manager 从 resource metric API(每个 pod 的 resource metric)或者自定义 metric API(所有的metric)中获取 metric。

根据 CPU 使用率或自定义 metrics 自动扩展 Pod 数量(支持 replication controller、deployment);k8s1.6版本之前是通过kubelet来获取监控指标,1.6版本之后是通过api server、heapster或者kube-aggregator来获取监控指标。


Metrics支持:

根据不同版本的API中,HPA autoscale时靠以下指标来判断资源使用率。主要有一下几种:

  • autoscaling/v1: CPU
  • autoscaling/v2alpha1
  • 内存
  • 自定义metrics
  • 多metrics组合: 根据每个metric的值计算出scale的值,并将最大的那个值作为扩容的最终结果

Metric安装方式:

这里贴出两个地址,两个都可用:

  • https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server
  • https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy

本人安装metric-server见本公众号:<<资源指标API之metrics-server 及自定义指标API>>

二、HPA工作流程:
  • 创建HPA资源,设定目标CPU使用率限额,以及最大、最小实例数, 一定要设置Pod的资> * 源限制参数: request, 否则HPA不会工作。控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
  • 然后与创建时设定的值和指标做对比(平均值之和/限额),求出目标调整的实例个数
  • 目标调整的实例数不能超过1中设定的最大、最小实例数,如果没有超过,则扩容;超过,则扩容至最大的实例个数 重复上面第2到4步骤
三、自动伸缩算法:

HPA Controller会通过调整副本数量使得CPU使用率尽量向期望值靠近,而且不是完全相等.另外,官方考虑到自动扩展的决策可能需要一段时间才会生效:例如当pod所需要的CPU负荷过大,从而在创建一个新pod的过程中,系统的CPU使用量可能会同样在有一个攀升的过程。所以,在每一次作出决策后的一段时间内,将不再进行扩展决策。对于扩容而言,这个时间段为3分钟,缩容为5分钟(可以通过--horizontal-pod-autoscaler-downscale-delay
--horizontal-pod-autoscaler-upscale-delay
进行调整)。

HPA Controller中有一个tolerance
(容忍力)的概念,它允许一定范围内的使用量的不稳定,现在默认为0.1,这也是出于维护系统稳定性的考虑。例如,设定HPA调度策略为cpu使用率高于50%触发扩容,那么只有当使用率大于55%或者小于45%才会触发伸缩活动,HPA会尽力把Pod的使用率控制在这个范围之间。具体的每次扩容或者缩容的多少Pod的算法为: Ceil(前采集到的使用率 / 用户自定义的使用率) * Pod数量)
每次最大扩容pod数量不会超过当前副本数量的2倍

Horizontal Pod Autoscaler
由一个控制循环实现,循环周期由 controller manager 中的--horizontal-pod-autoscaler-sync-period
标志指定(默认是 30 秒)。如果要修改间隔时间,可以设置horizontal-pod-autoscaler-sync-period
参数 如:在kube-controller-manager.service启动文件或者配置文件添加或者更改如下--horizontal-pod-autoscaler-sync-period=10s

通过手工执行kubectl scale命令,我们可以实现Pod扩容或缩容。如果仅仅到此显然不符合Kubernetes的定位目标--自动化、智能化

HPA与之前的RC、Deployment 一样,也属于一种Kubernetes资源对象。通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

HPA有以下两种方式作为Pod负载的度量指标:

  • CPUUtilizationPercentage
  • 应用程序自定义的尺度指标,比如服务在每秒内的相应的请求书(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

使用yml定义针对CPU的HPA:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
minReplicas: 1 #最小副本数
maxReplicas: 10 #最大副本数
scaleTargetRef:
apiVersion: v1
kind: Deployment
name: php-apache
targetCPUUtilizationPercentage: 90 #当CPU到90%触发自动动态扩容行为

参数解释
:当CPUUtilizationPercentage的值超过90%时会触发自动动态扩容行为,扩容或缩容时必须满足的一个约束条件是Pod的副本数要介于1与10之间

使用命令定义针对CPU的HPA

[root@k8s-master yaml]# kubectl autoscale deployment php-apache --cpu-percent=90 --min=1 --max=10


------------------------------------------------------

公众号:竹下侯小姜运维

个人博客:https://www.ayunw.cn

重要的事情认真做,普通的事情规范做!

------------------------------------------------------

不定期更新优质内容,技术干货!如果觉得对你有帮助,请扫描下方二维码关注!

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我



文章转载自云原生小记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论