Serverless
Alaya New为用户提供了运行自定义代码、管理数据及集成应用的能力,无需关注底层基础设施的运维与管理。该类云服务极大地简化了开发与部署流程,使开发者能够专注于核心业务逻辑,提升效率,降低运维复杂度。
用户只需提供一个标准的Kubernetes Manifests(清单),无需进行额外的安装与配置(除极少必要的依赖文件),即可高效部署GPU推理Serverless。在VKS(弹性容器集群)上使用标准的Kubernetes Manifests(清单)部署GPU推理实例时,内置高可用性,应用资源会根据流量自动扩缩容。缩容至零实例,意味着在空闲时不会消耗资源,不会计费,实现了推理态的GPU Serverless。
Alaya New Serverless借助Knative实现了基于Manifests(清单)的应用部署能力,如需了解更多关于Knative的信息,请访问Knative。
前提条件
用户已开通弹性容器集群,且集群可正常使用。如尚未开通,可参考开通弹性容器集群完成开通。
准备工作
-
下载Serverless依赖包,解压已下载压缩包,解压后的文件:
kourier.yaml
、serving-core-v1.17.0.yaml
、serving-crds.yaml
、knative-nginx.yaml
。 -
下载示例文件,该文件Manifests(清单)用于部署Serverless服务,然后解压至对应目录下。
提示上述文件仅作为示例,实际使用时请根据具体业务需求调整配置内容。
操作步骤
安装组件
-
运行如下所示的命令,连接弹性容器集群资源,用于后续组件及服务部署,更多信息请参考使用弹性容器集群。
export KUBECONFIG=[yourpath]
-
运行如下所示命令,在VKS(弹性容器集群)中应用
serving-crds.yaml
配置文件,该文件用于安装Knative所需的CRD。kubectl apply -f [serving-crds.yaml]
-
运行如下所示命令,在VKS(弹性容器集群)中应用
serving-core-v1.17.0.yaml
资源配置文件,该文件用于安装Knative所需的核心资源,然后运行kubectl get pod -n knative-serving
,确保核心资源Pod状态为Running
,例如下图绿色高亮所示。kubectl apply -f [serving-core-v1.17.0.yaml]
-
运行如下所示命令,在VKS(弹性容器集群)中应用
kourier
资源配置文件,该文件用于安装Knative所需的网络资源,然后运行下图高亮②、③命令,确保网关Pod状态为Running
且网关服务已运行。kubectl apply -f [kourier.yaml]
信息上图高亮②、③的命令为:
kubectl get pod -n [kourier-system]
kubectl get svc -n [kourier-system]提示上述依赖文件仅需在集群内部部署一次,即可在整个集群范围内生效。
-
运行如下所示命令,在VKS(弹性容器集群)中应用
knative-nginx
资源配置文件,该文件用户用于安装公网访问代理,然后运行kubectl get all -n knative-nginx
,查看公网代理状态为Running
,例如下图所示。kubectl apply -f [knative-nginx.yaml]
部署服务
上文提到通过Serverless部署服务时,用户只需提供一个标准的Kubernetes Manifests(清单),即可完成部署,下文以部署一个qwen7b
模型,并且通过参数配置实现自动扩缩容为例。
-
在终端工具运行如下所示的命令,在VKS(弹性容器集群)中应用
serverless.yaml
配置文件,部署模型服务,例如下图所示。kubectl apply -f [serverless.yaml]
提示配置文件中注解部分参数及对应说明可参见附录,您可根据实际业务需求调整/修改各参数。
-
运行如下所示命令,查看在VKS中Knative Service(ksvc)资源对象,确保服务已经成功部署并准备好对外提供访问能力。
kubectl get ksvc -n [knative-qwen7b]
-
(可选)运行如下所示的命令,查看VKS集群中Knative Service(ksvc)Pod情况,验证参数配置(
autoscaling.knative.dev/initial-scale: "1"
)是否生效,从图中可看出配置生效。kubectl get pod -n [knative-qwen7b]
-
(可选)等待一段时间,运行上步命令,查看Pod数量,由于配置文件中设置了
autoscaling.knative.dev/min-scale
,则如果没有调用一段时间后,pod数就缩减为0,如下图所示。
访问服务
服务部署完成后,可在集群内/集群外进行访问,详情如下所示。
- 集群内部访问
- 集群外部访问
-
运行如下所示的命令获取服务名称,使用
服务名称+namespace名称+服务路径
,即目标URL,例如下图高亮①所示。kubectl get svc -n [kourier-system]
-
运行如下所示的命令获取本地访问域名,例如下图高亮②所示。
kubectl get service.serving.knative.dev -n [knative-qwen7b]
-
获取上述信息后,运行
kubectl exec -it [pod name] -- bash
命令,进入集群内正在运行的Pod,例如下图高亮①所示;运行“查看服务状态脚本”,例如下图高亮②所示,查看服务运行情况,根据运行结果(下图绿色高亮所示),服务可以正常调用。查看服务状态脚本curl -X POST http://kourier-internal.kourier-system/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Host: knative-qwen7b-svc.knative-qwen7b.127.0.0.1.nip.io" \
-d '{
"model": "qwen7b",
"messages": [
{"role": "system", "content": "你是一个有用的助手."},
{"role": "user", "content": "怎么计算1+1."}
]
}'
-
运行如下所示的命令,查看部署的公网代理服务状态,确保服务状态为
Running
,例如下图高亮①所示。kubectl get all -n [knative-nginx]
-
运行如下所示的命令,获取公网服务的URL,例如下图高亮③所示,运行如下“查看服务状态脚本”,例如下图高亮④所示,查看服务运行情况,根据运行结果(下图绿色高亮所示),服务可以正常调用。
kubectl describe serviceexporter openresty-svc-se -n [knative-nginx]
查看服务状态脚本
curl -X POST https://openresty-svc-x-knative-nginx-x-vcrbcqty****.sproxy.hd-01.alayanew.com:22443/v1/chat/completions \
-H "Content-Type: application/json" \
-H "serverlessHost: knative-qwen7b-svc.knative-qwen7b.127.0.0.1.nip.io" \
-d '{
"model": "qwen7b",
"messages": [
{"role": "system", "content": "你是一个有用的助手."},
{"role": "user", "content": "怎么计算1+1."}
]
}'提示在参照本示例运行“查看服务状态脚本”时,请将公网服务的URL替换为私有的公网服务URL。
卸载knative
-
删除通过Knative部署的所有服务资源。运行以下命令以清理
your_deploy.yaml
中定义的服务。kubectl delete -f [your_deploy.yaml]
-
按照依赖顺序依次卸载已安装的Knative组件。运行以下命令删除相关资源配置文件。
kubectl delete -f [knative-nginx.yaml]
kubectl delete -f [kourier.yaml]
kubectl delete -f [serving-core-v1.17.0.yaml]
kubectl delete -f [serving-crds.yaml]
附录
在Knative中,自动扩缩容(Autoscaling)是通过一系列自定义资源和注解来控制的。配置文件中自动扩缩容的参数说明(部分)如下所示。
参数 | Yaml文件配置 | 全局配置 | 默认值 | 参数说明 |
---|---|---|---|---|
扩缩容实现类 | autoscaling.knative.dev/class | pod-autoscaler-class | kpa.autoscaling.knative.dev | 扩缩容实现类 |
度量标准 | autoscaling.knative.dev/metric | - | concurrency | 监控的度量指标,concurrency ,rps 等 |
维持百分比 | autoscaling.knative.dev/target-utilization-percentage | container-concurrency-target-percentage | 70 | 维持concurrency 或rps 的设置目标的百分比 |
目标并发请求数/每秒请求数 | autoscaling.knative.dev/target | container-concurrency-target-default /requests-per-second-target-default | 100 /200 | 根据配置生效* |
服务启动时,初始副本数 | utoscaling.knative.dev/initial-scale | initial-scale | 1 | 服务刚启动时的副本数 |
最小副本数 | autoscaling.knative.dev/min-scale | min-scale | 0 | 服务运行时的最小副本数 |
最大副本数 | autoscaling.knative.dev/max-scale | max-scale | 0 | 最大可扩展的副本数 |
缩容延迟时间 | autoscaling.knative.dev/scale-down-delay | scale-down-delay | 60 | 流量下降后多久开始缩容 |
缩容到0时,最后一个Pod的最小等待(保留)时间 | autoscaling.knative.dev/scale-to-zero-pod-retention-period | scale-to-zero-pod-retention-period | 0s | 控制Pod被保留多久的时间窗口 |
恐慌窗口时长百分比 | autoscaling.knative.dev/panic-window-percentage | panic-window-percentage | 10.0 | 控制恐慌窗口长度占稳定窗口长度的比例(%) |
进入恐慌阈值百分比 | autoscaling.knative.dev/panic-threshold-percentage | panic-threshold-percentage | 200.0 | 当实际负载达到目标容量的多少百分比时,触发恐慌模式 |
*:当metrics为rps,全局配置中requests-per-second-target-default
有效,默认值:200;当metrics为concurrency,全局配置中container-concurrency-target-default
有效,默认值:100。文件配置中均对应参数autoscaling.knative.dev/target
。
总结
Serverless为用户提供了一种高效、灵活的方法来部署和管理现代云原生应用,极大地简化了开发与部署流程,使开发者能够专注于核心业务逻辑,提升效率,降低运维复杂度。