首页 > 其他分享 >KPA自动扩缩容配置

KPA自动扩缩容配置

时间:2023-01-25 16:45:51浏览次数:32  
标签:name 示例 autoscaling 扩缩容 dev KPA 修订版 自动 knative

Serverless的主要特性之一就是应用可以按需扩缩容。这需要观察流入的负载并根据相应的指标动态调整应用规模。Knative Serving带有Autoscaler组件。它默认使用基于请求的自动扩缩容(Knative Pod Autoscaler,KPA)功能来实现自动伸缩策略,也可以使用Kubernetes的Pod水平自动伸缩(Horizontal Pod Autoscaler,HPA)功能或其他第三方Autoscaler。KPA适合大多数使用场景,它可以对工作负载做更精细的控制。

1 全局或修订版范围设置

全局设置在Knative Serving所在命名空间的ConfigMap config-autoscaler中。如果是使用yaml手工安装,命名空间默认为knative-serving。

修订版范围是通过注解(Annotation)在修订版中进行配置的。通过Service或configuration创建修订版,就意味着Annotation必须设置在相应的修订版模板中。所有修订版范围的Annotation键都是以autoscaling.knative.dev/为前缀的。修订版范围的设置会覆盖全局设置。如果没有版本范围设置,就会使用全局设置。

需要注意的是,修订版范围设置是在修订版模板中的annotations中完成的。设置在最高一级metadata的annotations中的扩缩容设置在修订版自动扩缩容过程中没有任何效果。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "70"
    spec:
      containers:
       - image: cnlab/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-default: "100"

2 Class

Autoscaler支持多种可能的实现方式,在这里叫作Class,Knative Serving支持KPA和HPA方式。HPA需要在安装时开启,并不是Knative Serving核心的组成部分。KPA是为无服务器工作负载量身定制的,是默认开启的。它对性能做了专门的优化,支持缩容到零,这是HPA所不具备的。HPA支持基于CPU的扩展机制,这是KPA所不支持的。

·全局关键字:pod-autoscaler-class。

·修订版范围注解关键字:autoscaling.knative.dev/class。

·可选值:kpa.autoscaling.knative.dev或hpa.autoscaling.knative.dev。

·默认值:kpa.autoscaling.knative.dev。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/class: "kpa.autoscaling.knative.dev"
    spec:
      containers:
       - image: cnlab/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  pod-autoscaler-class: "kpa.autoscaling.knative.dev"

3 度量指标

度量指标配置定义了Autoscaler观察的指标类型。KPA支持并发数(Concurrency)和每秒请求数(RPS)两种指标。HPA仅支持CPU使用率指标。

·全局关键字:n/a。

·修订版范围注释关键字:autoscaling.knative.dev/metric。

·可选值:Concurrency、RPS或CPU。

·默认值:concurrency。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/metric: "rps"
    spec:
      containers:
       - image: cnlab/helloworld-go

4 目标值

自动缩放的目标值是Autoscaler维护应用的每个副本度量指标的目标值。如果我们指定并发目标是10,Autoscaler将会试图保证每个副本平均一次接收10个请求。Autoscaler会评估指定指标是否达到目标设定数值。

1.Concurrency Target/Limit

当度量指标设置成Concurrency时,Autoscaler将观察到的并发数据与目标值进行比较,试图在每个副本上维持一个稳定的并发请求数量。

并发目标值的配置有点特别,它有软性和硬性两种并发限制。硬性限制是一个强制上限,如果并发数达到了边界,更多的请求将被放到缓存区等待,直到有足够的容量被释放时,这些请求才会被执行。软性限制只是给Autoscaler的目标,在突发情况下该值是可以被超出的。

注意:如果你的应用有明确的要求,建议仅使用硬性限制。低的硬限制值会对应用的吞吐量和延迟造成影响。如果软/硬性限制同时被指定,Autoscaler将采用其中较小的值。

(1)软性限制

软性限制在config-autoscaler ConfigMap中有全局设置项,也可以在修订版中指定。它在服务中的配置形式是采用注解形式,通过定义autoscaling.knative.dev/target的值来实现。它的默认值是100。

·全局关键字:container-concurrency-target-default。

·修订版范围注解关键字:autoscaling.knative.dev/target。

·可能的值:任何整数型的值。

·默认值:100。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "200"
    spec:
      containers:
       - image: cnlab/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-default: "200"

