Knative Serving Autoscaling基于每个pod的平均并发请求数。系统的默认目标并发性为100.0,当然可以通过autoscaling.knative.dev/target进行配置,例如下面的示例中配置了数量10,如果在此情况下加载了50个并发请求,那么Autoscaler将会创建5个pod,即50个并发请求除以并发数10。
Autoscaler接收到并发统计的时候,会根据算法计算需要的pod个数。当前算法有两种模式,分别是稳定模式(Stable Mode)与恐慌模式(Panic Mode),一个是短时间,一个是长时间,为了解决短时间内请求突增的场景,需要快速扩容。
·稳定模式:在稳定模式下,Autoscaler根据每个pod期望的并发来调整部署的副本replicas个数。根据每个pod在60秒窗口内的平均并发来计算,而不是根据现有副本个数计算,因为pod的数量增加和pod变为可服务和提供指标数据有一定时间间隔。
·恐慌模式:恐慌时间窗口默认是6秒,如果在6秒内达到2倍的期望并发,则转换到恐慌模式下。在恐慌模式下,Autoscaler根据这6秒的时间窗口计算,这样更能及时响应突发的流量请求。每2秒调整部署的副本数达到想要的pod个数(或者最大10倍于当前pod的数量),为了避免pod数量频繁变动,在恐慌模式下只能增加,不会减少。60秒后会恢复回稳定模式。
如图11-10所示Autoscaler计算60秒窗口内的平均并发性,因此系统需要一分钟才能稳定在所需的并发级别。但是,Autoscaler还会计算6秒的“恐慌”窗口,如果该窗口达到目标并发的2倍,则会进入恐慌模式。在恐慌模式下,Autoscaler在较短、更敏感的应急窗口上运行。一旦恐慌条件不再满足60秒,Autoscaler将返回到最初的60秒“稳定”窗口。

图11-10 自动伸缩器(Autoscaler)的算法
当Autoscaler在一段时间内观察到每个pod的平均并发数为零时,它会将Revision修改为Reserve状态。这会将部署缩容为0,停止与修订版关联的任何单个Autoscaler,并将修订的所有流量路由到Activator。
此外,Autoscaler支持通过注释进行自定义。Knative内置了两个自动伸缩算法:
·kpa.autoscaling.knative.dev,这是上面描述的基于并发的Autoscaler,也是Knative默认的自动伸缩算法;此外,可以在注释中指定Autoscaler目标和缩放边界。具有自定义目标和比例范围的服务示例如下所示:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: autoscale-go
namespace: default
spec:
runLatest:
configuration:
revisionTemplate:
metadata:
annotations:
# Knative concurrency-based autoscaling (default).
autoscaling.knative.dev/class: kpa.autoscaling.knative.dev
autoscaling.knative.dev/metric: concurrency
# Target 10 requests in-flight per pod.
autoscaling.knative.dev/target: "10"
# Disable scale to zero with a minScale of 1.
autoscaling.knative.dev/minScale: "1"
# Limit scaling to 100 pods.
autoscaling.knative.dev/maxScale: "100"
spec:
container:
image: registry.cn-beijing.aliyuncs.com/istio-samples/autoscale-go:0.1
·hpa.autoscaling.knative.dev,指的是基于Kubernetes HPA自动调整CPU使用率的方式,例如:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: autoscale-go
namespace: default
spec:
runLatest:
configuration:
revisionTemplate:
metadata:
annotations:
# Standard Kubernetes CPU-based autoscaling.
autoscaling.knative.dev/class: hpa.autoscaling.knative.dev
autoscaling.knative.dev/metric: cpu
spec:
container:
image: registry.cn-beijing.aliyuncs.com/istio-samples/autoscale-go:0.1