diff --git a/helm-charts/seldon-deploy/Chart.yaml b/helm-charts/seldon-deploy/Chart.yaml index 36e794b..f3ebcd0 100644 --- a/helm-charts/seldon-deploy/Chart.yaml +++ b/helm-charts/seldon-deploy/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "2.1.1" +appVersion: "2.2.0-rc2" description: A Helm chart for Kubernetes name: seldon-deploy -version: 2.1.1 +version: 2.2.0-rc2 diff --git a/helm-charts/seldon-deploy/templates/configmap-seldon-deploy-feature-flags.yaml b/helm-charts/seldon-deploy/templates/configmap-seldon-deploy-feature-flags.yaml index 9cfe29e..a2bae45 100644 --- a/helm-charts/seldon-deploy/templates/configmap-seldon-deploy-feature-flags.yaml +++ b/helm-charts/seldon-deploy/templates/configmap-seldon-deploy-feature-flags.yaml @@ -9,6 +9,7 @@ data: { "ID": "USER_MANAGEMENT_ENABLED", "Value": "true" }, { "ID": "SELDON_DEPLOYMENTS_ENABLED", "Value": "{{ .Values.seldon.enabled }}" }, { "ID": "KNATIVE_SERVICES_ENABLED", "Value": "{{ .Values.seldon.knativeEnabled }}" }, - { "ID": "SELDON_PIPELINES_ENABLED", "Value": "{{ .Values.seldonCoreV2.enabled }}" } + { "ID": "SELDON_PIPELINES_ENABLED", "Value": "{{ .Values.seldonCoreV2.enabled }}" }, + { "ID": "INFERENCE_LOGS_SERVICE_ENABLED", "Value": "{{ .Values.inferenceLogs.enabled }}" } ] {{- end -}} \ No newline at end of file diff --git a/helm-charts/seldon-deploy/templates/configmap_seldon-deploy.yaml b/helm-charts/seldon-deploy/templates/configmap_seldon-deploy.yaml index f857d4d..4dacaa6 100644 --- a/helm-charts/seldon-deploy/templates/configmap_seldon-deploy.yaml +++ b/helm-charts/seldon-deploy/templates/configmap_seldon-deploy.yaml @@ -20,6 +20,7 @@ data: ingressNamespace: {{ .Values.ingressGateway.ingressNamespace }} seldonCurlForm: {{ .Values.seldon.curlForm | quote }} seldonTensorflowCurlForm: {{ .Values.seldon.tensorFlowCurlForm | quote }} + seldonV2CurlForm: {{ .Values.seldon.v2CurlForm | quote }} seldonRequestForm: {{ .Values.seldon.seldonRequestForm | quote }} seldonTensorflowRequestForm: {{ .Values.seldon.tensorflowRequestForm | quote }} seldonV2RequestForm: {{ .Values.seldon.v2RequestForm | quote }} diff --git a/helm-charts/seldon-deploy/templates/deployment.yaml b/helm-charts/seldon-deploy/templates/deployment.yaml index 4049e95..62654a9 100644 --- a/helm-charts/seldon-deploy/templates/deployment.yaml +++ b/helm-charts/seldon-deploy/templates/deployment.yaml @@ -73,6 +73,14 @@ spec: value: "{{ .Values.batchjobs.storageInitializer.image }}" - name: "BATCHJOBS_PVC_DEFAULT_SIZE" value: "{{ .Values.batchjobs.pvc.defaultSize }}" + - name: "BATCHJOBS_REQUESTS_CPU" + value: "{{ .Values.batchjobs.resources.requests.cpu }}" + - name: "BATCHJOBS_LIMITS_CPU" + value: "{{ .Values.batchjobs.resources.limits.cpu }}" + - name: "BATCHJOBS_REQUESTS_MEMORY" + value: "{{ .Values.batchjobs.resources.requests.memory }}" + - name: "BATCHJOBS_LIMITS_MEMORY" + value: "{{ .Values.batchjobs.resources.limits.memory }}" - name: "WORKFLOW_SECURITY_CONTEXT_RUN_AS_USER" value: "{{ .Values.workflow.securityContext.runAsUser }}" - name: "WORKFLOW_SECURITY_CONTEXT_FS_GROUP" @@ -331,6 +339,10 @@ spec: - name: "APP_LOGS_ELASTIC_POD_NAME_FIELD" value: "{{ .Values.applicationLogs.elasticPodNameField }}" {{- end}} + {{- if .Values.inferenceLogs.maxPayloadsPerRequest }} + - name: "INFERENCE_LOGS_MAX_PAYLOADS_PER_REQUEST" + value: "{{ .Values.inferenceLogs.maxPayloadsPerRequest }}" + {{- end}} livenessProbe: httpGet: path: /seldon-deploy/api/status diff --git a/helm-charts/seldon-deploy/templates/request-logger.yaml b/helm-charts/seldon-deploy/templates/request-logger.yaml index 2f3238b..5b356e8 100644 --- a/helm-charts/seldon-deploy/templates/request-logger.yaml +++ b/helm-charts/seldon-deploy/templates/request-logger.yaml @@ -122,10 +122,12 @@ spec: - name: METRONOME_SERVER_KAFKA_CONSUMER_SECURITY_PROTOCOL value: {{ .Values.requestLogger.kafka_consumer.protocol | quote }} {{- if (eq .Values.requestLogger.kafka_consumer.protocol "SSL") }} +{{- if .Values.requestLogger.kafka_consumer.ssl.client.secret }} - name: METRONOME_SERVER_KAFKA_CONSUMER_SSL_KEY_LOCATION value: {{ .Values.requestLogger.kafka_consumer.ssl.client.keyPath | quote }} - name: METRONOME_SERVER_KAFKA_CONSUMER_SSL_CERTIFICATE_LOCATION value: {{ .Values.requestLogger.kafka_consumer.ssl.client.crtPath | quote }} +{{- end }} {{- if .Values.requestLogger.kafka_consumer.ssl.client.brokerValidationSecret }} - name: METRONOME_SERVER_KAFKA_CONSUMER_SSL_CA_LOCATION value: {{ .Values.requestLogger.kafka_consumer.ssl.client.brokerCaPath | quote }} @@ -137,14 +139,47 @@ spec: {{- if (eq .Values.requestLogger.kafka_consumer.protocol "SASL_SSL") }} - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_MECHANISM value: {{ .Values.requestLogger.kafka_consumer.sasl.mechanism | quote }} +{{- if (eq .Values.requestLogger.kafka_consumer.sasl.mechanism "OAUTHBEARER") }} + - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_OAUTHBEARER_METHOD + valueFrom: + secretKeyRef: + name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote }} + key: method + - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_OAUTHBEARER_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote }} + key: "client_id" + - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_OAUTHBEARER_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote }} + key: "client_secret" + - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_OAUTHBEARER_TOKEN_ENDPOINT_URL + valueFrom: + secretKeyRef: + name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote }} + key: "token_endpoint_url" + - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_OAUTHBEARER_EXTENSIONS + valueFrom: + secretKeyRef: + name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote }} + key: "extensions" + - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_OAUTHBEARER_SCOPE + valueFrom: + secretKeyRef: + name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote }} + key: "scope" +{{- else }} - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_USERNAME value: {{ .Values.requestLogger.kafka_consumer.sasl.client.username | quote }} {{- if .Values.requestLogger.kafka_consumer.sasl.client.secret }} - name: METRONOME_SERVER_KAFKA_CONSUMER_SASL_PASSWORD valueFrom: secretKeyRef: - name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote}} - key: {{ base .Values.requestLogger.kafka_consumer.sasl.client.passwordPath | quote}} + name: {{ .Values.requestLogger.kafka_consumer.sasl.client.secret | quote }} + key: {{ base .Values.requestLogger.kafka_consumer.sasl.client.passwordPath | quote }} +{{- end }} {{- end }} {{- if .Values.requestLogger.kafka_consumer.ssl.client.brokerValidationSecret }} - name: METRONOME_SERVER_KAFKA_CONSUMER_SSL_CA_LOCATION diff --git a/helm-charts/seldon-deploy/values.yaml b/helm-charts/seldon-deploy/values.yaml index f58010f..d395ad5 100644 --- a/helm-charts/seldon-deploy/values.yaml +++ b/helm-charts/seldon-deploy/values.yaml @@ -19,7 +19,7 @@ loadtest: image: seldonio/hey-loadtester:0.2 alibidetect: - image: seldonio/alibi-detect-server:1.15.0 + image: seldonio/alibi-detect-server:1.17.1 nameOverride: "" fullnameOverride: "" @@ -42,6 +42,10 @@ enableAppAnalytics: true env: USERID_CLAIM_KEY: "preferred_username" # claim to be used as userid (defaults to "preferred_username") + SA_ID_CLAIM_KEY: "preferred_username" # claim to be used as userid for service accounts (defaults to "preferred_username") + USERNAME_CLAIM_KEY: "name" # claim to be used as username (defaults to "name") + EMAIL_CLAIM_KEY: "email" # claim to be used as user email (defaults to "email") + GROUPS_CLAIM_KEY: "groups" # claim to be used as user groups (defaults to "groups") OIDC_PROVIDER: "" # oidc issuerURL CLIENT_ID: "deploy-server" # oidc client ID CLIENT_SECRET: "deploy-secret" # oidc client secret @@ -112,13 +116,19 @@ workflow: batchjobs: processor: - image: seldonio/seldon-core-s2i-python37:1.16.0 + image: seldonio/seldon-core-s2i-python37:1.17.1 processorV2: - image: seldonio/mlserver:1.3.1-slim + image: seldonio/mlserver:1.4.0.rc5-slim storageInitializer: - image: seldonio/rclone-storage-initializer:1.16.0 + image: seldonio/rclone-storage-initializer:1.17.1 pvc: defaultSize: 1Gi + resources: + limits: + memory: 200Mi + requests: + cpu: 200m + memory: 200Mi seldon: protocol: "http" @@ -132,6 +142,9 @@ seldon: tensorFlowCurlForm: | CLUSTER_IP=$(kubectl -n {{ .IngressNamespace }} get service {{ .IngressServiceName }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl -k -H "{{ .TokenHeader }}: {{ .Token }} " -H "Content-Type: application/json" {{ .SeldonProtocol }}://$CLUSTER_IP/seldon/{{ .Namespace }}/{{ .ModelName }}/v1/models/:predict -d '{{ .Payload }}' + v2CurlForm: | + CLUSTER_IP=$(kubectl -n {{ .IngressNamespace }} get service {{ .IngressServiceName }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+ curl -k -H "{{ .TokenHeader }}: {{ .Token }} " -H "Content-Type: application/json" {{ .SeldonProtocol }}://$CLUSTER_IP/seldon/{{ .Namespace }}/{{ .ModelName }}/v2/models/{{ .GraphModelName }}/infer -d '{{ .Payload }}' #Forms for cluster-internal calls. #e.g. could be changed to skip ingress by setting to "http://{{ .ModelName }}-{{ .ModelName }}-{{ .Predictor }}.{{ .Namespace }}:8000/api/v0.1/predictions" seldonRequestForm: "{{ .SeldonProtocol }}://{{ .IngressServiceName }}/seldon/{{ .Namespace }}/{{ .ModelName }}/api/v0.1/predictions" @@ -147,10 +160,11 @@ seldonCoreV2: enabled: false curlForm: | CLUSTER_IP=$(kubectl -n {{ .IngressNamespace }} get service {{ .IngressServiceName }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
- curl -v {{ .SeldonProtocol }}://$CLUSTER_IP/v2/models/{{ .ModelName }}/infer -H "Content-Type: application/json" -H "seldon-model: {{ .ModelName }}.pipeline" -d '{{ .Payload }}' + curl -v {{ .SeldonProtocol }}://$CLUSTER_IP/v2/models/{{ .ModelName }}/infer -H "Content-Type: application/json" -H "seldon-model: {{ .ModelName }}.pipeline" -H "Host: {{ .Namespace }}.inference.seldon" -d '{{ .Payload }}' requestForm: "{{ .SeldonProtocol }}://seldon-mesh.{{ .Namespace }}.svc.cluster.local/v2/pipelines/{{ .ModelName }}/infer" explainForm: "{{ .SeldonProtocol }}://seldon-mesh.{{ .Namespace }}.svc.cluster.local/v2/models/{{ .GraphModelName }}/infer" + external: protocol: "http" @@ -226,7 +240,7 @@ elasticsearch: #detectors are created in the namespace requestLogger.namespace.name so rbac is created there requestLogger: create: true - image: seldonio/metronome:1.5.1 + image: seldonio/metronome:1.6.0 #increase logger replicas if there are high traffic volumes replicas: 1 imagePullPolicy: IfNotPresent @@ -263,9 +277,8 @@ requestLogger: brokerValidationSecret: brokerCaPath: /tmp/certs/kafka/broker/ca.crt endpointIdentificationAlgorithm: - - # env: - # MAX_PAYLOAD_BYTES: "300000" + env: + MAX_PAYLOAD_BYTES: "300000" deployHost: "http://seldon-deploy.seldon-system/seldon-deploy/api/v1alpha1" authSecret: "" trigger: @@ -328,3 +341,7 @@ keycloakUserManagement: userRealm: "deploy-realm" debug: "true" tls_insecure: "false" + +inferenceLogs: + enabled: true + maxPayloadsPerRequest: 100 \ No newline at end of file