(2)硬性限制

硬性限制在config-defaults ConfigMap中有全局设置项,也可以在每个修订版中指定。它的设置形式不是采用注解形式,而是采用containerConcurrency字段来实现。它的默认值是0,表示不限并发请求数。如果设置为大于0的值,则表示有被允许的、准确的并发请求数。

·全局关键字:container-concurrency。

·修订版内定义关键字:containerConcurrency。

·可能的值:任何整数型的值。

·默认值:0,代表并发请求数没有限制。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    spec:
      containerConcurrency: 50
      containers:
       - image: cnlab/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-defaults
  namespace: knative-serving
data:
  container-concurrency: "50"

2.目标使用率

除了软、硬性限制,并发数还可以通过目标使用率(Target Utilization)进行调整。目标使用率指定了一个目标的百分比与Autoscaler实际目标的差异。在效果上,它指定了副本的访问热度。

·全局关键字:container-concurrency-target-percentage。

·修订版注解关键字:autoscaling.knative.dev/targetUtilizationPercentage。

·可能的值:任何浮点型数值。

·默认值:70。

注意:目标使用率仅作为缩放的建议,不作为硬性限制强制采用。例如,如果containerConcurrency设置为10,目标使用率设置为70,则当全部副本的平均并发请求数达到7时,Autoscaler将会创建一个新的副本。需要注意的是,第7到10个请求仍将发送给现有副本,一旦到达containerConcurrency的限制,Autoscaler将启动预期数量的新副本。

另外,如果Activator在路由路径中,将全面加载符合容器并发请求数值的副本数量,不会考虑目标使用率。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/targetUtilizationPercentage: "80"
    spec:
      containers:
       - image: cnlab/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-percentage: "80"

3.RPS目标

每个副本的RPS目标值配置如下。

·全局关键字:requests-per-second-target-default。

·修订版注解关键字:autoscaling.knative.dev/target。

·可能的值:任何整数型的值。

·默认值:200。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/metric: "rps"
        autoscaling.knative.dev/target: "150"
    spec:
      containers:
       - image: cnlab/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  requests-per-second-target-default: "150"

5 缩放边界

为了实现副本缩放的上限和下限控制,我们可以指定缩放范围。

1.边界下限

边界下限表示修订版副本需要保留的最小数量。Knative会保持在任何时间点副本数不少于边界下限。

·全局关键字:n/a。

·修订版注解关键字:autoscaling.knative.dev/minScale。

·可能的值:任何整数型的值。

·默认值:0(scale-to-zero开启的同时KPA class被使用)、1(其他场景)。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/minScale: "3"
    spec:
      containers:
       - image: gcr.io/knative-samples/helloworld-go

2.边界上限

边界上限表示修订版副本所能达到的最大数量。Knative会保持在任何时间点副本数都不会超过边界上限。

·全局关键字:n/a。

·修订版注解关键字:autoscaling.knative.dev/maxScale。

·可能的值:任何整数型的值。

·默认值:0(代表没有限制)。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "3"
    spec:
      containers:
       - image: gcr.io/knative-samples/helloworld-go 

6 KPA特性设置

KPA提供了多种配置选项,适用于各种场景。全局范围配置作为默认设置对所有服务有效。修订版范围是以注解的形式在修订版模板中进行配置。

1.缩容到零

scale-to-zero的值控制Knative修订版缩容到零或保留1个副本。

缩容到零的配置如下。

·全局关键字:enable-scale-to-zero。

·修订版注解关键字:n/a。

·可能的值:任何布尔类型的值。

·默认值:true。

注意:如果enable-scale-to-zero设置为false,Autoscaler将参考边界下限值的设置。

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  enable-scale-to-zero: "false"

2.缩容到零的宽限周期

缩容到零的宽限周期是指系统在删除最后一个副本之前等待的时间上限。缩容到零的宽限周期配置如下。

·全局关键字:scale-to-zero-grace-period。

·修订版注解关键字:n/a。

·可能的值:时长(时长不小于6s)。

·默认值:30s。

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  scale-to-zero-grace-period: "40s"

3.缩容到零时最后一个Pod的保留期

scale-to-zero-pod-retention-period定义了当Autoscaler决定要缩容到零时,最后一个Pod保留的最小时长。该设置主要针对那些启动代价高、流量突发性高的场景。其配置如下。

·全局关键字:scale-to-zero-pod-retention-period。

