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:カナリアリリースポリシーを構成して、推論サービスの構成を更新する
次のコマンドを実行して、
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)にルーティングされていることを示しています。
次のコマンドを実行して、実行中のポッドに関する情報を表示します。
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
フィールドを削除し、推論サービスのカスタムリソースを再適用することで、新しいリビジョンに切り替えることができます。
次のコマンドを実行して、
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
次のコマンドを実行して、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 に変更されます。
次のコマンドを実行して、推論サービス(リビジョン 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
を true に設定することでタグベースのルーティングを有効にし、リクエスト URL のタグを使用して新しい推論サービス(リビジョン 2)または古い推論サービス(リビジョン 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
次のコマンドを実行して、推論サービスのステータスを表示します。
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
です。次のコマンドを実行して、アクセスする特定のリビジョンに基づいて対応する 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