首页前端开发HTML使用ASM管理Knative服务(6):基于流量请求数实现服务自动扩缩容

使用ASM管理Knative服务(6):基于流量请求数实现服务自动扩缩容

时间2023-04-03 17:22:01发布访客分类HTML浏览1324
导读:Knative on ASM中提供了开箱即用、基于流量请求的自动扩缩容KPA(Knative Pod Autoscaler)功能。本文介绍如何基于流量请求数实现服务自动扩缩容。 本系列文章包括以下部分:使用ASM管理Knative服务(1)...

Knative on ASM中提供了开箱即用、基于流量请求的自动扩缩容KPA(Knative Pod Autoscaler)功能。本文介绍如何基于流量请求数实现服务自动扩缩容。

本系列文章包括以下部分:

使用ASM管理Knative服务(1):Knative on ASM概述

使用ASM管理Knative服务(2):使用Knative on ASM部署Serverless应用

使用ASM管理Knative服务(3):在Knative on ASM中使用自定义域名

使用ASM管理Knative服务(4):使用ASM网关实现HTTPS访问Knative服务

使用ASM管理Knative服务(5):在Knative on ASM中基于流量灰度发布服务

使用ASM管理Knative服务(6):基于流量请求数实现服务自动扩缩容

前提条件

  • 已使用Knative on ASM创建Knative服务。具体操作,请参见使用Knative on ASM快速部署Serverless应用
  • 使用自定义域名aliyun.com, 参见在Knative on ASM中使用自定义域名

背景介绍

Knative Serving为每个Pod注入QUEUE代理容器(queue-proxy),该容器负责向Autoscaler报告业务容器的并发指标。Autoscaler接收到这些指标之后,会根据并发请求数及相应的算法,调整Deployment的Pod数量,从而实现自动扩缩容。

并发数和QPS

  • 并发数是同一时刻Pod的接收的请求数。
  • QPS指的是Pod每秒响应的请求数,也就是最大吞吐能力。

并发数的增加并不一定会导致QPS增加。应用在访问压力较大的情况下,如果并发数增加,系统的QPS反而会下降。因为系统超负荷工作,CPU、内存等其他消耗导致系统性能下降,从而导致响应延迟。

具体算法参见: https://help.aliyun.com/document_detail/186137.html

如果需要在Knative中使用HPA, 参见:https://help.aliyun.com/document_detail/188160.html

KPA配置介绍

配置KPA

配置KPA,需要配置config-autoscaler,该参数默认已配置,以下为重点参数介绍。

执行以下命令,查看config-autoscaler

kubectl -n knative-serving get cm config-autoscaler

预期输出:

apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 container-concurrency-target-default: "100"
 container-concurrency-target-percentage: "0.7"
 enable-scale-to-zero: "true"
 max-scale-up-rate: "1000"
 max-scale-down-rate: "2"
 panic-window-percentage: "10"
 panic-threshold-percentage: "200"
 scale-to-zero-grace-period: "30s"
 scale-to-zero-pod-retention-period: "0s"
 stable-window: "60s"
 target-burst-capacity: "200"
 requests-per-second-target-default: "200"

为KPA配置缩容至0

字段描述设置值
scale-to-zero-grace-period表示在缩为0之前,inactive revison保留的运行时间(最小是30s)30s
stable-window当在Stable模式运行中,Autoscaler在稳定窗口期下平均并发数下的操作。此外, stable-window也可以在Revision注释中配置。autoscaling.knative.dev/window: 60s60s
enable-scale-to-zero设置enable-scale-to-zero参数为truetrue

配置Autoscaler的并发数

