在微服务架构的业务场景下,推荐您使用MSE网关实现Knative服务的流量分发和路由。MSE网关是一款全托管免运维的网关,支持实现基于请求的精准自动弹性,即精准地控制单个Pod的请求并发处理数,能够满足大规模云原生分布式应用的流量治理诉求。
前提条件
已在集群中部署Knative,请参见部署Knative。
已安装MSE Ingress Controller组件,并为MSE Ingress Controller组件完成授权,请参见授予MSE Ingress Controller访问权限。
实现原理
在实际业务场景中,单个Pod处理请求的吞吐率有限,如果多个请求同时转发到同一个Pod,会导致服务端过载异常。因此,您可能需要精准地控制单个Pod的请求并发处理数。例如,在AIGC场景下,由于单个请求会占用较多的GPU资源,您需要对每个Pod的并发处理请求数进行严格的限制。结合MSE网关,Knative可以实现基于请求的精准自动弹性,以满足大规模云原生分布式应用的流量治理诉求。
如下图所示,弹性插件MPA会从MSE网关获取并发数,并计算所需要的Pod数进行扩缩容,实现了基于实际请求负载的自动弹性。同时,MSE网关可以根据路由规则和条件,实现基于请求的精准转发,以满足不同服务和版本的路由需求。
步骤一:部署MSE网关
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页签,单击一键部署Knative,选择MSE服务网关,然后按照页面指引完成Knative的部署。
步骤二:通过MSE网关访问部署的服务
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在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"
若目标服务的状态列显示成功,表明服务已部署成功。
在服务管理页面的默认域名和访问网关列,分别获取
helloworld-go
服务的域名和网关地址。执行以下命令,访问
helloworld-go
服务。curl -H "host: helloworld-go.default.example.com" http://8.141.XX.XX # 网关IP和域名请以您的实际数据为准。
预期输出:
Hello Knative!
步骤三:基于并发数实现自动弹性
安装Hey压测工具。
关于Hey压测工具的详细信息,请参见Hey。
执行以下命令,对服务执行压测。
# 发送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%。
执行如下命令,实时观察Pod的扩缩容情况。
说明这个命令会持续运行,直到您手动停止它。如果您只想观察一段时间,可以按
Ctrl + C
组合键来终止命令的运行。kubectl get pods --watch
(可选)步骤四:查看服务监控数据
Knative提供开箱即用的可观测能力,在Knative页面,单击监控大盘页签,即可查看目标Knative服务的监控数据情况。如何开启Knative监控大盘,请参见查看Knative服务监控大盘。
相关文档
您可以为Knative服务启用自定义域名,请参见使用自定义域名。
您可以为Knative服务配置HTTPS证书访问,请参见配置HTTPS证书访问。
您可以在Knative中部署gRPC服务,提升网络效率,请参见在Knative中部署gRPC服务。
您可以配置探针(Probe),监测Knative服务的健康状态和可用性,请参见在Knative中配置端口探测。
如果您的ECI实例有连接公网的需求,您需要绑定EIP,请参见为ECI绑定EIP实现公网访问。