diff --git a/bitnami/mlflow/CHANGELOG.md b/bitnami/mlflow/CHANGELOG.md
index cb564d3a0ff059..83f417b31846e8 100644
--- a/bitnami/mlflow/CHANGELOG.md
+++ b/bitnami/mlflow/CHANGELOG.md
@@ -1,8 +1,12 @@
# Changelog
-## 1.4.25 (2024-08-31)
+## 1.5.0 (2024-09-05)
-* [bitnami/mlflow] Release 1.4.25 ([#29139](https://github.com/bitnami/charts/pull/29139))
+* [bitnami/mlflow] Add support for Google Cloud Storage as artifact store ([#28938](https://github.com/bitnami/charts/pull/28938))
+
+## 1.4.25 (2024-08-31)
+
+* [bitnami/mlflow] Release 1.4.25 (#29139) ([07365a4](https://github.com/bitnami/charts/commit/07365a40a3e0246fdc926b421893782b9f17ccd7)), closes [#29139](https://github.com/bitnami/charts/issues/29139)
## 1.4.24 (2024-08-26)
diff --git a/bitnami/mlflow/Chart.yaml b/bitnami/mlflow/Chart.yaml
index ea9c0274b70749..472eabec346384 100644
--- a/bitnami/mlflow/Chart.yaml
+++ b/bitnami/mlflow/Chart.yaml
@@ -44,4 +44,4 @@ sources:
- https://github.com/bitnami/charts/tree/main/bitnami/mlflow
- https://github.com/bitnami/containers/tree/main/bitnami/mlflow
- https://github.com/mlflow/mlflow
-version: 1.4.25
+version: 1.5.0
diff --git a/bitnami/mlflow/README.md b/bitnami/mlflow/README.md
index 662161a17b68b1..7371af654a339d 100644
--- a/bitnami/mlflow/README.md
+++ b/bitnami/mlflow/README.md
@@ -460,6 +460,17 @@ The command deploys mlflow on the Kubernetes cluster in the default configuratio
| `externalS3.bucket` | External S3 bucket | `mlflow` |
| `externalS3.serveArtifacts` | Whether artifact serving is enabled | `true` |
+### External Google Cloud Storage parameters
+
+| Name | Description | Value |
+| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | ------- |
+| `externalGCS.bucket` | GCS bucket name. Activate gcs artifact storage if set | `""` |
+| `externalGCS.googleCloudProject` | Google Cloud Project to use (optional, needed when using "default application credentials") | `""` |
+| `externalGCS.useCredentialsInSecret` | Whether to read the GCS application credentials from a secret | `false` |
+| `externalGCS.existingSecret` | Name of an existing secret key containing the application credentials file (required when useCredentialsInSecret is true) | `""` |
+| `externalGCS.existingSecretKey` | Key in the existing secret containing the application credentials (required when useCredentialsInSecret is true) | `""` |
+| `externalGCS.serveArtifacts` | Whether artifact serving is enabled | `true` |
+
The MLflow chart supports three different ways to load your files in the `run` deployment. In order of priority, they are:
1. Existing config map
diff --git a/bitnami/mlflow/templates/_helpers.tpl b/bitnami/mlflow/templates/_helpers.tpl
index 28034e30dd783a..bf9a5e15823d25 100644
--- a/bitnami/mlflow/templates/_helpers.tpl
+++ b/bitnami/mlflow/templates/_helpers.tpl
@@ -544,6 +544,11 @@ Return the volume-permissions init container
mountPath: /tmp
{{- end -}}
+
+{{/*
+Deal with external artifact storage
+*/}}
+
{{/*
Return MinIO(TM) fullname
*/}}
@@ -551,6 +556,7 @@ Return MinIO(TM) fullname
{{- include "common.names.dependency.fullname" (dict "chartName" "minio" "chartValues" .Values.minio "context" $) -}}
{{- end -}}
+
{{/*
Return whether S3 is enabled
*/}}
@@ -648,6 +654,15 @@ Return the S3 secret access key inside the secret
{{- end -}}
{{- end -}}
+{{/*
+Return whether GCS is enabled
+*/}}
+{{- define "mlflow.v0.gcs.enabled" -}}
+ {{- if and (not .Values.minio.enabled) (not .Values.externalS3.host) .Values.externalGCS.bucket -}}
+ {{- true }}
+ {{- end -}}
+{{- end -}}
+
{{/*
Return the proper git image name
diff --git a/bitnami/mlflow/templates/tracking/deployment.yaml b/bitnami/mlflow/templates/tracking/deployment.yaml
index 44900bc7f3f005..8a4b2d7327f079 100644
--- a/bitnami/mlflow/templates/tracking/deployment.yaml
+++ b/bitnami/mlflow/templates/tracking/deployment.yaml
@@ -141,12 +141,17 @@ spec:
{{- end }}
{{- if (include "mlflow.v0.s3.enabled" .) }}
- --artifacts-destination=s3://{{ include "mlflow.v0.s3.bucket" . }}
+ {{- else if (include "mlflow.v0.gcs.enabled" .) }}
+ - --artifacts-destination=gs://{{ .Values.externalGCS.bucket }}
{{- else }}
- --artifacts-destination={{ .Values.tracking.persistence.mountPath }}/mlartifacts
{{- end }}
{{- if and (not (include "mlflow.v0.s3.serveArtifacts" .)) (include "mlflow.v0.s3.enabled" .) }}
- --default-artifact-root=s3://{{ include "mlflow.v0.s3.bucket" . }}
- --no-serve-artifacts
+ {{- else if and (not .Values.externalGCS.serveArtifacts) (include "mlflow.v0.gcs.enabled" .) }}
+ - --default-artifact-root=gs://{{ .Values.externalGCS.bucket }}
+ - --no-serve-artifacts
{{ else }}
- --serve-artifacts
{{- end }}
@@ -190,6 +195,16 @@ spec:
- name: MLFLOW_S3_ENDPOINT_URL
value: {{ printf "%s://%s:%v" (include "mlflow.v0.s3.protocol" .) (include "mlflow.v0.s3.host" .) (include "mlflow.v0.s3.port" .) | quote }}
{{- end }}
+ {{- if (include "mlflow.v0.gcs.enabled" .) }}
+ {{- if .Values.externalGCS.useCredentialsInSecret }}
+ - name: GOOGLE_APPLICATION_CREDENTIALS
+ value: /bitnami/gcs/key.json
+ {{- end }}
+ {{- if .Values.externalGCS.googleCloudProject }}
+ - name: GOOGLE_CLOUD_PROJECT
+ value: {{ .Values.externalGCS.googleCloudProject }}
+ {{- end }}
+ {{- end }}
{{- if .Values.tracking.extraEnvVars }}
{{- include "common.tplvalues.render" (dict "value" .Values.tracking.extraEnvVars "context" $) | nindent 12 }}
{{- end }}
@@ -273,6 +288,11 @@ spec:
{{- if .Values.tracking.persistence.subPath }}
subPath: {{ .Values.tracking.persistence.subPath }}
{{- end }}
+ {{- if and (include "mlflow.v0.gcs.enabled" .) .Values.externalGCS.useCredentialsInSecret }}
+ - name: gcs-key
+ mountPath: /bitnami/gcs/key.json
+ subPath: key.json
+ {{- end }}
{{- if .Values.tracking.extraVolumeMounts }}
{{- include "common.tplvalues.render" (dict "value" .Values.tracking.extraVolumeMounts "context" $) | nindent 12 }}
{{- end }}
@@ -310,4 +330,12 @@ spec:
{{- if .Values.tracking.extraVolumes }}
{{- include "common.tplvalues.render" (dict "value" .Values.tracking.extraVolumes "context" $) | nindent 8 }}
{{- end }}
+ {{- if and (include "mlflow.v0.gcs.enabled" .) .Values.externalGCS.useCredentialsInSecret }}
+ - name: gcs-key
+ secret:
+ secretName: {{ .Values.externalGCS.existingSecret }}
+ items:
+ - key: {{ .Values.externalGCS.existingSecretKey }}
+ path: key.json
+ {{- end }}
{{- end }}
diff --git a/bitnami/mlflow/values.yaml b/bitnami/mlflow/values.yaml
index aa63ec13d85acd..376532e0d0205c 100644
--- a/bitnami/mlflow/values.yaml
+++ b/bitnami/mlflow/values.yaml
@@ -1395,6 +1395,7 @@ minio:
loadBalancerIP: ""
ports:
api: 80
+
## @section External S3 parameters
## All of these values are only used when minio.enabled is set to false
## @param externalS3.host External S3 host. When using AWS S3, include appropriate [regional code](https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_region), e.g. "eu-central-1.amazonaws.com
@@ -1421,3 +1422,20 @@ externalS3:
protocol: "https"
bucket: "mlflow"
serveArtifacts: true
+
+## @section External Google Cloud Storage parameters
+## All of these values are only used when minio.enabled is set to false and externalS3 is not configured (host is empty)
+## @param externalGCS.bucket GCS bucket name. Activate gcs artifact storage if set
+## @param externalGCS.googleCloudProject Google Cloud Project to use (optional, needed when using "default application credentials")
+## @param externalGCS.useCredentialsInSecret Whether to read the GCS application credentials from a secret
+## @param externalGCS.existingSecret Name of an existing secret key containing the application credentials file (required when useCredentialsInSecret is true)
+## @param externalGCS.existingSecretKey Key in the existing secret containing the application credentials (required when useCredentialsInSecret is true)
+## @param externalGCS.serveArtifacts Whether artifact serving is enabled
+##
+externalGCS:
+ bucket: ""
+ googleCloudProject: ""
+ useCredentialsInSecret: false
+ existingSecret: ""
+ existingSecretKey: ""
+ serveArtifacts: true