使用KServe实现推理服务的金丝雀发布

使用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

  1. 执行以下命令,将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之间进行分配。

  2. 执行以下命令,查看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)。

  3. 执行以下命令,查看正在运行的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自定义资源来切换到新版本。

  1. 执行命令,删除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
    
  2. 执行以下命令,查看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的流量减少到零。

  1. 执行以下命令,将模型服务(修订版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
    
  2. 执行以下命令,查看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)。

  1. 执行以下命令,应用金丝雀模型(修订版2),并设置canaryTrafficPercent: 10serving.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
    
  2. 执行以下命令,查看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

  3. 执行以下命令,根据您想要访问的特定版本,将相应的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