すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:KServe を使用して推論サービスのカナリアリリースを実装する

最終更新日:Jan 13, 2025

KServe を使用して推論サービスのカナリアリリースを実装すると、推論サービスのデプロイをより適切に管理し、潜在的なエラーや障害がユーザーに及ぼす影響を軽減し、推論サービスの高可用性と安定性を保証できます。

機能の説明

KServe は、推論サービスのカナリアリリースをサポートしており、推論サービスの新しいバージョンがトラフィックの一部を受信できます。 リリースステップが失敗した場合、カナリアリリースポリシーはサービスを以前のバージョンにロールバックすることもできます。

KServe では、最後に準備ができたリビジョンがトラフィックの 100% を受信します。 canaryTrafficPercent フィールドは、新しいリビジョンにルーティングされるトラフィックの割合を指定します。 canaryTrafficPercent フィールドの値に基づいて、KServe は最後に準備ができたリビジョンとリリースされているリビジョンにトラフィックを自動的に分散します。

推論サービスの最初のリビジョンがデプロイされると、トラフィックの 100% を受信します。 手順 2 のように複数のリビジョンがデプロイされている場合、カナリアリリースポリシーを構成して、トラフィックの 10% を新しいリビジョン(LatestReadyRevision)に、トラフィックの 90% を以前のリビジョン(LatestRolledoutRevision)にルーティングできます。 リビジョンが異常または欠陥がある場合、安定性と信頼性を確保するために、トラフィックはそのリビジョンにルーティングされません。

前提条件

推論サービスがデプロイされており、正常に実行できます。 詳細については、「クラウドネイティブ推論サービス KServe を ASM と統合する」をご参照ください。

手順 1:推論サービスのトラフィック分散を表示する

前提条件 で述べた推論サービスがデプロイされると、トラフィックの 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 列の推論サービスにルーティングされるトラフィックの割合は 100% です。

手順 2:カナリアリリースポリシーを構成して、推論サービスの構成を更新する

  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. 次のコマンドを実行して、実行中のポッドに関する情報を表示します。

    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

    出力は、古い推論サービスと新しい推論サービスそれぞれに対して 2 つのポッドが実行されており、トラフィックの 10% が新しい推論サービスにルーティングされていることを示しています。

    説明

    リビジョン 1 のポッドの名前には predictor-00001 が含まれ、リビジョン 2 のポッドの名前には predictor-00002 が含まれます。

手順 3:新しいリビジョンに切り替える

新しい推論サービスが正常に動作し、検証テストに合格した場合は、canaryTrafficPercent フィールドを削除し、推論サービスのカスタムリソースを再適用することで、新しいリビジョンに切り替えることができます。

  1. 次のコマンドを実行して、canaryTrafficPercent フィールドを削除し、推論サービスのカスタムリソースを再適用して、新しいリビジョンに切り替えます。

    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 にルーティングされるトラフィックの割合は 0 に変更されます。

  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 を true に設定することでタグベースのルーティングを有効にし、リクエスト URL のタグを使用して新しい推論サービス(リビジョン 2)または古い推論サービス(リビジョン 1)にトラフィックを明示的にルーティングできます。

  1. canaryTrafficPercent を 10 に、serving.kserve.io/enable-tag-routing を true に設定して、新しいリビジョン(リビジョン 2)の推論サービスを適用します。

    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. 次のコマンドを実行して、推論サービスのステータスを表示します。

    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
     
     ....

    出力には 2 つの URL が含まれています。 1 つは新しい推論サービスの URL で、もう 1 つは古い推論サービスの 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 をリクエストに追加し、推論サービスを呼び出して、結果を取得します。

    次のコマンドでは、${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