Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions testdata/controllers/blue-green-mm/bumpweights.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
echo "kubectl annotate --overwrite isvc wisdom-primary-weight iter8.tools/weight='20'"
echo "kubectl annotate --overwrite isvc wisdom-candidate-weight iter8.tools/weight='80'"
kubectl annotate --overwrite cm wisdom-primary-weight iter8.tools/weight='20'
kubectl annotate --overwrite cm wisdom-candidate-weight iter8.tools/weight='80'
10 changes: 10 additions & 0 deletions testdata/controllers/blue-green-mm/cleanup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/bin/sh
# Cleanup application
kubectl -n modelmesh-serving delete isvc/wisdom-primary cm/wisdom-primary-weight
kubectl -n modelmesh-serving delete isvc/wisdom-candidate cm/wisdom-candidate-weight
# Cleanup routemap(s)
kubectl delete cm/wisdom
# Cleanup networking
kubectl delete svc/wisdom gateway/wisdom-gateway virtualservice/wisdom
# Cleanup sleep utility
kubectl delete deploy/sleep cm/wisdom-input
6 changes: 6 additions & 0 deletions testdata/controllers/blue-green-mm/execintosleep.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/sh
# First, get $SLEEP_POD
SLEEP_POD=$(kubectl get pod --sort-by={metadata.creationTimestamp} -l app=sleep -o jsonpath={.items..metadata.name} | rev | cut -d' ' -f 1 | rev)
# Second, exec into it
kubectl exec --stdin --tty "${SLEEP_POD}" -c sleep -- /bin/sh
# Third, cd wisdom && source query.sh in order to query wisdom
150 changes: 150 additions & 0 deletions testdata/controllers/blue-green-mm/initialize.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: wisdom
spec:
externalName: istio-ingressgateway.istio-system.svc.cluster.local
sessionAffinity: None
type: ExternalName
---
# use mesh gateway instead of this
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: wisdom-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- wisdom.modelmesh-serving
- wisdom.modelmesh-serving.svc
- wisdom.modelmesh-serving.svc.cluster.local
---
# Model component 1 - inferenceservice
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: wisdom-primary
namespace: modelmesh-serving
labels:
app.kubernetes.io/name: wisdom
app.kubernetes.io/version: v1
iter8.tools/watch: "true"
annotations:
serving.kserve.io/deploymentMode: ModelMesh
serving.kserve.io/secretKey: localMinIO
spec:
predictor:
model:
modelFormat:
name: sklearn
storageUri: s3://modelmesh-example-models/sklearn/mnist-svm.joblib
---
# Model component 2 - configmap to be used to configure weights at runtime
apiVersion: v1
kind: ConfigMap
metadata:
name: wisdom-primary-weight
labels:
iter8.tools/watch: "true"
---
# Set up default routing (ie, to primary)
# The Iter8 traffic controller could do this, but don't rely on it
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: wisdom
spec:
gateways:
- wisdom-gateway
hosts:
- wisdom.modelmesh-serving
- wisdom.modelmesh-serving.svc
- wisdom.modelmesh-serving.svc.cluster.local
http:
- route:
- destination:
host: modelmesh-serving.modelmesh-serving.svc.cluster.local
port:
number: 8033
headers:
request:
set:
mm-vmodel-id: "wisdom-primary"
---
# Create routemap for blue-green use case
apiVersion: v1
kind: ConfigMap
metadata:
name: wisdom
labels:
app.kubernetes.io/managed-by: iter8
iter8.tools/kind: routemap
iter8.tools/version: v0.14
data:
strSpec: |
variants:
- weight: 60
resources:
- gvrShort: cm
name: wisdom-primary-weight
namespace: modelmesh-serving
- gvrShort: isvc
name: wisdom-primary
namespace: modelmesh-serving
- weight: 40
resources:
- gvrShort: cm
name: wisdom-candidate-weight
namespace: modelmesh-serving
- gvrShort: isvc
name: wisdom-candidate
namespace: modelmesh-serving
# routing templates
routingTemplates:
blue-green-wisdom:
gvrShort: vs
template: |
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: wisdom
spec:
gateways:
- wisdom-gateway
hosts:
- wisdom.modelmesh-serving
- wisdom.modelmesh-serving.svc
- wisdom.modelmesh-serving.svc.cluster.local
http:
- route:
- destination:
host: modelmesh-serving.modelmesh-serving.svc.cluster.local
port:
number: 8033
{{- if gt (index .Weights 1) 0 }}
weight: {{ index .Weights 0 }}
{{- end }}
headers:
request:
set:
mm-vmodel-id: "wisdom-primary"
{{- if gt (index .Weights 1) 0 }}
- destination:
host: modelmesh-serving.modelmesh-serving.svc.cluster.local
port:
number: 8033
weight: {{ index .Weights 1 }}
headers:
request:
set:
mm-vmodel-id: "wisdom-candidate"
{{- end }}
immutable: true
EOF
31 changes: 31 additions & 0 deletions testdata/controllers/blue-green-mm/promote-v2.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/bin/sh
# replace primary with new version
cat <<EOF | kubectl replace -f -
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: wisdom-primary
namespace: modelmesh-serving
labels:
app.kubernetes.io/name: wisdom
app.kubernetes.io/version: v2
iter8.tools/watch: "true"
annotations:
serving.kserve.io/deploymentMode: ModelMesh
serving.kserve.io/secretKey: localMinIO
spec:
predictor:
model:
modelFormat:
name: sklearn
storageUri: s3://modelmesh-example-models/sklearn/mnist-svm.joblib
---
apiVersion: v1
kind: ConfigMap
metadata:
name: wisdom-primary-weight
labels:
iter8.tools/watch: "true"
EOF
# delete candidate
kubectl delete isvc/wisdom-candidate cm/wisdom-candidate-weight
Loading