使用KServe实现推理服务的金丝雀发布,可以更好地管理和控制推理服务的部署过程,减少潜在错误和故障对用户的影响,并确保推理服务的高可用性和稳定性。
功能介绍
KServe支持推理服务的金丝雀发布,它允许一个推理服务的新版本接收一部分流量。如果一个发布步骤失败,金丝雀发布策略还可以回滚到先前的修订版。
在KServe中,最后一次成功发布的修订版会接收100%的流量。canaryTrafficPercent
字段用于指定应该路由到新修订版的流量百分比。根据canaryTrafficPercent
的值,KServe会自动将流量分配给最后一次成功发布的修订版和当前正在发布的修订版。
当部署第一个修订版的推理服务时,它将接收100%的流量。当部署多个修订版时,例如步骤二,金丝雀发布策略配置为将10%的流量路由到新修订版(LatestReadyRevision),90%的流量继续流向之前的修订版(LatestRolledoutRevision)。如果某个修订版不健康或出现问题,流量将不会被路由到该修订版,以确保稳定性和可靠性。
前提条件
已部署推理服务,且可以正常运行。具体操作,请参见ASM集成云原生推理服务框架KServe。
步骤一:查看推理服务的流量分配
前提条件的推理服务部署成功后,可以看到100%流量指向服务修订版1的模型服务。
执行以下命令,查看sklearn-iris推理服务的相关信息。
kubectl get isvc -n kserve-test sklearn-iris
预期输出:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE
sklearn-iris http://sklearn-iris.kserve-test.example.com True 100 sklearn-iris-predictor-00001 79s
可以看到路由到LATEST
列下的InferenceService的流量比例为100。
步骤二:使用金丝雀部署策略更新InferenceService
执行以下命令,将
canaryTrafficPercent
字段添加到predictor
组件,并更新storageUri
来使用新的模型。kubectl apply -n kserve-test -f - <<EOF apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "sklearn-iris" spec: predictor: canaryTrafficPercent: 10 model: modelFormat: name: sklearn storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2" EOF
命令执行后,将更新
sklearn-iris
推理服务的配置。添加的canaryTrafficPercent
字段设置为10,表示将10%的流量分配给金丝雀模型(修订版2),而其余90%的流量将继续指向之前的模型(修订版1)。根据金丝雀发布的定义,流量将在最新就绪的修订版2和之前推出的修订版1之间进行分配。执行以下命令,查看sklearn-iris推理服务的相关信息。
kubectl get isvc -n kserve-test sklearn-iris
预期输出:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE sklearn-iris http://sklearn-iris.kserve-test.example.com True 90 10 sklearn-iris-predictor-00001 sklearn-iris-predictor-00002 11m
可以看到90%的流量指向了先前的模型服务(修订版1),而10%的流量指向了当前的模型服务(修订版2)。
执行以下命令,查看正在运行的Pod信息。
kubectl get pod -n kserve-test
预期输出:
NAME READY STATUS RESTARTS AGE sklearn-iris-predictor-00001-deployment-7965bcc66-grdbq 2/2 Running 0 12m sklearn-iris-predictor-00002-deployment-6744dbbd8c-wfghv 2/2 Running 0 86s
可以看到有两个Pod分别为旧模型和新模型运行,并且有10%的流量路由到新模型。
说明在Pod的名称中,修订版1的名称中包含
predictor-0001
,修订版2的名称中包含predictor-0002
。
步骤三:切换到新版本
如果金丝雀模型运行良好并通过了验证测试,您可以通过删除canaryTrafficPercent
字段并重新应用InferenceService自定义资源来切换到新版本。
执行命令,删除
canaryTrafficPercent
字段并重新应用InferenceService自定义资源来切换到新版本。kubectl apply -n kserve-test -f - <<EOF apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "sklearn-iris" spec: predictor: model: modelFormat: name: sklearn storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2" EOF
执行以下命令,查看sklearn-iris推理服务的相关信息。
kubectl get isvc -n kserve-test sklearn-iris
预期输出:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE sklearn-iris http://sklearn-iris.kserve-test.example.com True 100 sklearn-iris-predictor-00002 18m
可以看到所有流量都路由新模型的修订版2。
相关操作
回滚到旧版本
您可以通过将当前模型服务(修订版2)的canaryTrafficPercent
设为0来回滚到之前的模型服务(修订版1)。设置后,将从修订版2回滚到修订版1,并将修订版2的流量减少到零。
执行以下命令,将模型服务(修订版2)的流量设置为0%。
kubectl apply -n kserve-test -f - <<EOF apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "sklearn-iris" spec: predictor: canaryTrafficPercent: 0 model: modelFormat: name: sklearn storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2" EOF
执行以下命令,查看sklearn-iris推理服务的相关信息。
kubectl get isvc -n kserve-test sklearn-iris
预期输出:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE sklearn-iris http://sklearn-iris.kserve-test.example.com True 100 0 sklearn-iris-predictor-00001 sklearn-iris-predictor-00002 22m
可以看到100%流量流向之前的模型服务(修订版1)。
使用注解路由流量
您可以通过添加注解serving.kserve.io/enable-tag-routing
来启用基于标签的路由,通过请求URL中的标签明确地将流量路由到金丝雀模型(修订版2)或旧模型(修订版1)。
执行以下命令,应用金丝雀模型(修订版2),并设置
canaryTrafficPercent: 10
和serving.kserve.io/enable-tag-routing: "true"
。kubectl apply -n kserve-test -f - <<EOF apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "sklearn-iris" annotations: serving.kserve.io/enable-tag-routing: "true" spec: predictor: canaryTrafficPercent: 10 model: modelFormat: name: sklearn storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2" EOF
执行以下命令,查看InferenceService的状态。
kubectl get isvc -n kserve-test sklearn-iris -oyaml .... status: address: url: http://sklearn-iris.kserve-test.svc.cluster.local components: predictor: address: url: http://sklearn-iris-predictor.kserve-test.svc.cluster.local latestCreatedRevision: sklearn-iris-predictor-00003 latestReadyRevision: sklearn-iris-predictor-00003 latestRolledoutRevision: sklearn-iris-predictor-00001 previousRolledoutRevision: sklearn-iris-predictor-00001 traffic: - latestRevision: true percent: 10 revisionName: sklearn-iris-predictor-00003 tag: latest url: http://latest-sklearn-iris-predictor.kserve-test.example.com - latestRevision: false percent: 90 revisionName: sklearn-iris-predictor-00001 tag: prev url: http://prev-sklearn-iris-predictor.kserve-test.example.com url: http://sklearn-iris-predictor.kserve-test.example.com ....
可以看到有两个URL,分别是金丝雀版本和之前旧版本的模型服务URL。通过在URL中添加
latest-
或prev-
来区分。金丝雀版本的URL是
http://latest-sklearn-iris-predictor.kserve-test.example.com
,旧版本的URL是
http://prev-sklearn-iris-predictor.kserve-test.example.com
。执行以下命令,根据您想要访问的特定版本,将相应的URL添加到请求中,调用InferenceService的服务并获取预测结果。
命令中,
${INGRESS_HOST}
和${INGRESS_PORT}
表示入口网关的主机和端口,latest-sklearn-iris-predictor.kserve-test.example.com
表示访问的模型服务的URL。您可以根据实际情况进行相应的替换和调整。curl -v -H "Host: latest-sklearn-iris-predictor.kserve-test.example.com" http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/sklearn-iris:predict -d @./iris-input.json