在Knative中使用MSE网关并实现自动弹性

在微服务架构的业务场景下,推荐您使用MSE网关实现Knative服务的流量分发和路由。MSE网关是一款全托管免运维的网关,支持实现基于请求的精准自动弹性,即精准地控制单个Pod的请求并发处理数,能够满足大规模云原生分布式应用的流量治理诉求。

前提条件

实现原理

在实际业务场景中,单个Pod处理请求的吞吐率有限,如果多个请求同时转发到同一个Pod,会导致服务端过载异常。因此,您可能需要精准地控制单个Pod的请求并发处理数。例如,在AIGC场景下,由于单个请求会占用较多的GPU资源,您需要对每个Pod的并发处理请求数进行严格的限制。结合MSE网关,Knative可以实现基于请求的精准自动弹性,以满足大规模云原生分布式应用的流量治理诉求。

如下图所示,弹性插件MPA会从MSE网关获取并发数,并计算所需要的Pod数进行扩缩容,实现了基于实际请求负载的自动弹性。同时,MSE网关可以根据路由规则和条件,实现基于请求的精准转发,以满足不同服务和版本的路由需求。

image.png

步骤一:部署MSE网关

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. 组件管理页签,单击一键部署Knative,选择MSE服务网关,然后按照页面指引完成Knative的部署。

步骤二:通过MSE网关访问部署的服务

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. Knative页面的服务管理页签下,选择命名空间default,然后单击使用模板创建,将以下YAML示例粘贴至模板,最后单击创建

    创建一个名为helloworld-go的服务。

    重要

    请将下方代码中的{REGION-ID}替换为您集群所在地域,以确保可以正确地访问和使用镜像。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: mpa.autoscaling.knative.dev # 表明使用MSE指标进行扩缩容,支持缩容到0。
            autoscaling.knative.dev/max-scale: '20' # 扩容Pod数上限是20。
        spec:
          containerConcurrency: 5 # 1个Pod能处理的最大并发数是5。
          containers:
          - image: registry-vpc.{REGION-ID}.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 # {REGION-ID}为对应集群所在的地域,如cn-hangzhou。
            env:
            - name: TARGET
              value: "Knative"

    若目标服务的状态列显示成功,表明服务已部署成功。

  4. 服务管理页面的默认域名访问网关列,分别获取helloworld-go服务的域名和网关地址。

  5. 执行以下命令,访问helloworld-go服务。

    curl -H "host: helloworld-go.default.example.com" http://8.141.XX.XX # 网关IP和域名请以您的实际数据为准。

    预期输出:

    Hello Knative!

步骤三:基于并发数实现自动弹性

  1. 安装Hey压测工具。

    关于Hey压测工具的详细信息,请参见Hey

  2. 执行以下命令,对服务执行压测。

    # 发送100000个请求,并发数为50,请求超时时间为180秒。
    hey -n 100000 -c 50 -t 180 -host "helloworld-go.default.example.com" "http://8.141.XX.XX"

    预期输出:

    Summary:
      Total:        86.0126 secs
      Slowest:      0.1672 secs
      Fastest:      0.0276 secs
      Average:      0.0337 secs
      Requests/sec: 1162.6199
      
      Total data:   1500000 bytes
      Size/request: 15 bytes
    
    Response time histogram:
      0.028 [1]     |
      0.042 [95291] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.056 [4573]  |■■
      0.069 [64]    |
      0.083 [19]    |
      0.097 [2]     |
      0.111 [0]     |
      0.125 [0]     |
      0.139 [18]    |
      0.153 [23]    |
      0.167 [9]     |
    
    
    Latency distribution:
      10% in 0.0294 secs
      25% in 0.0305 secs
      50% in 0.0327 secs
      75% in 0.0367 secs
      90% in 0.0386 secs
      95% in 0.0405 secs
      99% in 0.0433 secs
    
    Details (average, fastest, slowest):
      DNS+dialup:   0.0000 secs, 0.0276 secs, 0.1672 secs
      DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0000 secs
      req write:    0.0000 secs, 0.0000 secs, 0.0009 secs
      resp wait:    0.0336 secs, 0.0276 secs, 0.1671 secs
      resp read:    0.0000 secs, 0.0000 secs, 0.0009 secs
    
    Status code distribution:
      [200] 100000 responses

    输出结果表明,持续发送了100000个请求,请求成功率为100%。

  3. 执行如下命令,实时观察Pod的扩缩容情况。

    说明

    这个命令会持续运行,直到您手动停止它。如果您只想观察一段时间,可以按Ctrl + C组合键来终止命令的运行。

    kubectl get pods --watch

    image.png

(可选)步骤四:查看服务监控数据

Knative提供开箱即用的可观测能力,在Knative页面,单击监控大盘页签,即可查看目标Knative服务的监控数据情况。如何开启Knative监控大盘,请参见查看Knative服务监控大盘

相关文档