字段描述设置值
container-concurrency-target-default定义在给定时间(软限制)需要多少并发请求,是Knative中Autoscaler的推荐配置。在ConfigMap中默认配置的并发target为100。此外, 这个值也可以通过Revision中的autoscaling.knative.dev/target注释进行修改。autoscaling.knative.dev/target: 50100
containerConcurrency当在Stable模式运行中,Autoscaler在稳定窗口期下平均并发数下的操作。此外, stable-window也可以在Revision注释中配置。autoscaling.knative.dev/window: 60s60s
container-concurrency-target-percentage这个参数为并发百分比或称为并发因子,并且会直接参与扩缩容并发数计算。例如,如果并发数target或者containerConcurrency设置值为100,并发因子container-concurrency-target-percentage为0.7。那么实际担当并发数达到70(1000.7)时就会触发扩容操作。因此,实际扩缩容并发数=target(或者containerConcurrencycontainer-concurrency-target-percentage0.7

配置扩缩容边界

通过minScalemaxScale可以配置应用程序提供服务的最小和最大Pod数量。通过这两个参数配置可以控制服务冷启动或者控制计算成本。

说明:

  • 如果未设置minScale注释,Pods将缩放为零。如果设置config-autoscalerenable-scale-to-zerofalse,则缩放为1。
  • 如果未设置maxScale注释,则创建的Pod数量将没有上限。

minScale和maxScale可以在Revision模板中按照以下方式进行配置:

spec:
  template:
    metadata:
      autoscaling.knative.dev/minScale: "2"
      autoscaling.knative.dev/maxScale: "10"

场景一:设置并发请求数实现自动扩缩容

本场景示例将通过设置并发请求数,通过KPA实现自动扩缩容。
请按照以下步骤在集群中部署autoscale-go应用。关于快速部署Serverless应用的操作细节,可以参考 使用Knative on ASM快速部署Serverless应用

1) 创建autoscale-go.yaml。设置并发目标数为10。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: autoscale-go
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: autoscale-go
      annotations:
        autoscaling.knative.dev/target: "10"
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1

2) 使用kubectl连接到集群,在命令行执行以下命令部署autoscale-go

kubectl apply -f autoscale-go.yaml 

3) 登录ASM服务网格控制台查看ASM网关。
4)使用Hey压测工具,执行30s内保持50个并发请求(请将xxx.xx.xx.xxx替换为您的网关ip)。

说明 Hey压测工具的详细介绍,请参见Hey
hey -z 30s -c 50   -host "autoscale-go.default.example.com"   "http://xxx.xx.xx.xxx?sleep=100&
    prime=10000&
    bloat=5"

预期输出:

从结果可以看出,整个过程中扩容了7个Pod。这是由于当容器并发量大于目标并发量的一定百分比后(默认为70%),knative会提前创建出更多的Pod备用以免并发量进一步增的情况下,目标值被突破。

场景二:设置扩缩容边界实现自动扩缩容

扩缩容边界指应用程序提供服务的最小和最大Pod数量。通过设置应用程序提供服务的最小和最大Pod数量实现自动扩缩容。
请按照以下步骤在集群中部署autoscale-go应用。关于快速部署Serverless应用的操作细节,可以参考使用Knative on ASM快速部署Serverless应用

1) 创建autoscale-go.yaml。设置最大并发请求数为10,minScale最小保留实例数为1,maxScale最大扩容实例数为3。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: autoscale-go
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: autoscale-go
      annotations:
        autoscaling.knative.dev/target: "10"
        autoscaling.knative.dev/minScale: "1"
        autoscaling.knative.dev/maxScale: "3"   
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1

2) 使用kubectl连接到集群,在命令行执行以下命令部署autoscale-go

kubectl apply -f autoscale-go.yaml 

3) 登录ASM服务网格控制台查看ASM网关。
4) 使用Hey压测工具,执行30s内保持50个并发请求(请将xxx.xx.xx.xxx替换为您的网关ip)。

说明 Hey压测工具的详细介绍,请参见Hey
hey -z 30s -c 50   -host "autoscale-go.default.example.com"   "http://xxx.xx.xx.xxx?sleep=100&
    prime=10000&
    bloat=5"

预期输出:

结果和我们配置的一致,最多扩容出来了3个Pod,并且即使在无访问请求流量的情况下,保持了1个运行的Pod。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

算法Serverless测试技术Perl容器

若转载请注明出处: 使用ASM管理Knative服务(6):基于流量请求数实现服务自动扩缩容
本文地址: https://pptw.com/jishu/946.html
关于职场晋升,有这些步骤你都了解吗?(附完整指导图) 高德Go生态的服务稳定性建设|性能优化的实战总结(高德地图有哪些服务类型)

游客 回复需填写必要信息