·修订版注解关键字:autoscaling.knative.dev/scaleToZeroPodRetentionPeriod。

·可能的值:非负时间字符串。

·默认值:0s。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/scaleToZeroPodRetentionPeriod: "42s"
    spec:
      containers:
       - image: gcr.io/knative-samples/helloworld-go

全局范围配置示例如下:

apiVersion: operator.knative.dev/v1alpha1
kind: KnativeServing
metadata:
  name: knative-serving
spec:
  config:
    autoscaler:
      scale-to-zero-pod-retention-period: "42s"

4.稳定模式和恐慌模式

KPA的行为是以时间窗口的聚合指标数据为基础,这些窗口期定义了Autoscaler考量的历史数据值,用于在指定时间内平滑数据。窗口期越短,Autoscaler的反应速度就越快,但容易造成过度反应。

KPA的实现中有两种模式:稳定模式和恐慌模式。稳定模式用于常规操作,而恐慌模式适用于特殊场景,如当突发流量产生时,恐慌模式用于快速扩展修订版的副本数量。恐慌模式下,窗口期一般更短,可以快速响应负载的变化。在恐慌模式下,为了避免过多的抖动,修订版的副本数不会缩减。

(1)稳定模式

·全局关键字:stable-window。

·修订版注解关键字:autoscaling.knative.dev/window。

·可能的值:大于等于6s,小于等于1h。

·默认值:60s。

注意:在缩容期间,整个稳定窗口期,如果修订版没有任何流量,最后一个副本会被删除。只有没有发生任何导致系统进入恐慌模式的事件时,Autoscaler才会脱离恐慌模式进入稳定模式。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/window: "40s"
    spec:
      containers:
       - image: gcr.io/knative-samples/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  stable-window: "40s"

(2)恐慌模式

恐慌窗口期被定义为其占稳定窗口期的百分比。例如,恐慌窗口期设置为10.0,意味着恐慌模式的窗口期时长是稳定窗口期时长的10%。

·全局关键字:panic-window-percentage。

·修订版注解关键字:autoscaling.knative.dev/panicWindowPercentage。

·可能的值:浮点型数值,大于等于1.0,小于等于100.0。

·默认值:10.0。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/panicWindowPercentage: "20.0"
    spec:
      containers:
       - image: gcr.io/knative-samples/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  panic-window-percentage: "20.0"

恐慌模式的阈值定义了Autoscaler何时从稳定模式进入恐慌模式。恐慌模式的最小阈值为100,默认值为200,意味着当流量达到当前副本能够处理的两倍时进入恐慌模式。

·全局关键字:panic-threshold-percentage。

·修订版注解关键字:autoscaling.knative.dev/panicThresholdPercentage。

·可能的值:浮点型数值,大于等于110.0,小于等于1000.0。

·默认值:200.0。

修订版范围配置示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/panicThresholdPercentage: "150.0"
    spec:
      containers:
       - image: gcr.io/knative-samples/helloworld-go

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  panic-threshold-percentage: "150.0"

5.缩放速率

缩放速率设置用于控制一个评估周期内缩放修订版副本的数量。无论副本是增加还是减少,都要允许至少1个副本数量的变化。无论缩放速率如何设置,Autoscaler总是可以扩缩容至少一个副本。

(1)最大扩容速率

最大扩容速率是期望扩容Pod数与当前可用Pod数的比值,是每次扩容允许的最大速率。当前周期最大扩容数的计算方法:最大扩容数=最大扩容速率×当前可用Pod数量。

·全局关键字:max-scale-up-rate。

·修订版注解关键字:n/a。

·可能的值:任何浮点类型数值。

·默认值:1000.0。

全局范围配置(ConfigMap)如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  max-scale-up-rate: "500.0"

(2)最大缩容速率

最大缩容速率是当前可用Pod数和期望Pod数之间的比值,是每次缩容允许的最大速率。当前周期内最大缩容数的计算方法:最大缩容数=最大缩容速率×当前可用Pod数量。

·全局关键字:max-scale-down-rate。

·修订版注解关键字:n/a。

·可能的值:任何浮点类型数值。

·默认值:2.0。

全局范围配置示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  max-scale-down-rate: "4.0"

标签:name,示例,autoscaling,扩缩容,dev,KPA,修订版,自动,knative
From: https://www.cnblogs.com/muzinan110/p/17067041.html

相关文章