diff --git a/deploy/helm/.helmignore b/deploy/helm/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/deploy/helm/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deploy/helm/Chart.yaml b/deploy/helm/Chart.yaml new file mode 100644 index 0000000000..4d101ac2f1 --- /dev/null +++ b/deploy/helm/Chart.yaml @@ -0,0 +1,16 @@ +apiVersion: v2 +name: evidently-ui +description: A Helm chart for Evidently AI's UI +type: application +version: 0.1.0 +appVersion: "0.7.20" +keywords: + - evidently + - mlops + - monitoring + - data-quality + - data-drift +home: https://evidentlyai.com +sources: + - https://github.com/evidentlyai/evidently +maintainers: [] diff --git a/deploy/helm/templates/NOTES.txt b/deploy/helm/templates/NOTES.txt new file mode 100644 index 0000000000..fdcccb3aa1 --- /dev/null +++ b/deploy/helm/templates/NOTES.txt @@ -0,0 +1,39 @@ +Evidently UI has been deployed. + +{{- if .Values.ingress.enabled }} + {{- range .Values.ingress.hosts }} + URL: http{{ if $.Values.ingress.tls }}s{{ end }}://{{ .host }} + {{- end }} +{{- else if and .Values.httpRoute.enabled .Values.httpRoute.parentRefs }} + {{- if .Values.httpRoute.hostnames }} + URL: https://{{ index .Values.httpRoute.hostnames 0 }} + {{- else }} + URL: set via your Gateway / virtual host + {{- end }} +{{- else }} + kubectl port-forward svc/{{ include "evidently-ui.fullname" . }} 8000:{{ .Values.service.port }} + Then open http://localhost:8000 +{{- end }} + +{{- if .Values.s3.enabled }} + +S3 workspace: s3://{{ .Values.s3.bucketName }}/{{ .Values.s3.path }} +Endpoint: {{ .Values.s3.endpointUrl }} + +To use S3 you must provide credentials in one of these ways: + 1. Install with inline creds: + helm upgrade --install evidently-ui . --set s3.accessKey="YOUR_ACCESS_KEY" --set s3.secretKey="YOUR_SECRET_KEY" + 2. Use an existing Secret (e.g. from Vault or external-secrets): set in values + s3.existingSecret: + name: "your-s3-secret" + accessKeyKey: "access-key" # optional, default: access-key + secretKeyKey: "secret-key" # optional, default: secret-key + 3. Create a secret, then install with existingSecret: + kubectl create secret generic evidently-ui-s3 --from-literal=access-key=... --from-literal=secret-key=... + helm upgrade --install evidently-ui . --set s3.existingSecret.name=evidently-ui-s3 + +Without valid S3 credentials the UI pod will fail to start. +{{- else }} + +Workspace: local path /app/workspace (ensure persistence is enabled or use a volume). +{{- end }} diff --git a/deploy/helm/templates/_helpers.tpl b/deploy/helm/templates/_helpers.tpl new file mode 100644 index 0000000000..951af82791 --- /dev/null +++ b/deploy/helm/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "evidently-ui.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "evidently-ui.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "evidently-ui.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "evidently-ui.labels" -}} +helm.sh/chart: {{ include "evidently-ui.chart" . }} +{{ include "evidently-ui.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "evidently-ui.selectorLabels" -}} +app.kubernetes.io/name: {{ include "evidently-ui.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "evidently-ui.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "evidently-ui.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Workspace path: s3, simplecache::s3, or local +*/}} +{{- define "evidently-ui.workspacePath" -}} +{{- if .Values.s3.enabled -}} +{{- if (index (.Values.s3.cache | default dict) "enabled") }}simplecache::{{ end }}s3://{{ .Values.s3.bucketName }}/{{ .Values.s3.path }} +{{- else -}} +/app/workspace +{{- end -}} +{{- end }} + +{{/* +Whether S3 cache is enabled +*/}} +{{- define "evidently-ui.s3CacheEnabled" -}} +{{- (index (.Values.s3.cache | default dict) "enabled") -}} +{{- end }} diff --git a/deploy/helm/templates/deployment.yaml b/deploy/helm/templates/deployment.yaml new file mode 100644 index 0000000000..c25e7e6a94 --- /dev/null +++ b/deploy/helm/templates/deployment.yaml @@ -0,0 +1,230 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "evidently-ui.fullname" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.autoscaling.enabled | ternary .Values.autoscaling.minReplicas .Values.replicaCount }} + selector: + matchLabels: + {{- include "evidently-ui.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "evidently-ui.selectorLabels" . | nindent 8 }} + {{- if .Values.podAnnotations }} + annotations: + {{- toYaml .Values.podAnnotations | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ include "evidently-ui.serviceAccountName" . }} + {{- if .Values.podSecurityContext }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- end }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.s3.enabled }} + initContainers: + - name: create-s3-workspace + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["python3", "-c"] + args: + - | + import sys + import traceback + path = '{{ include "evidently-ui.workspacePath" . }}' + print(f'Creating workspace at {path}...', flush=True) + try: + from evidently.ui.workspace import Workspace + ws = Workspace.create(path) + print(f'Workspace ready: {path} ({len(ws.list_projects())} projects)', flush=True) + except Exception as e: + print(f'ERROR: {e}', file=sys.stderr, flush=True) + traceback.print_exc(file=sys.stderr) + sys.exit(1) + env: + - name: FSSPEC_S3_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.s3.existingSecret.name | default (printf "%s-s3" (include "evidently-ui.fullname" .)) }} + key: {{ .Values.s3.existingSecret.accessKeyKey | default "access-key" }} + - name: FSSPEC_S3_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.s3.existingSecret.name | default (printf "%s-s3" (include "evidently-ui.fullname" .)) }} + key: {{ .Values.s3.existingSecret.secretKeyKey | default "secret-key" }} + - name: FSSPEC_S3_ENDPOINT_URL + value: {{ .Values.s3.endpointUrl | quote }} + {{- if .Values.s3.region }} + - name: AWS_DEFAULT_REGION + value: {{ .Values.s3.region | quote }} + {{- end }} + {{- if .Values.s3.addressingStyle }} + - name: AWS_S3_ADDRESSING_STYLE + value: {{ .Values.s3.addressingStyle | quote }} + {{- end }} + {{- if .Values.evidentlyDebug }} + - name: EVIDENTLY_DEBUG + value: "1" + {{- end }} + - name: HOME + value: "/tmp" + - name: XDG_CONFIG_HOME + value: "/tmp" + {{- if (index (.Values.s3.cache | default dict) "enabled") }} + - name: FSSPEC_simplecache_cache_storage + value: {{ (.Values.s3.cache | default dict).storagePath | default "/app/s3-cache" | quote }} + {{- end }} + {{- if .Values.initContainersResources }} + resources: + {{- toYaml .Values.initContainersResources | nindent 10 }} + {{- end }} + {{- if (index (.Values.s3.cache | default dict) "enabled") }} + volumeMounts: + - name: s3-cache + mountPath: {{ (.Values.s3.cache | default dict).storagePath | default "/app/s3-cache" }} + {{- end }} + {{- end }} + containers: + - name: evidently-ui + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["evidently"] + args: + - "ui" + - "--workspace" + - {{ include "evidently-ui.workspacePath" . | quote }} + - "--port" + - "8000" + - "--host" + - "0.0.0.0" + ports: + - name: http + containerPort: {{ .Values.service.targetPort }} + protocol: TCP + env: + {{- if .Values.s3.enabled }} + - name: FSSPEC_S3_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.s3.existingSecret.name | default (printf "%s-s3" (include "evidently-ui.fullname" .)) }} + key: {{ .Values.s3.existingSecret.accessKeyKey | default "access-key" }} + - name: FSSPEC_S3_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.s3.existingSecret.name | default (printf "%s-s3" (include "evidently-ui.fullname" .)) }} + key: {{ .Values.s3.existingSecret.secretKeyKey | default "secret-key" }} + - name: FSSPEC_S3_ENDPOINT_URL + value: {{ .Values.s3.endpointUrl | quote }} + {{- if .Values.s3.region }} + - name: AWS_DEFAULT_REGION + value: {{ .Values.s3.region | quote }} + {{- end }} + {{- if .Values.s3.addressingStyle }} + - name: AWS_S3_ADDRESSING_STYLE + value: {{ .Values.s3.addressingStyle | quote }} + {{- end }} + - name: EVIDENTLY_WORKSPACE + value: {{ include "evidently-ui.workspacePath" . | quote }} + {{- if .Values.evidentlyDebug }} + - name: EVIDENTLY_DEBUG + value: "1" + {{- end }} + - name: HOME + value: "/tmp" + - name: XDG_CONFIG_HOME + value: "/tmp" + {{- if (index (.Values.s3.cache | default dict) "enabled") }} + - name: FSSPEC_simplecache_cache_storage + value: {{ (.Values.s3.cache | default dict).storagePath | default "/app/s3-cache" | quote }} + {{- end }} + {{- end }} + {{- with .Values.envVars }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.startupProbe }} + startupProbe: + httpGet: + path: {{ .Values.startupProbe.httpGet.path }} + port: {{ .Values.startupProbe.httpGet.port }} + {{- if .Values.startupProbe.initialDelaySeconds }} + initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }} + {{- end }} + {{- if .Values.startupProbe.periodSeconds }} + periodSeconds: {{ .Values.startupProbe.periodSeconds }} + {{- end }} + {{- if .Values.startupProbe.timeoutSeconds }} + timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.startupProbe.failureThreshold }} + failureThreshold: {{ .Values.startupProbe.failureThreshold }} + {{- end }} + {{- end }} + {{- if .Values.livenessProbe }} + livenessProbe: + httpGet: + path: {{ .Values.livenessProbe.httpGet.path }} + port: {{ .Values.livenessProbe.httpGet.port }} + {{- if .Values.livenessProbe.initialDelaySeconds }} + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + {{- end }} + {{- if .Values.livenessProbe.periodSeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + {{- end }} + {{- if .Values.livenessProbe.timeoutSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.livenessProbe.failureThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- end }} + {{- if .Values.readinessProbe }} + readinessProbe: + httpGet: + path: {{ .Values.readinessProbe.httpGet.path }} + port: {{ .Values.readinessProbe.httpGet.port }} + {{- if .Values.readinessProbe.initialDelaySeconds }} + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + {{- end }} + {{- if .Values.readinessProbe.periodSeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + {{- end }} + {{- if .Values.readinessProbe.timeoutSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.readinessProbe.failureThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- end }} + {{- if .Values.resources }} + resources: + {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if or (and .Values.persistence.enabled (not .Values.s3.enabled)) (index (.Values.s3.cache | default dict) "enabled") }} + volumeMounts: + {{- if and .Values.persistence.enabled (not .Values.s3.enabled) }} + - name: workspace-storage + mountPath: {{ .Values.persistence.mountPath }} + {{- end }} + {{- if (index (.Values.s3.cache | default dict) "enabled") }} + - name: s3-cache + mountPath: {{ (.Values.s3.cache | default dict).storagePath | default "/app/s3-cache" }} + {{- end }} + {{- end }} + {{- if or (and .Values.persistence.enabled (not .Values.s3.enabled)) (index (.Values.s3.cache | default dict) "enabled") }} + volumes: + {{- if and .Values.persistence.enabled (not .Values.s3.enabled) }} + - name: workspace-storage + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim | default (include "evidently-ui.fullname" .) }} + {{- end }} + {{- if (index (.Values.s3.cache | default dict) "enabled") }} + - name: s3-cache + emptyDir: {} + {{- end }} + {{- end }} diff --git a/deploy/helm/templates/hpa.yaml b/deploy/helm/templates/hpa.yaml new file mode 100644 index 0000000000..4fb1c8c135 --- /dev/null +++ b/deploy/helm/templates/hpa.yaml @@ -0,0 +1,32 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "evidently-ui.fullname" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "evidently-ui.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/deploy/helm/templates/httproute.yaml b/deploy/helm/templates/httproute.yaml new file mode 100644 index 0000000000..865c47155b --- /dev/null +++ b/deploy/helm/templates/httproute.yaml @@ -0,0 +1,32 @@ +{{- if and .Values.httpRoute.enabled .Values.httpRoute.parentRefs -}} +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: {{ include "evidently-ui.fullname" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} + {{- with .Values.httpRoute.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + parentRefs: + {{- toYaml .Values.httpRoute.parentRefs | nindent 4 }} + {{- if .Values.httpRoute.hostnames }} + hostnames: + {{- range .Values.httpRoute.hostnames }} + - {{ . | quote }} + {{- end }} + {{- end }} + rules: + - matches: + - path: + type: {{ .Values.httpRoute.pathMatchType | default "PathPrefix" }} + value: {{ .Values.httpRoute.path | default "/" | quote }} + backendRefs: + - name: {{ include "evidently-ui.fullname" . }} + port: {{ .Values.service.port }} + {{- if .Values.httpRoute.backendRefWeight }} + weight: {{ .Values.httpRoute.backendRefWeight }} + {{- end }} +{{- end }} diff --git a/deploy/helm/templates/ingress.yaml b/deploy/helm/templates/ingress.yaml new file mode 100644 index 0000000000..58c55c2247 --- /dev/null +++ b/deploy/helm/templates/ingress.yaml @@ -0,0 +1,39 @@ +{{- if .Values.ingress.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "evidently-ui.fullname" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ingress.className }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + - path: {{ .path | default "/" }} + pathType: {{ .pathType | default "Prefix" }} + backend: + service: + name: {{ include "evidently-ui.fullname" $ }} + port: + number: {{ $.Values.service.port }} + {{- end }} +{{- end }} diff --git a/deploy/helm/templates/pdb.yaml b/deploy/helm/templates/pdb.yaml new file mode 100644 index 0000000000..ff20e694fa --- /dev/null +++ b/deploy/helm/templates/pdb.yaml @@ -0,0 +1,18 @@ +{{- if .Values.podDisruptionBudget.enabled }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ include "evidently-ui.fullname" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} +spec: + {{- if .Values.podDisruptionBudget.minAvailable }} + minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} + {{- end }} + {{- if .Values.podDisruptionBudget.maxUnavailable }} + maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} + {{- end }} + selector: + matchLabels: + {{- include "evidently-ui.selectorLabels" . | nindent 6 }} +{{- end }} diff --git a/deploy/helm/templates/pvc.yaml b/deploy/helm/templates/pvc.yaml new file mode 100644 index 0000000000..51f814a1ce --- /dev/null +++ b/deploy/helm/templates/pvc.yaml @@ -0,0 +1,21 @@ +{{- if and .Values.persistence.enabled (not .Values.s3.enabled) (not .Values.persistence.existingClaim) -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "evidently-ui.fullname" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} +spec: + accessModes: + - {{ .Values.persistence.accessMode | quote }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} + {{- if .Values.persistence.storageClass }} + {{- if (eq "-" .Values.persistence.storageClass) }} + storageClassName: "" + {{- else }} + storageClassName: {{ .Values.persistence.storageClass | quote }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/deploy/helm/templates/secret.yaml b/deploy/helm/templates/secret.yaml new file mode 100644 index 0000000000..edb5835b7c --- /dev/null +++ b/deploy/helm/templates/secret.yaml @@ -0,0 +1,12 @@ +{{- if and .Values.s3.enabled (not .Values.s3.existingSecret.name) .Values.s3.accessKey .Values.s3.secretKey -}} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "evidently-ui.fullname" . }}-s3 + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} +type: Opaque +data: + access-key: {{ .Values.s3.accessKey | b64enc | quote }} + secret-key: {{ .Values.s3.secretKey | b64enc | quote }} +{{- end -}} diff --git a/deploy/helm/templates/service.yaml b/deploy/helm/templates/service.yaml new file mode 100644 index 0000000000..1bc18c8890 --- /dev/null +++ b/deploy/helm/templates/service.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "evidently-ui.fullname" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + {{- if and .Values.s3.enabled (index (.Values.s3.cache | default dict) "enabled") }} + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: 10800 + {{- end }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "evidently-ui.selectorLabels" . | nindent 4 }} diff --git a/deploy/helm/templates/serviceaccount.yaml b/deploy/helm/templates/serviceaccount.yaml new file mode 100644 index 0000000000..e06781d8d6 --- /dev/null +++ b/deploy/helm/templates/serviceaccount.yaml @@ -0,0 +1,13 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "evidently-ui.serviceAccountName" . }} + labels: + {{- include "evidently-ui.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automount }} +{{- end }} diff --git a/deploy/helm/values.yaml b/deploy/helm/values.yaml new file mode 100644 index 0000000000..f87b70a1de --- /dev/null +++ b/deploy/helm/values.yaml @@ -0,0 +1,164 @@ +replicaCount: 1 + +image: + repository: evidently/evidently-service + pullPolicy: IfNotPresent + tag: "0.7.20" + +imagePullSecrets: [] + +nameOverride: "" +fullnameOverride: "evidently-ui" + +serviceAccount: + create: true + automount: true + annotations: {} + name: "" + +podAnnotations: {} +podLabels: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + targetPort: 8000 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # cert-manager.io/cluster-issuer: letsencrypt-prod + hosts: + - host: evidently.local + path: / + pathType: Prefix + tls: [] + # - secretName: evidently-tls + # hosts: + # - evidently.local + +# Gateway API HTTPRoute (e.g. for Istio, Envoy Gateway, Cilium). +# Requires a Gateway to exist; set parentRefs to attach to it. +httpRoute: + enabled: false + annotations: {} + parentRefs: [] + # - name: my-gateway + # namespace: istio-system + # - name: my-gateway + # namespace: istio-system + # sectionName: http # optional: bind to specific listener + hostnames: [] + # - evidently.example.com + path: "/" + pathMatchType: PathPrefix # PathPrefix or Exact + # backendRefWeight: 1 # optional, for traffic splitting + +resources: + limits: + cpu: 200m + memory: 1Gi + requests: + cpu: 100m + memory: 512Mi + +initContainersResources: + limits: + cpu: 200m + memory: 512Mi + requests: + cpu: 100m + memory: 256Mi + +startupProbe: + httpGet: + path: / + port: 8000 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 36 + +livenessProbe: + httpGet: + path: / + port: 8000 + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + +readinessProbe: + httpGet: + path: / + port: 8000 + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 5 + failureThreshold: 3 + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 2 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + +podDisruptionBudget: + enabled: false + # Use one of minAvailable or maxUnavailable + minAvailable: 1 + # maxUnavailable: 0 + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +persistence: + enabled: false + mountPath: /app/workspace + accessMode: ReadWriteOnce + size: 10Gi + # storageClass: null # use default storage class + # existingClaim: "evidently-pvc" + +envVars: [] + # - name: EVIDENTLY_WORKSPACE + # value: "/app/workspace" + +evidentlyDebug: false + +s3: + enabled: true + bucketName: "" + path: "" + endpointUrl: "" + region: "" + addressingStyle: "" + accessKey: "" + secretKey: "" + # existingSecret: + # name: "my-s3-credentials" + # accessKeyKey: "access-key-id" + # secretKeyKey: "secret-access-key" + existingSecret: {} + # Cache S3 reads locally for faster report loads (fsspec simplecache). + # Cache is per-pod (emptyDir), lost on restart. Re-opening a report uses cache. + cache: + enabled: true + storagePath: "/app/s3-cache"