组件自动伸缩
组件的负载会不停的变化, 时高时低, 很难为其配置合适的资源; Rainbond 引入自动伸缩, 可以很好地解决这个问题. 组件自动伸缩会一直观察用户设置的指标, 一旦该指标超过或低于期望阈值, 就会自动地对组件进行伸缩.
本文会根据以下三方面来介绍组件的自动伸缩功能:
- 组件自动伸缩的原理.
- 组件自动伸缩的使用方法.
- 一个关于组件自动伸缩的演示例子.
组件自动伸缩的原理
组件的自动伸缩有两种, 分别是 水平自动伸缩 和 垂直自动伸缩. 水平伸缩, 增加或减少组件的副本数; 而自动水平伸缩则是, 根据组件的 CPU 使用率, 内存或其他自定义指标, 自动的执行组件的水平伸缩.
垂直伸缩, 为组件分配更多或更少的 CPU 和内存; 而自动垂直伸缩则是, 根据组件的 CPU 使用率, 内存或其他自定义指标, 自动的执行组件的垂直伸缩.
目前(5.1.9), Rainbond 只支持组件的水平自动伸缩, 所以本文不会涉及太多的 垂直自动伸缩.
组件水平自动伸缩

Horizontal Pod Autoscaler 由两部分组成, HPA 资源 和 HPA 控制器. HPA 资源 定义了组件的行为, 包括指标, 期望值, 和最大最小副本数等. HPA 控制器, 周期性地检查检查组件所设置的指标; 其周期由 controller manager 的参数 --horizontal-pod-autoscaler-sync-period 控制, 默认是 15 秒。
Rbd Worker 负责将你在云帮控制台为组件设置的指标, 期望值, 和最大最小副本数等参数, 转化成 kubernetes 集群中的 HPA 资源. 供 HPA 控制器使用。
在每个周期中, HPA 控制器通过 mertrics API 查询用户为每个组件设置的指标; 当指标超过或低于期望阈值时, HPA 控制器会调整 Deployment/Statefulset 中的副本数, 最后由 Deployment/Statefulset 完成组件实例数的增加或减少。
HPA 控制器一般从 metrics.k8s.io, custom.metrics.k8s.io 和 external.metrics.k8s.io 三个聚合 API 观察指标。
metrics.k8s.io 这个 API 由 metrics-server 提供, 对应的是资源指标(resource metrics), 即 CPU 使用率, CPU 使用量 和 内存使用率, 内存使用量. 也是 Rainbond 目前支持的指标类型。
custom.metrics.k8s.io 对应的是 自定义指标, external.metrics.k8s.io 对应的是 外部指标. 比如: 每秒请求数(requests-per-secon), 每秒接收的包数(packets-per-second).
由 Kube Metrics Adapter, Prometheus Adapter
或者是自己实现的遵循了 Kubernetes metrics API 定义 的第三方服务提供. 自定义指标和外部指标大体上是相同的.
自定义指标不支持使用率, 只能是值, 或者说 使用量, 是组件的每个实例的平均值.
目前 5.1.9, Rainbond 只支持 资源指标, 即与 CPU 和内存相关的指标. 虚线框里自定义指标和外部指标, 会在未来的版本中实现.
水平自动伸缩的算法
从最基本的角度来看,Horizontal Pod Autoscaler 根据 指标目标值 和 指标实际值 的比来计算期望的实例数:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
举个例子, 如果指标实际值是 200m, 期望值时 100m, 那么实例数将会翻倍, 因为 200.0 / 100.0 == 2.0; 如果实际值降低到了 50m, 那么
实例数不变, 因为 50.0 / 100.0 == 0.5(比率接近 1.0, HPA 控制器将会跳过缩放).