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