很多时候需要对线上应用进行扩容和缩容,扩容以提高应用处理能力,缩容以节约成本;而以往的系统对在线扩缩容支持的并不是很好,或多或少都需要开发或运维人员介入;
Kubernetes提供的HPA - Horizontal Pod Autoscaler - Pod水平扩缩容,则解决了这个问题,只需要定义扩缩容的阈值,之后就交给Kubernetes处理即可。
基本概念
HPA默认 15s 执行一次 (当然也可以修改 --horizontal-pod-autoscaler-sync-period XXs
),每次执行会查询资源的利用率(如果有多个pod则会计算平均值),之后与预先定义的指标/阈值进行比较,进而计算出目标 副本数量;
关于如何收集度量值,可通过一系列的聚合API进行,比如 metrics.k8s.io
,custom.metrics.k8s.io
,external.metrics.k8s.io
算法细节
期望的副本数量 = 当前副本数量 * (当前指标 / 期望指标)
举个例子,假设当前的 副本数量为1,当前指标比如CPU使用率是 80%,而期望的CPU使用率是 40%,那么 1 * (80/40) = 2
,也就是说副本数量需要翻倍;而假设当前副本数量为2,当前指标比如CPU使用率是 20%,而期望的CPU使用率是 40%,那么2 * (20/40) = 1
,则当前副本数量需要减半;
当然上面的当前指标值
是个平均值(正在terminating或fail的pod都不会被统计);
同时,如果 当前指标/期望指标
的比例等于1,或者说在一个容忍范围内(--horizontal-pod-autoscaler-tolerance
默认0.1),则会放弃扩容活缩容;
配置HPA
kubectl 的 HPA 设置,kubectl autoscale rs rsname --min=2 --max=5 --cpu-percent=80
,则会对名为rsname的replicationset (除此之外还可以设置deployment) 设置一个 hpa 对象,副本数量介于2-5之间,目标CPU使用率为80%;
Java client fabric8
的 HPA 设置,这里贴的是老版本的fabric8
HorizontalPodAutoscaler horizontalPodAutoscaler =