Selaa lähdekoodia

[bitnami/grafana-loki] feat: :tada: Add chart (#10281)

* [bitnami/grafana-loki] feat: :tada: Add chart

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Update README.md with readme-generator-for-helm

Signed-off-by: Bitnami Containers <containers@bitnami.com>

* Fix description and add VIB pipelines

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Fix memcached issues

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Apply requested changes

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Fix metadata and README

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Update bitnami-shell

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Update README.md with readme-generator-for-helm

Signed-off-by: Bitnami Containers <containers@bitnami.com>

* Fix parenthesis

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* FIx incorrect common calls

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Update vib-publish

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

* Fix reported issues

Signed-off-by: Javier Salmeron Garcia <jsalmeron@vmware.com>

Co-authored-by: Bitnami Containers <containers@bitnami.com>
Javier J. Salmerón-García 3 vuotta sitten
vanhempi
sitoutus
55e92bf870
53 muutettua tiedostoa jossa 8915 lisäystä ja 0 poistoa
  1. 1 0
      .github/workflows/vib-publish.yaml
  2. 68 0
      .vib/grafana-loki/vib-publish.json
  3. 53 0
      .vib/grafana-loki/vib-verify.json
  4. 21 0
      bitnami/grafana-loki/.helmignore
  5. 18 0
      bitnami/grafana-loki/Chart.lock
  6. 47 0
      bitnami/grafana-loki/Chart.yaml
  7. 1230 0
      bitnami/grafana-loki/README.md
  8. 102 0
      bitnami/grafana-loki/templates/NOTES.txt
  9. 337 0
      bitnami/grafana-loki/templates/_helpers.tpl
  10. 171 0
      bitnami/grafana-loki/templates/compactor/deployment.yaml
  11. 35 0
      bitnami/grafana-loki/templates/compactor/pvc.yaml
  12. 58 0
      bitnami/grafana-loki/templates/compactor/service.yaml
  13. 56 0
      bitnami/grafana-loki/templates/compactor/servicemonitor.yaml
  14. 163 0
      bitnami/grafana-loki/templates/distributor/deployment.yaml
  15. 65 0
      bitnami/grafana-loki/templates/distributor/service.yaml
  16. 56 0
      bitnami/grafana-loki/templates/distributor/servicemonitor.yaml
  17. 4 0
      bitnami/grafana-loki/templates/extra-list.yaml
  18. 109 0
      bitnami/grafana-loki/templates/gateway/configmap-http.yaml
  19. 178 0
      bitnami/grafana-loki/templates/gateway/deployment.yaml
  20. 57 0
      bitnami/grafana-loki/templates/gateway/ingress.yaml
  21. 21 0
      bitnami/grafana-loki/templates/gateway/secret.yaml
  22. 57 0
      bitnami/grafana-loki/templates/gateway/service.yaml
  23. 44 0
      bitnami/grafana-loki/templates/gateway/tls-secret.yaml
  24. 31 0
      bitnami/grafana-loki/templates/gossip-ring-headless-service.yaml
  25. 67 0
      bitnami/grafana-loki/templates/index-gateway/service.yaml
  26. 56 0
      bitnami/grafana-loki/templates/index-gateway/servicemonitor.yaml
  27. 166 0
      bitnami/grafana-loki/templates/index-gateway/statefulset.yaml
  28. 65 0
      bitnami/grafana-loki/templates/ingester/service.yaml
  29. 56 0
      bitnami/grafana-loki/templates/ingester/servicemonitor.yaml
  30. 218 0
      bitnami/grafana-loki/templates/ingester/statefulset.yaml
  31. 17 0
      bitnami/grafana-loki/templates/loki-configmap.yaml
  32. 28 0
      bitnami/grafana-loki/templates/promtail/clusterrole.yaml
  33. 23 0
      bitnami/grafana-loki/templates/promtail/clusterrolebinding.yaml
  34. 190 0
      bitnami/grafana-loki/templates/promtail/daemonset.yaml
  35. 17 0
      bitnami/grafana-loki/templates/promtail/secret.yaml
  36. 21 0
      bitnami/grafana-loki/templates/promtail/service-account.yaml
  37. 56 0
      bitnami/grafana-loki/templates/promtail/service.yaml
  38. 56 0
      bitnami/grafana-loki/templates/promtail/servicemonitor.yaml
  39. 65 0
      bitnami/grafana-loki/templates/querier/service.yaml
  40. 56 0
      bitnami/grafana-loki/templates/querier/servicemonitor.yaml
  41. 220 0
      bitnami/grafana-loki/templates/querier/statefulset.yaml
  42. 159 0
      bitnami/grafana-loki/templates/query-frontend/deployment.yaml
  43. 34 0
      bitnami/grafana-loki/templates/query-frontend/headless-service.yaml
  44. 66 0
      bitnami/grafana-loki/templates/query-frontend/service.yaml
  45. 56 0
      bitnami/grafana-loki/templates/query-frontend/servicemonitor.yaml
  46. 67 0
      bitnami/grafana-loki/templates/ruler/service.yaml
  47. 56 0
      bitnami/grafana-loki/templates/ruler/servicemonitor.yaml
  48. 222 0
      bitnami/grafana-loki/templates/ruler/statefulset.yaml
  49. 21 0
      bitnami/grafana-loki/templates/service-account.yaml
  50. 161 0
      bitnami/grafana-loki/templates/table-manager/deployment.yaml
  51. 67 0
      bitnami/grafana-loki/templates/table-manager/service.yaml
  52. 56 0
      bitnami/grafana-loki/templates/table-manager/servicemonitor.yaml
  53. 3591 0
      bitnami/grafana-loki/values.yaml

+ 1 - 0
.github/workflows/vib-publish.yaml

@@ -5,6 +5,7 @@ on: # rebuild any PRs and main branch changes
       - master
     paths:
       - 'bitnami/wordpress/Chart.yaml'
+      - 'bitnami/grafana-loki/Chart.yaml'
 env:
   CSP_API_URL: https://console.cloud.vmware.com
   CSP_API_TOKEN: ${{ secrets.CSP_API_TOKEN }}

+ 68 - 0
.vib/grafana-loki/vib-publish.json

@@ -0,0 +1,68 @@
+{
+  "phases": {
+    "package": {
+      "context": {
+        "resources": {
+          "url": "{SHA_ARCHIVE}",
+          "path": "/bitnami/grafana-loki"
+        }
+      },
+      "actions": [
+        {
+          "action_id": "helm-package"
+        },
+        {
+          "action_id": "helm-lint"
+        }
+      ]
+    },
+    "verify": {
+      "context": {
+        "resources": {
+          "url": "{SHA_ARCHIVE}",
+          "path": "/bitnami/grafana-loki"
+        },
+        "runtime_parameters": "ImdhdGV3YXkiOgogICJzZXJ2aWNlIjoKICAgICJwb3J0cyI6CiAgICAgICJodHRwIjogODAKICAgICJ0eXBlIjogIkxvYWRCYWxhbmNlciIK",
+        "target_platform": {
+          "target_platform_id": "{VIB_ENV_TARGET_PLATFORM}",
+          "size": {
+            "name": "S4"
+          }
+        }
+      },
+      "actions": [
+        {
+          "action_id": "trivy",
+          "params": {
+            "threshold": "CRITICAL",
+            "vuln_type": [
+              "OS"
+            ]
+          }
+        },
+        {
+          "action_id": "health-check",
+          "params": {
+            "endpoint": "lb-grafana-loki-gateway-http",
+            "app_protocol": "HTTP"
+          }
+        }
+      ]
+    },
+    "publish": {
+      "actions": [
+        {
+          "action_id": "helm-publish",
+          "params": {
+            "repository": {
+              "kind": "S3",
+              "url": "{VIB_ENV_S3_URL}",
+              "username": "{VIB_ENV_S3_USERNAME}",
+              "password": "{VIB_ENV_S3_PASSWORD}"
+            }
+          }
+        }
+      ]
+    }
+  }
+}

+ 53 - 0
.vib/grafana-loki/vib-verify.json

@@ -0,0 +1,53 @@
+{
+  "phases": {
+    "package": {
+      "context": {
+        "resources": {
+          "url": "{SHA_ARCHIVE}",
+          "path": "/bitnami/grafana-loki"
+        }
+      },
+      "actions": [
+        {
+          "action_id": "helm-package"
+        },
+        {
+          "action_id": "helm-lint"
+        }
+      ]
+    },
+    "verify": {
+      "context": {
+        "resources": {
+          "url": "{SHA_ARCHIVE}",
+          "path": "/bitnami/grafana-loki"
+        },
+        "runtime_parameters": "ImdhdGV3YXkiOgogICJzZXJ2aWNlIjoKICAgICJwb3J0cyI6CiAgICAgICJodHRwIjogODAKICAgICJ0eXBlIjogIkxvYWRCYWxhbmNlciIK",
+        "target_platform": {
+          "target_platform_id": "{VIB_ENV_TARGET_PLATFORM}",
+          "size": {
+            "name": "S4"
+          }
+        }
+      },
+      "actions": [
+        {
+          "action_id": "trivy",
+          "params": {
+            "threshold": "CRITICAL",
+            "vuln_type": [
+              "OS"
+            ]
+          }
+        },
+        {
+          "action_id": "health-check",
+          "params": {
+            "endpoint": "lb-grafana-loki-gateway-http",
+            "app_protocol": "HTTP"
+          }
+        }
+      ]
+    }
+  }
+}

+ 21 - 0
bitnami/grafana-loki/.helmignore

@@ -0,0 +1,21 @@
+# 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
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj

+ 18 - 0
bitnami/grafana-loki/Chart.lock

@@ -0,0 +1,18 @@
+dependencies:
+- name: memcached
+  repository: https://charts.bitnami.com/bitnami
+  version: 6.0.17
+- name: memcached
+  repository: https://charts.bitnami.com/bitnami
+  version: 6.0.17
+- name: memcached
+  repository: https://charts.bitnami.com/bitnami
+  version: 6.0.17
+- name: memcached
+  repository: https://charts.bitnami.com/bitnami
+  version: 6.0.17
+- name: common
+  repository: https://charts.bitnami.com/bitnami
+  version: 1.14.0
+digest: sha256:e91b58d245b77fcdb0fc30e6d96853018ce3590c66ba8745492448f93285e04e
+generated: "2022-05-17T17:20:00.423599+02:00"

+ 47 - 0
bitnami/grafana-loki/Chart.yaml

@@ -0,0 +1,47 @@
+annotations:
+  category: Infrastructure
+apiVersion: v2
+appVersion: 1.4.1
+dependencies:
+  - condition: memcachedchunks.enabled
+    name: memcached
+    repository: https://charts.bitnami.com/bitnami
+    version: 6.x.x
+    alias: memcachedchunks
+  - condition: memcachedfrontend.enabled
+    name: memcached
+    repository: https://charts.bitnami.com/bitnami
+    version: 6.x.x
+    alias: memcachedfrontend
+  - condition: memcachedindexqueries.enabled
+    name: memcached
+    repository: https://charts.bitnami.com/bitnami
+    version: 6.x.x
+    alias: memcachedindexqueries
+  - condition: memcachedindexwrites.enabled
+    name: memcached
+    repository: https://charts.bitnami.com/bitnami
+    version: 6.x.x
+    alias: memcachedindexwrites
+  - name: common
+    repository: https://charts.bitnami.com/bitnami
+    tags:
+      - bitnami-common
+    version: 1.x.x
+description: Grafana Loki is a horizontally scalable, highly available, and multi-tenant log aggregation system. It provides real-time long tailing and full persistence to object storage.
+engine: gotpl
+home: https://github.com/grafana/loki/
+icon: https://bitnami.com/assets/stacks/grafana-loki/img/grafana-loki-stack-220x234.png
+keywords:
+  - grafana
+  - tracing
+  - metrics
+  - infrastructure
+maintainers:
+  - email: containers@bitnami.com
+    name: Bitnami
+name: grafana-loki
+sources:
+  - https://github.com/bitnami/bitnami-docker-grafana-loki
+  - https://github.com/grafana/loki/
+version: 1.1.5

+ 1230 - 0
bitnami/grafana-loki/README.md

@@ -0,0 +1,1230 @@
+<!--- app-name: Grafana Loki -->
+
+# Grafana Loki packaged by Bitnami
+
+Grafana Loki is a horizontally scalable, highly available, and multi-tenant log aggregation system. It provides real-time long tailing and full persistence to object storage.
+
+[Overview of Grafana Loki](https://github.com/grafana/loki)
+
+Trademarks: This software listing is packaged by Bitnami. The respective trademarks mentioned in the offering are owned by the respective companies, and use of them does not imply any affiliation or endorsement.
+
+## TL;DR
+
+```console
+$ helm repo add bitnami https://charts.bitnami.com/bitnami
+$ helm install my-release bitnami/grafana-loki
+```
+
+## Introduction
+
+Bitnami charts for Helm are carefully engineered, actively maintained and are the quickest and easiest way to deploy containers on a Kubernetes cluster that are ready to handle production workloads.
+
+This chart bootstraps a [Grafana Loki](https://github.com/grafana/loki) Deployment in a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
+
+Bitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters. This Helm chart has been tested on top of [Bitnami Kubernetes Production Runtime](https://kubeprod.io/) (BKPR). Deploy BKPR to get automated TLS certificates, logging and monitoring for your applications.
+
+[Learn more about the default configuration of the chart](https://docs.bitnami.com/kubernetes/infrastructure/grafana-loki/get-started/).
+
+## Prerequisites
+
+- Kubernetes 1.19+
+- Helm 3.2.0+
+- PV provisioner support in the underlying infrastructure
+
+## Installing the Chart
+
+To install the chart with the release name `my-release`:
+
+```console
+helm install my-release bitnami/grafana-loki
+```
+
+The command deploys grafana-loki on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation.
+
+> **Tip**: List all releases using `helm list`
+
+## Uninstalling the Chart
+
+To uninstall/delete the `my-release` deployment:
+
+```console
+helm delete my-release
+```
+
+The command removes all the Kubernetes components associated with the chart and deletes the release.
+
+## Parameters
+
+### Global parameters
+
+| Name                      | Description                                     | Value |
+| ------------------------- | ----------------------------------------------- | ----- |
+| `global.imageRegistry`    | Global Docker image registry                    | `""`  |
+| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]`  |
+| `global.storageClass`     | Global StorageClass for Persistent Volume(s)    | `""`  |
+
+
+### Common parameters
+
+| Name                     | Description                                                                             | Value           |
+| ------------------------ | --------------------------------------------------------------------------------------- | --------------- |
+| `kubeVersion`            | Override Kubernetes version                                                             | `""`            |
+| `nameOverride`           | String to partially override common.names.fullname                                      | `""`            |
+| `fullnameOverride`       | String to fully override common.names.fullname                                          | `""`            |
+| `commonLabels`           | Labels to add to all deployed objects                                                   | `{}`            |
+| `commonAnnotations`      | Annotations to add to all deployed objects                                              | `{}`            |
+| `clusterDomain`          | Kubernetes cluster domain name                                                          | `cluster.local` |
+| `extraDeploy`            | Array of extra objects to deploy with the release                                       | `[]`            |
+| `diagnosticMode.enabled` | Enable diagnostic mode (all probes will be disabled and the command will be overridden) | `false`         |
+| `diagnosticMode.command` | Command to override all containers in the deployments/statefulsets                      | `["sleep"]`     |
+| `diagnosticMode.args`    | Args to override all containers in the deployments/statefulsets                         | `["infinity"]`  |
+
+
+### Common Grafana Loki Parameters
+
+| Name                                  | Description                                                    | Value                   |
+| ------------------------------------- | -------------------------------------------------------------- | ----------------------- |
+| `loki.image.registry`                 | Grafana Loki image registry                                    | `docker.io`             |
+| `loki.image.repository`               | Grafana Loki image repository                                  | `bitnami/grafana-loki`  |
+| `loki.image.tag`                      | Grafana Loki image tag (immutable tags are recommended)        | `2.5.0-debian-10-r3`    |
+| `loki.image.pullPolicy`               | Grafana Loki image pull policy                                 | `IfNotPresent`          |
+| `loki.image.pullSecrets`              | Grafana Loki image pull secrets                                | `[]`                    |
+| `loki.configuration`                  | Loki components configuration                                  | `""`                    |
+| `loki.existingConfigmap`              | Name of a ConfigMap with the Loki configuration                | `""`                    |
+| `loki.dataDir`                        | path to the Loki data directory                                | `/bitnami/grafana-loki` |
+| `loki.containerPorts.http`            | Loki components web container port                             | `3100`                  |
+| `loki.containerPorts.grpc`            | Loki components GRPC container port                            | `9095`                  |
+| `loki.containerPorts.gossipRing`      | Loki components Gossip Ring container port                     | `7946`                  |
+| `loki.gossipRing.service.ports.http`  | Gossip Ring HTTP headless service port                         | `7946`                  |
+| `loki.gossipRing.service.annotations` | Additional custom annotations for Gossip Ring headless service | `{}`                    |
+
+
+### Compactor Deployment Parameters
+
+| Name                                              | Description                                                                                         | Value               |
+| ------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------------------- |
+| `compactor.enabled`                               | Enable Compactor deployment                                                                         | `false`             |
+| `compactor.extraEnvVars`                          | Array with extra environment variables to add to compactor nodes                                    | `[]`                |
+| `compactor.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for compactor nodes                            | `""`                |
+| `compactor.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for compactor nodes                               | `""`                |
+| `compactor.command`                               | Override default container command (useful when using custom images)                                | `[]`                |
+| `compactor.args`                                  | Override default container args (useful when using custom images)                                   | `[]`                |
+| `compactor.replicaCount`                          | Number of Compactor replicas to deploy                                                              | `1`                 |
+| `compactor.livenessProbe.enabled`                 | Enable livenessProbe on Compactor nodes                                                             | `true`              |
+| `compactor.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                             | `60`                |
+| `compactor.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                    | `10`                |
+| `compactor.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                   | `1`                 |
+| `compactor.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                                 | `3`                 |
+| `compactor.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                                 | `1`                 |
+| `compactor.readinessProbe.enabled`                | Enable readinessProbe on Compactor nodes                                                            | `true`              |
+| `compactor.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                            | `60`                |
+| `compactor.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                   | `10`                |
+| `compactor.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                  | `1`                 |
+| `compactor.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                                | `3`                 |
+| `compactor.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                                | `1`                 |
+| `compactor.startupProbe.enabled`                  | Enable startupProbe on Compactor containers                                                         | `false`             |
+| `compactor.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                              | `30`                |
+| `compactor.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                     | `10`                |
+| `compactor.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                    | `1`                 |
+| `compactor.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                  | `15`                |
+| `compactor.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                  | `1`                 |
+| `compactor.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                                 | `{}`                |
+| `compactor.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                                | `{}`                |
+| `compactor.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                  | `{}`                |
+| `compactor.resources.limits`                      | The resources limits for the compactor containers                                                   | `{}`                |
+| `compactor.resources.requests`                    | The requested resources for the compactor containers                                                | `{}`                |
+| `compactor.podSecurityContext.enabled`            | Enabled Compactor pods' Security Context                                                            | `true`              |
+| `compactor.podSecurityContext.fsGroup`            | Set Compactor pod's Security Context fsGroup                                                        | `1001`              |
+| `compactor.containerSecurityContext.enabled`      | Enabled Compactor containers' Security Context                                                      | `true`              |
+| `compactor.containerSecurityContext.runAsUser`    | Set Compactor containers' Security Context runAsUser                                                | `1001`              |
+| `compactor.containerSecurityContext.runAsNonRoot` | Set Compactor containers' Security Context runAsNonRoot                                             | `true`              |
+| `compactor.lifecycleHooks`                        | for the compactor container(s) to automate configuration before or after startup                    | `{}`                |
+| `compactor.hostAliases`                           | compactor pods host aliases                                                                         | `[]`                |
+| `compactor.podLabels`                             | Extra labels for compactor pods                                                                     | `{}`                |
+| `compactor.podAnnotations`                        | Annotations for compactor pods                                                                      | `{}`                |
+| `compactor.podAffinityPreset`                     | Pod affinity preset. Ignored if `compactor.affinity` is set. Allowed values: `soft` or `hard`       | `""`                |
+| `compactor.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `compactor.affinity` is set. Allowed values: `soft` or `hard`  | `soft`              |
+| `compactor.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `compactor.affinity` is set. Allowed values: `soft` or `hard` | `""`                |
+| `compactor.nodeAffinityPreset.key`                | Node label key to match. Ignored if `compactor.affinity` is set                                     | `""`                |
+| `compactor.nodeAffinityPreset.values`             | Node label values to match. Ignored if `compactor.affinity` is set                                  | `[]`                |
+| `compactor.affinity`                              | Affinity for Compactor pods assignment                                                              | `{}`                |
+| `compactor.nodeSelector`                          | Node labels for Compactor pods assignment                                                           | `{}`                |
+| `compactor.tolerations`                           | Tolerations for Compactor pods assignment                                                           | `[]`                |
+| `compactor.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains     | `{}`                |
+| `compactor.priorityClassName`                     | Compactor pods' priorityClassName                                                                   | `""`                |
+| `compactor.schedulerName`                         | Kubernetes pod scheduler registry                                                                   | `""`                |
+| `compactor.updateStrategy.type`                   | Compactor statefulset strategy type                                                                 | `RollingUpdate`     |
+| `compactor.updateStrategy.rollingUpdate`          | Compactor statefulset rolling update configuration parameters                                       | `{}`                |
+| `compactor.extraVolumes`                          | Optionally specify extra list of additional volumes for the Compactor pod(s)                        | `[]`                |
+| `compactor.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the Compactor container(s)             | `[]`                |
+| `compactor.sidecars`                              | Add additional sidecar containers to the Compactor pod(s)                                           | `[]`                |
+| `compactor.initContainers`                        | Add additional init containers to the Compactor pod(s)                                              | `[]`                |
+| `compactor.persistence.enabled`                   | Enable persistence in Compactor instances                                                           | `true`              |
+| `compactor.persistence.existingClaim`             | Name of an existing PVC to use                                                                      | `""`                |
+| `compactor.persistence.storageClass`              | PVC Storage Class for Memcached data volume                                                         | `""`                |
+| `compactor.persistence.accessModes`               | PVC Access modes                                                                                    | `["ReadWriteOnce"]` |
+| `compactor.persistence.size`                      | PVC Storage Request for Memcached data volume                                                       | `8Gi`               |
+| `compactor.persistence.annotations`               | Additional PVC annotations                                                                          | `{}`                |
+| `compactor.persistence.selector`                  | Selector to match an existing Persistent Volume for Compactor's data PVC                            | `{}`                |
+| `compactor.persistence.dataSource`                | PVC data source                                                                                     | `{}`                |
+
+
+### Compactor Traffic Exposure Parameters
+
+| Name                                         | Description                                                      | Value       |
+| -------------------------------------------- | ---------------------------------------------------------------- | ----------- |
+| `compactor.service.type`                     | Compactor service type                                           | `ClusterIP` |
+| `compactor.service.ports.http`               | Compactor HTTP service port                                      | `3100`      |
+| `compactor.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `compactor.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `compactor.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `compactor.service.clusterIP`                | Compactor service Cluster IP                                     | `""`        |
+| `compactor.service.loadBalancerIP`           | Compactor service Load Balancer IP                               | `""`        |
+| `compactor.service.loadBalancerSourceRanges` | Compactor service Load Balancer sources                          | `[]`        |
+| `compactor.service.externalTrafficPolicy`    | Compactor service external traffic policy                        | `Cluster`   |
+| `compactor.service.annotations`              | Additional custom annotations for Compactor service              | `{}`        |
+| `compactor.service.extraPorts`               | Extra ports to expose in the Compactor service                   | `[]`        |
+
+
+### Gateway Deployment Parameters
+
+| Name                                            | Description                                                                                       | Value                   |
+| ----------------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------- |
+| `gateway.enabled`                               | Enable Gateway deployment                                                                         | `true`                  |
+| `gateway.image.registry`                        | Nginx image registry                                                                              | `docker.io`             |
+| `gateway.image.repository`                      | Nginx image repository                                                                            | `bitnami/nginx`         |
+| `gateway.image.tag`                             | Nginx image tag (immutable tags are recommended)                                                  | `1.21.6-debian-10-r105` |
+| `gateway.image.pullPolicy`                      | Nginx image pull policy                                                                           | `IfNotPresent`          |
+| `gateway.image.pullSecrets`                     | Nginx image pull secrets                                                                          | `[]`                    |
+| `gateway.image.debug`                           | Enable debugging in the initialization process                                                    | `false`                 |
+| `gateway.extraEnvVars`                          | Array with extra environment variables to add to gateway nodes                                    | `[]`                    |
+| `gateway.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for gateway nodes                            | `""`                    |
+| `gateway.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for gateway nodes                               | `""`                    |
+| `gateway.command`                               | Override default container command (useful when using custom images)                              | `[]`                    |
+| `gateway.args`                                  | Override default container args (useful when using custom images)                                 | `[]`                    |
+| `gateway.verboseLogging`                        | Show the gateway access_log                                                                       | `false`                 |
+| `gateway.replicaCount`                          | Number of Gateway replicas to deploy                                                              | `1`                     |
+| `gateway.auth.enabled`                          | Enable basic auth                                                                                 | `false`                 |
+| `gateway.auth.username`                         | Basic auth username                                                                               | `user`                  |
+| `gateway.auth.password`                         | Basic auth password                                                                               | `""`                    |
+| `gateway.auth.existingSecret`                   | Name of a secret containing the Basic auth password                                               | `""`                    |
+| `gateway.livenessProbe.enabled`                 | Enable livenessProbe on Gateway nodes                                                             | `true`                  |
+| `gateway.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                           | `10`                    |
+| `gateway.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                  | `10`                    |
+| `gateway.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                 | `1`                     |
+| `gateway.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                               | `3`                     |
+| `gateway.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                               | `1`                     |
+| `gateway.readinessProbe.enabled`                | Enable readinessProbe on Gateway nodes                                                            | `true`                  |
+| `gateway.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                          | `10`                    |
+| `gateway.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                 | `10`                    |
+| `gateway.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                | `1`                     |
+| `gateway.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                              | `3`                     |
+| `gateway.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                              | `1`                     |
+| `gateway.startupProbe.enabled`                  | Enable startupProbe on Gateway containers                                                         | `false`                 |
+| `gateway.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                            | `10`                    |
+| `gateway.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                   | `10`                    |
+| `gateway.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                  | `1`                     |
+| `gateway.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                | `15`                    |
+| `gateway.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                | `1`                     |
+| `gateway.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                               | `{}`                    |
+| `gateway.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                              | `{}`                    |
+| `gateway.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                | `{}`                    |
+| `gateway.containerPorts.http`                   | Gateway HTTP port                                                                                 | `8080`                  |
+| `gateway.resources.limits`                      | The resources limits for the gateway containers                                                   | `{}`                    |
+| `gateway.resources.requests`                    | The requested resources for the gateway containers                                                | `{}`                    |
+| `gateway.podSecurityContext.enabled`            | Enabled Gateway pods' Security Context                                                            | `true`                  |
+| `gateway.podSecurityContext.fsGroup`            | Set Gateway pod's Security Context fsGroup                                                        | `1001`                  |
+| `gateway.containerSecurityContext.enabled`      | Enabled Gateway containers' Security Context                                                      | `true`                  |
+| `gateway.containerSecurityContext.runAsUser`    | Set Gateway containers' Security Context runAsUser                                                | `1001`                  |
+| `gateway.containerSecurityContext.runAsNonRoot` | Set Gateway containers' Security Context runAsNonRoot                                             | `true`                  |
+| `gateway.lifecycleHooks`                        | for the gateway container(s) to automate configuration before or after startup                    | `{}`                    |
+| `gateway.hostAliases`                           | gateway pods host aliases                                                                         | `[]`                    |
+| `gateway.podLabels`                             | Extra labels for gateway pods                                                                     | `{}`                    |
+| `gateway.podAnnotations`                        | Annotations for gateway pods                                                                      | `{}`                    |
+| `gateway.podAffinityPreset`                     | Pod affinity preset. Ignored if `gateway.affinity` is set. Allowed values: `soft` or `hard`       | `""`                    |
+| `gateway.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `gateway.affinity` is set. Allowed values: `soft` or `hard`  | `soft`                  |
+| `gateway.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `gateway.affinity` is set. Allowed values: `soft` or `hard` | `""`                    |
+| `gateway.nodeAffinityPreset.key`                | Node label key to match. Ignored if `gateway.affinity` is set                                     | `""`                    |
+| `gateway.nodeAffinityPreset.values`             | Node label values to match. Ignored if `gateway.affinity` is set                                  | `[]`                    |
+| `gateway.affinity`                              | Affinity for Gateway pods assignment                                                              | `{}`                    |
+| `gateway.nodeSelector`                          | Node labels for Gateway pods assignment                                                           | `{}`                    |
+| `gateway.tolerations`                           | Tolerations for Gateway pods assignment                                                           | `[]`                    |
+| `gateway.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains   | `{}`                    |
+| `gateway.priorityClassName`                     | Gateway pods' priorityClassName                                                                   | `""`                    |
+| `gateway.schedulerName`                         | Kubernetes pod scheduler registry                                                                 | `""`                    |
+| `gateway.updateStrategy.type`                   | Gateway statefulset strategy type                                                                 | `RollingUpdate`         |
+| `gateway.updateStrategy.rollingUpdate`          | Gateway statefulset rolling update configuration parameters                                       | `{}`                    |
+| `gateway.extraVolumes`                          | Optionally specify extra list of additional volumes for the Gateway pod(s)                        | `[]`                    |
+| `gateway.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the Gateway container(s)             | `[]`                    |
+| `gateway.sidecars`                              | Add additional sidecar containers to the Gateway pod(s)                                           | `[]`                    |
+| `gateway.initContainers`                        | Add additional init containers to the Gateway pod(s)                                              | `[]`                    |
+
+
+### Gateway Traffic Exposure Parameters
+
+| Name                                       | Description                                                                                                                      | Value                    |
+| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
+| `gateway.service.type`                     | Gateway service type                                                                                                             | `ClusterIP`              |
+| `gateway.service.ports.http`               | Gateway HTTP service port                                                                                                        | `80`                     |
+| `gateway.service.nodePorts.http`           | Node port for HTTP                                                                                                               | `""`                     |
+| `gateway.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                                                                                      | `{}`                     |
+| `gateway.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin                                                                 | `None`                   |
+| `gateway.service.clusterIP`                | Gateway service Cluster IP                                                                                                       | `""`                     |
+| `gateway.service.loadBalancerIP`           | Gateway service Load Balancer IP                                                                                                 | `""`                     |
+| `gateway.service.loadBalancerSourceRanges` | Gateway service Load Balancer sources                                                                                            | `[]`                     |
+| `gateway.service.externalTrafficPolicy`    | Gateway service external traffic policy                                                                                          | `Cluster`                |
+| `gateway.service.annotations`              | Additional custom annotations for Gateway service                                                                                | `{}`                     |
+| `gateway.service.extraPorts`               | Extra ports to expose in the Gateway service                                                                                     | `[]`                     |
+| `gateway.ingress.enabled`                  | Enable ingress record generation for Loki Gateway                                                                                | `false`                  |
+| `gateway.ingress.pathType`                 | Ingress path type                                                                                                                | `ImplementationSpecific` |
+| `gateway.ingress.apiVersion`               | Force Ingress API version (automatically detected if not set)                                                                    | `""`                     |
+| `gateway.ingress.ingressClassName`         | IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)                                                    | `""`                     |
+| `gateway.ingress.hostname`                 | Default host for the ingress record                                                                                              | `grafana-loki.local`     |
+| `gateway.ingress.path`                     | Default path for the ingress record                                                                                              | `/`                      |
+| `gateway.ingress.annotations`              | Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. | `{}`                     |
+| `gateway.ingress.tls`                      | Enable TLS configuration for the host defined at `ingress.hostname` parameter                                                    | `false`                  |
+| `gateway.ingress.selfSigned`               | Create a TLS secret for this ingress record using self-signed certificates generated by Helm                                     | `false`                  |
+| `gateway.ingress.extraHosts`               | An array with additional hostname(s) to be covered with the ingress record                                                       | `[]`                     |
+| `gateway.ingress.extraPaths`               | An array with additional arbitrary paths that may need to be added to the ingress under the main host                            | `[]`                     |
+| `gateway.ingress.extraTls`                 | TLS configuration for additional hostname(s) to be covered with this ingress record                                              | `[]`                     |
+| `gateway.ingress.secrets`                  | Custom TLS certificates as secrets                                                                                               | `[]`                     |
+
+
+### index-gateway Deployment Parameters
+
+| Name                                                 | Description                                                                                            | Value           |
+| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | --------------- |
+| `indexGateway.enabled`                               | Enable index-gateway deployment                                                                        | `false`         |
+| `indexGateway.extraEnvVars`                          | Array with extra environment variables to add to indexGateway nodes                                    | `[]`            |
+| `indexGateway.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for indexGateway nodes                            | `""`            |
+| `indexGateway.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for indexGateway nodes                               | `""`            |
+| `indexGateway.command`                               | Override default container command (useful when using custom images)                                   | `[]`            |
+| `indexGateway.args`                                  | Override default container args (useful when using custom images)                                      | `[]`            |
+| `indexGateway.replicaCount`                          | Number of index-gateway replicas to deploy                                                             | `1`             |
+| `indexGateway.podManagementPolicy`                   | podManagementPolicy to manage scaling operation                                                        | `""`            |
+| `indexGateway.livenessProbe.enabled`                 | Enable livenessProbe on index-gateway nodes                                                            | `true`          |
+| `indexGateway.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                                | `60`            |
+| `indexGateway.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                       | `10`            |
+| `indexGateway.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                      | `1`             |
+| `indexGateway.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                                    | `3`             |
+| `indexGateway.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                                    | `1`             |
+| `indexGateway.readinessProbe.enabled`                | Enable readinessProbe on index-gateway nodes                                                           | `true`          |
+| `indexGateway.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                               | `60`            |
+| `indexGateway.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                      | `10`            |
+| `indexGateway.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                     | `1`             |
+| `indexGateway.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                                   | `3`             |
+| `indexGateway.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                                   | `1`             |
+| `indexGateway.startupProbe.enabled`                  | Enable startupProbe on index-gateway containers                                                        | `false`         |
+| `indexGateway.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                                 | `30`            |
+| `indexGateway.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                        | `10`            |
+| `indexGateway.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                       | `1`             |
+| `indexGateway.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                     | `15`            |
+| `indexGateway.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                     | `1`             |
+| `indexGateway.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                                    | `{}`            |
+| `indexGateway.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                                   | `{}`            |
+| `indexGateway.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                     | `{}`            |
+| `indexGateway.resources.limits`                      | The resources limits for the indexGateway containers                                                   | `{}`            |
+| `indexGateway.resources.requests`                    | The requested resources for the indexGateway containers                                                | `{}`            |
+| `indexGateway.podSecurityContext.enabled`            | Enabled index-gateway pods' Security Context                                                           | `true`          |
+| `indexGateway.podSecurityContext.fsGroup`            | Set index-gateway pod's Security Context fsGroup                                                       | `1001`          |
+| `indexGateway.containerSecurityContext.enabled`      | Enabled index-gateway containers' Security Context                                                     | `true`          |
+| `indexGateway.containerSecurityContext.runAsUser`    | Set index-gateway containers' Security Context runAsUser                                               | `1001`          |
+| `indexGateway.containerSecurityContext.runAsNonRoot` | Set index-gateway containers' Security Context runAsNonRoot                                            | `true`          |
+| `indexGateway.lifecycleHooks`                        | for the indexGateway container(s) to automate configuration before or after startup                    | `{}`            |
+| `indexGateway.hostAliases`                           | indexGateway pods host aliases                                                                         | `[]`            |
+| `indexGateway.podLabels`                             | Extra labels for indexGateway pods                                                                     | `{}`            |
+| `indexGateway.podAnnotations`                        | Annotations for indexGateway pods                                                                      | `{}`            |
+| `indexGateway.podAffinityPreset`                     | Pod affinity preset. Ignored if `indexGateway.affinity` is set. Allowed values: `soft` or `hard`       | `""`            |
+| `indexGateway.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `indexGateway.affinity` is set. Allowed values: `soft` or `hard`  | `soft`          |
+| `indexGateway.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `indexGateway.affinity` is set. Allowed values: `soft` or `hard` | `""`            |
+| `indexGateway.nodeAffinityPreset.key`                | Node label key to match. Ignored if `indexGateway.affinity` is set                                     | `""`            |
+| `indexGateway.nodeAffinityPreset.values`             | Node label values to match. Ignored if `indexGateway.affinity` is set                                  | `[]`            |
+| `indexGateway.affinity`                              | Affinity for index-gateway pods assignment                                                             | `{}`            |
+| `indexGateway.nodeSelector`                          | Node labels for index-gateway pods assignment                                                          | `{}`            |
+| `indexGateway.tolerations`                           | Tolerations for index-gateway pods assignment                                                          | `[]`            |
+| `indexGateway.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains        | `{}`            |
+| `indexGateway.priorityClassName`                     | index-gateway pods' priorityClassName                                                                  | `""`            |
+| `indexGateway.schedulerName`                         | Kubernetes pod scheduler registry                                                                      | `""`            |
+| `indexGateway.updateStrategy.type`                   | index-gateway statefulset strategy type                                                                | `RollingUpdate` |
+| `indexGateway.updateStrategy.rollingUpdate`          | index-gateway statefulset rolling update configuration parameters                                      | `{}`            |
+| `indexGateway.extraVolumes`                          | Optionally specify extra list of additional volumes for the index-gateway pod(s)                       | `[]`            |
+| `indexGateway.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the index-gateway container(s)            | `[]`            |
+| `indexGateway.sidecars`                              | Add additional sidecar containers to the index-gateway pod(s)                                          | `[]`            |
+| `indexGateway.initContainers`                        | Add additional init containers to the index-gateway pod(s)                                             | `[]`            |
+
+
+### index-gateway Traffic Exposure Parameters
+
+| Name                                            | Description                                                      | Value       |
+| ----------------------------------------------- | ---------------------------------------------------------------- | ----------- |
+| `indexGateway.service.type`                     | index-gateway service type                                       | `ClusterIP` |
+| `indexGateway.service.ports.http`               | index-gateway HTTP service port                                  | `3100`      |
+| `indexGateway.service.ports.grpc`               | index-gateway GRPC service port                                  | `9095`      |
+| `indexGateway.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `indexGateway.service.nodePorts.grpc`           | Node port for GRPC                                               | `""`        |
+| `indexGateway.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `indexGateway.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `indexGateway.service.clusterIP`                | index-gateway service Cluster IP                                 | `""`        |
+| `indexGateway.service.loadBalancerIP`           | index-gateway service Load Balancer IP                           | `""`        |
+| `indexGateway.service.loadBalancerSourceRanges` | index-gateway service Load Balancer sources                      | `[]`        |
+| `indexGateway.service.externalTrafficPolicy`    | index-gateway service external traffic policy                    | `Cluster`   |
+| `indexGateway.service.annotations`              | Additional custom annotations for index-gateway service          | `{}`        |
+| `indexGateway.service.extraPorts`               | Extra ports to expose in the index-gateway service               | `[]`        |
+
+
+### Distributor Deployment Parameters
+
+| Name                                                | Description                                                                                           | Value           |
+| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------- |
+| `distributor.extraEnvVars`                          | Array with extra environment variables to add to distributor nodes                                    | `[]`            |
+| `distributor.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for distributor nodes                            | `""`            |
+| `distributor.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for distributor nodes                               | `""`            |
+| `distributor.command`                               | Override default container command (useful when using custom images)                                  | `[]`            |
+| `distributor.args`                                  | Override default container args (useful when using custom images)                                     | `[]`            |
+| `distributor.replicaCount`                          | Number of Distributor replicas to deploy                                                              | `1`             |
+| `distributor.livenessProbe.enabled`                 | Enable livenessProbe on Distributor nodes                                                             | `true`          |
+| `distributor.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                               | `10`            |
+| `distributor.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                      | `10`            |
+| `distributor.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                     | `1`             |
+| `distributor.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                                   | `3`             |
+| `distributor.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                                   | `1`             |
+| `distributor.readinessProbe.enabled`                | Enable readinessProbe on Distributor nodes                                                            | `true`          |
+| `distributor.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                              | `10`            |
+| `distributor.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                     | `10`            |
+| `distributor.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                    | `1`             |
+| `distributor.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                                  | `3`             |
+| `distributor.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                                  | `1`             |
+| `distributor.startupProbe.enabled`                  | Enable startupProbe on Distributor containers                                                         | `false`         |
+| `distributor.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                                | `30`            |
+| `distributor.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                       | `10`            |
+| `distributor.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                      | `1`             |
+| `distributor.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                    | `15`            |
+| `distributor.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                    | `1`             |
+| `distributor.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                                   | `{}`            |
+| `distributor.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                                  | `{}`            |
+| `distributor.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                    | `{}`            |
+| `distributor.resources.limits`                      | The resources limits for the distributor containers                                                   | `{}`            |
+| `distributor.resources.requests`                    | The requested resources for the distributor containers                                                | `{}`            |
+| `distributor.podSecurityContext.enabled`            | Enabled Distributor pods' Security Context                                                            | `true`          |
+| `distributor.podSecurityContext.fsGroup`            | Set Distributor pod's Security Context fsGroup                                                        | `1001`          |
+| `distributor.containerSecurityContext.enabled`      | Enabled Distributor containers' Security Context                                                      | `true`          |
+| `distributor.containerSecurityContext.runAsUser`    | Set Distributor containers' Security Context runAsUser                                                | `1001`          |
+| `distributor.containerSecurityContext.runAsNonRoot` | Set Distributor containers' Security Context runAsNonRoot                                             | `true`          |
+| `distributor.lifecycleHooks`                        | for the distributor container(s) to automate configuration before or after startup                    | `{}`            |
+| `distributor.hostAliases`                           | distributor pods host aliases                                                                         | `[]`            |
+| `distributor.podLabels`                             | Extra labels for distributor pods                                                                     | `{}`            |
+| `distributor.podAnnotations`                        | Annotations for distributor pods                                                                      | `{}`            |
+| `distributor.podAffinityPreset`                     | Pod affinity preset. Ignored if `distributor.affinity` is set. Allowed values: `soft` or `hard`       | `""`            |
+| `distributor.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `distributor.affinity` is set. Allowed values: `soft` or `hard`  | `soft`          |
+| `distributor.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `distributor.affinity` is set. Allowed values: `soft` or `hard` | `""`            |
+| `distributor.nodeAffinityPreset.key`                | Node label key to match. Ignored if `distributor.affinity` is set                                     | `""`            |
+| `distributor.nodeAffinityPreset.values`             | Node label values to match. Ignored if `distributor.affinity` is set                                  | `[]`            |
+| `distributor.affinity`                              | Affinity for Distributor pods assignment                                                              | `{}`            |
+| `distributor.nodeSelector`                          | Node labels for Distributor pods assignment                                                           | `{}`            |
+| `distributor.tolerations`                           | Tolerations for Distributor pods assignment                                                           | `[]`            |
+| `distributor.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains       | `{}`            |
+| `distributor.priorityClassName`                     | Distributor pods' priorityClassName                                                                   | `""`            |
+| `distributor.schedulerName`                         | Kubernetes pod scheduler registry                                                                     | `""`            |
+| `distributor.updateStrategy.type`                   | Distributor statefulset strategy type                                                                 | `RollingUpdate` |
+| `distributor.updateStrategy.rollingUpdate`          | Distributor statefulset rolling update configuration parameters                                       | `{}`            |
+| `distributor.extraVolumes`                          | Optionally specify extra list of additional volumes for the Distributor pod(s)                        | `[]`            |
+| `distributor.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the Distributor container(s)             | `[]`            |
+| `distributor.sidecars`                              | Add additional sidecar containers to the Distributor pod(s)                                           | `[]`            |
+| `distributor.initContainers`                        | Add additional init containers to the Distributor pod(s)                                              | `[]`            |
+
+
+### Distributor Traffic Exposure Parameters
+
+| Name                                           | Description                                                      | Value       |
+| ---------------------------------------------- | ---------------------------------------------------------------- | ----------- |
+| `distributor.service.type`                     | Distributor service type                                         | `ClusterIP` |
+| `distributor.service.ports.http`               | Distributor HTTP service port                                    | `3100`      |
+| `distributor.service.ports.grpc`               | Distributor GRPC service port                                    | `9095`      |
+| `distributor.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `distributor.service.nodePorts.grpc`           | Node port for GRPC                                               | `""`        |
+| `distributor.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `distributor.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `distributor.service.clusterIP`                | Distributor service Cluster IP                                   | `""`        |
+| `distributor.service.loadBalancerIP`           | Distributor service Load Balancer IP                             | `""`        |
+| `distributor.service.loadBalancerSourceRanges` | Distributor service Load Balancer sources                        | `[]`        |
+| `distributor.service.externalTrafficPolicy`    | Distributor service external traffic policy                      | `Cluster`   |
+| `distributor.service.annotations`              | Additional custom annotations for Distributor service            | `{}`        |
+| `distributor.service.extraPorts`               | Extra ports to expose in the Distributor service                 | `[]`        |
+
+
+### Ingester Deployment Parameters
+
+| Name                                             | Description                                                                                        | Value           |
+| ------------------------------------------------ | -------------------------------------------------------------------------------------------------- | --------------- |
+| `ingester.extraEnvVars`                          | Array with extra environment variables to add to ingester nodes                                    | `[]`            |
+| `ingester.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for ingester nodes                            | `""`            |
+| `ingester.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for ingester nodes                               | `""`            |
+| `ingester.command`                               | Override default container command (useful when using custom images)                               | `[]`            |
+| `ingester.args`                                  | Override default container args (useful when using custom images)                                  | `[]`            |
+| `ingester.replicaCount`                          | Number of Ingester replicas to deploy                                                              | `1`             |
+| `ingester.livenessProbe.enabled`                 | Enable livenessProbe on Ingester nodes                                                             | `true`          |
+| `ingester.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                            | `10`            |
+| `ingester.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                   | `10`            |
+| `ingester.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                  | `1`             |
+| `ingester.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                                | `3`             |
+| `ingester.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                                | `1`             |
+| `ingester.readinessProbe.enabled`                | Enable readinessProbe on Ingester nodes                                                            | `true`          |
+| `ingester.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                           | `10`            |
+| `ingester.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                  | `10`            |
+| `ingester.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                 | `1`             |
+| `ingester.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                               | `3`             |
+| `ingester.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                               | `1`             |
+| `ingester.startupProbe.enabled`                  | Enable startupProbe on Ingester containers                                                         | `false`         |
+| `ingester.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                             | `30`            |
+| `ingester.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                    | `10`            |
+| `ingester.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                   | `1`             |
+| `ingester.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                 | `15`            |
+| `ingester.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                 | `1`             |
+| `ingester.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                                | `{}`            |
+| `ingester.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                               | `{}`            |
+| `ingester.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                 | `{}`            |
+| `ingester.lifecycleHooks`                        | for the ingester container(s) to automate configuration before or after startup                    | `{}`            |
+| `ingester.resources.limits`                      | The resources limits for the Ingester containers                                                   | `{}`            |
+| `ingester.resources.requests`                    | The requested resources for the Ingester containers                                                | `{}`            |
+| `ingester.podSecurityContext.enabled`            | Enabled Ingester pods' Security Context                                                            | `true`          |
+| `ingester.podSecurityContext.fsGroup`            | Set Ingester pod's Security Context fsGroup                                                        | `1001`          |
+| `ingester.containerSecurityContext.enabled`      | Enabled Ingester containers' Security Context                                                      | `true`          |
+| `ingester.containerSecurityContext.runAsUser`    | Set Ingester containers' Security Context runAsUser                                                | `1001`          |
+| `ingester.containerSecurityContext.runAsNonRoot` | Set Ingester containers' Security Context runAsNonRoot                                             | `true`          |
+| `ingester.hostAliases`                           | ingester pods host aliases                                                                         | `[]`            |
+| `ingester.podLabels`                             | Extra labels for ingester pods                                                                     | `{}`            |
+| `ingester.podAnnotations`                        | Annotations for ingester pods                                                                      | `{}`            |
+| `ingester.podAffinityPreset`                     | Pod affinity preset. Ignored if `ingester.affinity` is set. Allowed values: `soft` or `hard`       | `""`            |
+| `ingester.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `ingester.affinity` is set. Allowed values: `soft` or `hard`  | `soft`          |
+| `ingester.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `ingester.affinity` is set. Allowed values: `soft` or `hard` | `""`            |
+| `ingester.nodeAffinityPreset.key`                | Node label key to match. Ignored if `ingester.affinity` is set                                     | `""`            |
+| `ingester.nodeAffinityPreset.values`             | Node label values to match. Ignored if `ingester.affinity` is set                                  | `[]`            |
+| `ingester.affinity`                              | Affinity for ingester pods assignment                                                              | `{}`            |
+| `ingester.nodeSelector`                          | Node labels for Ingester pods assignment                                                           | `{}`            |
+| `ingester.tolerations`                           | Tolerations for Ingester pods assignment                                                           | `[]`            |
+| `ingester.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains    | `{}`            |
+| `ingester.podManagementPolicy`                   | podManagementPolicy to manage scaling operation                                                    | `""`            |
+| `ingester.priorityClassName`                     | Ingester pods' priorityClassName                                                                   | `""`            |
+| `ingester.schedulerName`                         | Kubernetes pod scheduler registry                                                                  | `""`            |
+| `ingester.updateStrategy.type`                   | Ingester statefulset strategy type                                                                 | `RollingUpdate` |
+| `ingester.updateStrategy.rollingUpdate`          | Ingester statefulset rolling update configuration parameters                                       | `{}`            |
+| `ingester.extraVolumes`                          | Optionally specify extra list of additional volumes for the Ingester pod(s)                        | `[]`            |
+| `ingester.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the ingester container(s)             | `[]`            |
+| `ingester.sidecars`                              | Add additional sidecar containers to the Ingester pod(s)                                           | `[]`            |
+| `ingester.initContainers`                        | Add additional init containers to the Ingester pod(s)                                              | `[]`            |
+
+
+### Ingester Persistence Parameters
+
+| Name                                | Description                                                             | Value               |
+| ----------------------------------- | ----------------------------------------------------------------------- | ------------------- |
+| `ingester.persistence.enabled`      | Enable persistence in Ingester instances                                | `true`              |
+| `ingester.persistence.storageClass` | PVC Storage Class for Memcached data volume                             | `""`                |
+| `ingester.persistence.subPath`      | The subdirectory of the volume to mount to                              | `""`                |
+| `ingester.persistence.accessModes`  | PVC Access modes                                                        | `["ReadWriteOnce"]` |
+| `ingester.persistence.size`         | PVC Storage Request for Memcached data volume                           | `8Gi`               |
+| `ingester.persistence.annotations`  | Additional PVC annotations                                              | `{}`                |
+| `ingester.persistence.selector`     | Selector to match an existing Persistent Volume for Ingester's data PVC | `{}`                |
+
+
+### Ingester Traffic Exposure Parameters
+
+| Name                                        | Description                                                      | Value       |
+| ------------------------------------------- | ---------------------------------------------------------------- | ----------- |
+| `ingester.service.type`                     | Ingester service type                                            | `ClusterIP` |
+| `ingester.service.ports.http`               | Ingester HTTP service port                                       | `3100`      |
+| `ingester.service.ports.grpc`               | Ingester GRPC service port                                       | `9095`      |
+| `ingester.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `ingester.service.nodePorts.grpc`           | Node port for GRPC                                               | `""`        |
+| `ingester.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `ingester.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `ingester.service.clusterIP`                | Ingester service Cluster IP                                      | `""`        |
+| `ingester.service.loadBalancerIP`           | Ingester service Load Balancer IP                                | `""`        |
+| `ingester.service.loadBalancerSourceRanges` | Ingester service Load Balancer sources                           | `[]`        |
+| `ingester.service.externalTrafficPolicy`    | Ingester service external traffic policy                         | `Cluster`   |
+| `ingester.service.annotations`              | Additional custom annotations for Ingester service               | `{}`        |
+| `ingester.service.extraPorts`               | Extra ports to expose in the Ingester service                    | `[]`        |
+
+
+### Querier Deployment Parameters
+
+| Name                                            | Description                                                                                       | Value           |
+| ----------------------------------------------- | ------------------------------------------------------------------------------------------------- | --------------- |
+| `querier.replicaCount`                          | Number of Querier replicas to deploy                                                              | `1`             |
+| `querier.extraEnvVars`                          | Array with extra environment variables to add to Querier nodes                                    | `[]`            |
+| `querier.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for Querier nodes                            | `""`            |
+| `querier.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for Querier nodes                               | `""`            |
+| `querier.command`                               | Override default container command (useful when using custom images)                              | `[]`            |
+| `querier.args`                                  | Override default container args (useful when using custom images)                                 | `[]`            |
+| `querier.podManagementPolicy`                   | podManagementPolicy to manage scaling operation                                                   | `""`            |
+| `querier.livenessProbe.enabled`                 | Enable livenessProbe on Querier nodes                                                             | `true`          |
+| `querier.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                           | `10`            |
+| `querier.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                  | `10`            |
+| `querier.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                 | `1`             |
+| `querier.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                               | `3`             |
+| `querier.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                               | `1`             |
+| `querier.readinessProbe.enabled`                | Enable readinessProbe on Querier nodes                                                            | `true`          |
+| `querier.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                          | `10`            |
+| `querier.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                 | `10`            |
+| `querier.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                | `1`             |
+| `querier.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                              | `3`             |
+| `querier.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                              | `1`             |
+| `querier.startupProbe.enabled`                  | Enable startupProbe on Querier containers                                                         | `false`         |
+| `querier.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                            | `30`            |
+| `querier.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                   | `10`            |
+| `querier.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                  | `1`             |
+| `querier.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                | `15`            |
+| `querier.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                | `1`             |
+| `querier.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                               | `{}`            |
+| `querier.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                              | `{}`            |
+| `querier.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                | `{}`            |
+| `querier.resources.limits`                      | The resources limits for the Querier containers                                                   | `{}`            |
+| `querier.resources.requests`                    | The requested resources for the Querier containers                                                | `{}`            |
+| `querier.podSecurityContext.enabled`            | Enabled Querier pods' Security Context                                                            | `true`          |
+| `querier.podSecurityContext.fsGroup`            | Set Querier pod's Security Context fsGroup                                                        | `1001`          |
+| `querier.containerSecurityContext.enabled`      | Enabled Querier containers' Security Context                                                      | `true`          |
+| `querier.containerSecurityContext.runAsUser`    | Set Querier containers' Security Context runAsUser                                                | `1001`          |
+| `querier.containerSecurityContext.runAsNonRoot` | Set Querier containers' Security Context runAsNonRoot                                             | `true`          |
+| `querier.lifecycleHooks`                        | for the Querier container(s) to automate configuration before or after startup                    | `{}`            |
+| `querier.hostAliases`                           | querier pods host aliases                                                                         | `[]`            |
+| `querier.podLabels`                             | Extra labels for querier pods                                                                     | `{}`            |
+| `querier.podAnnotations`                        | Annotations for querier pods                                                                      | `{}`            |
+| `querier.podAffinityPreset`                     | Pod affinity preset. Ignored if `querier.affinity` is set. Allowed values: `soft` or `hard`       | `""`            |
+| `querier.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `querier.affinity` is set. Allowed values: `soft` or `hard`  | `soft`          |
+| `querier.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `querier.affinity` is set. Allowed values: `soft` or `hard` | `""`            |
+| `querier.nodeAffinityPreset.key`                | Node label key to match. Ignored if `querier.affinity` is set                                     | `""`            |
+| `querier.nodeAffinityPreset.values`             | Node label values to match. Ignored if `querier.affinity` is set                                  | `[]`            |
+| `querier.affinity`                              | Affinity for Querier pods assignment                                                              | `{}`            |
+| `querier.nodeSelector`                          | Node labels for Querier pods assignment                                                           | `{}`            |
+| `querier.tolerations`                           | Tolerations for Querier pods assignment                                                           | `[]`            |
+| `querier.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains   | `{}`            |
+| `querier.priorityClassName`                     | Querier pods' priorityClassName                                                                   | `""`            |
+| `querier.schedulerName`                         | Kubernetes pod scheduler registry                                                                 | `""`            |
+| `querier.updateStrategy.type`                   | Querier statefulset strategy type                                                                 | `RollingUpdate` |
+| `querier.updateStrategy.rollingUpdate`          | Querier statefulset rolling update configuration parameters                                       | `{}`            |
+| `querier.extraVolumes`                          | Optionally specify extra list of additional volumes for the Querier pod(s)                        | `[]`            |
+| `querier.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the querier container(s)             | `[]`            |
+| `querier.sidecars`                              | Add additional sidecar containers to the Querier pod(s)                                           | `[]`            |
+| `querier.initContainers`                        | Add additional init containers to the Querier pod(s)                                              | `[]`            |
+
+
+### Querier Persistence Parameters
+
+| Name                               | Description                                                            | Value               |
+| ---------------------------------- | ---------------------------------------------------------------------- | ------------------- |
+| `querier.persistence.enabled`      | Enable persistence in Querier instances                                | `true`              |
+| `querier.persistence.storageClass` | PVC Storage Class for Memcached data volume                            | `""`                |
+| `querier.persistence.subPath`      | The subdirectory of the volume to mount to                             | `""`                |
+| `querier.persistence.accessModes`  | PVC Access modes                                                       | `["ReadWriteOnce"]` |
+| `querier.persistence.size`         | PVC Storage Request for Memcached data volume                          | `8Gi`               |
+| `querier.persistence.annotations`  | Additional PVC annotations                                             | `{}`                |
+| `querier.persistence.selector`     | Selector to match an existing Persistent Volume for Querier's data PVC | `{}`                |
+
+
+### Querier Traffic Exposure Parameters
+
+| Name                                       | Description                                                      | Value       |
+| ------------------------------------------ | ---------------------------------------------------------------- | ----------- |
+| `querier.service.type`                     | Querier service type                                             | `ClusterIP` |
+| `querier.service.ports.http`               | Querier HTTP service port                                        | `3100`      |
+| `querier.service.ports.grpc`               | Querier GRPC service port                                        | `9095`      |
+| `querier.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `querier.service.nodePorts.grpc`           | Node port for GRPC                                               | `""`        |
+| `querier.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `querier.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `querier.service.clusterIP`                | Querier service Cluster IP                                       | `""`        |
+| `querier.service.loadBalancerIP`           | Querier service Load Balancer IP                                 | `""`        |
+| `querier.service.loadBalancerSourceRanges` | Querier service Load Balancer sources                            | `[]`        |
+| `querier.service.externalTrafficPolicy`    | Querier service external traffic policy                          | `Cluster`   |
+| `querier.service.annotations`              | Additional custom annotations for Querier service                | `{}`        |
+| `querier.service.extraPorts`               | Extra ports to expose in the Querier service                     | `[]`        |
+
+
+### Query Frontend Deployment Parameters
+
+| Name                                                  | Description                                                                                             | Value           |
+| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------- |
+| `queryFrontend.extraEnvVars`                          | Array with extra environment variables to add to queryFrontend nodes                                    | `[]`            |
+| `queryFrontend.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for queryFrontend nodes                            | `""`            |
+| `queryFrontend.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for queryFrontend nodes                               | `""`            |
+| `queryFrontend.command`                               | Override default container command (useful when using custom images)                                    | `[]`            |
+| `queryFrontend.args`                                  | Override default container args (useful when using custom images)                                       | `[]`            |
+| `queryFrontend.replicaCount`                          | Number of queryFrontend replicas to deploy                                                              | `1`             |
+| `queryFrontend.livenessProbe.enabled`                 | Enable livenessProbe on queryFrontend nodes                                                             | `true`          |
+| `queryFrontend.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                                 | `10`            |
+| `queryFrontend.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                        | `10`            |
+| `queryFrontend.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                       | `1`             |
+| `queryFrontend.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                                     | `3`             |
+| `queryFrontend.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                                     | `1`             |
+| `queryFrontend.readinessProbe.enabled`                | Enable readinessProbe on queryFrontend nodes                                                            | `true`          |
+| `queryFrontend.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                                | `10`            |
+| `queryFrontend.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                       | `10`            |
+| `queryFrontend.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                      | `1`             |
+| `queryFrontend.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                                    | `3`             |
+| `queryFrontend.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                                    | `1`             |
+| `queryFrontend.startupProbe.enabled`                  | Enable startupProbe on queryFrontend containers                                                         | `false`         |
+| `queryFrontend.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                                  | `30`            |
+| `queryFrontend.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                         | `10`            |
+| `queryFrontend.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                        | `1`             |
+| `queryFrontend.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                      | `15`            |
+| `queryFrontend.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                      | `1`             |
+| `queryFrontend.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                                     | `{}`            |
+| `queryFrontend.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                                    | `{}`            |
+| `queryFrontend.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                      | `{}`            |
+| `queryFrontend.resources.limits`                      | The resources limits for the queryFrontend containers                                                   | `{}`            |
+| `queryFrontend.resources.requests`                    | The requested resources for the queryFrontend containers                                                | `{}`            |
+| `queryFrontend.podSecurityContext.enabled`            | Enabled queryFrontend pods' Security Context                                                            | `true`          |
+| `queryFrontend.podSecurityContext.fsGroup`            | Set queryFrontend pod's Security Context fsGroup                                                        | `1001`          |
+| `queryFrontend.containerSecurityContext.enabled`      | Enabled queryFrontend containers' Security Context                                                      | `true`          |
+| `queryFrontend.containerSecurityContext.runAsUser`    | Set queryFrontend containers' Security Context runAsUser                                                | `1001`          |
+| `queryFrontend.containerSecurityContext.runAsNonRoot` | Set queryFrontend containers' Security Context runAsNonRoot                                             | `true`          |
+| `queryFrontend.lifecycleHooks`                        | for the queryFrontend container(s) to automate configuration before or after startup                    | `{}`            |
+| `queryFrontend.hostAliases`                           | queryFrontend pods host aliases                                                                         | `[]`            |
+| `queryFrontend.podLabels`                             | Extra labels for queryFrontend pods                                                                     | `{}`            |
+| `queryFrontend.podAnnotations`                        | Annotations for queryFrontend pods                                                                      | `{}`            |
+| `queryFrontend.podAffinityPreset`                     | Pod affinity preset. Ignored if `queryFrontend.affinity` is set. Allowed values: `soft` or `hard`       | `""`            |
+| `queryFrontend.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `queryFrontend.affinity` is set. Allowed values: `soft` or `hard`  | `soft`          |
+| `queryFrontend.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `queryFrontend.affinity` is set. Allowed values: `soft` or `hard` | `""`            |
+| `queryFrontend.nodeAffinityPreset.key`                | Node label key to match. Ignored if `queryFrontend.affinity` is set                                     | `""`            |
+| `queryFrontend.nodeAffinityPreset.values`             | Node label values to match. Ignored if `queryFrontend.affinity` is set                                  | `[]`            |
+| `queryFrontend.affinity`                              | Affinity for queryFrontend pods assignment                                                              | `{}`            |
+| `queryFrontend.nodeSelector`                          | Node labels for queryFrontend pods assignment                                                           | `{}`            |
+| `queryFrontend.tolerations`                           | Tolerations for queryFrontend pods assignment                                                           | `[]`            |
+| `queryFrontend.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains         | `{}`            |
+| `queryFrontend.priorityClassName`                     | queryFrontend pods' priorityClassName                                                                   | `""`            |
+| `queryFrontend.schedulerName`                         | Kubernetes pod scheduler registry                                                                       | `""`            |
+| `queryFrontend.updateStrategy.type`                   | queryFrontend statefulset strategy type                                                                 | `RollingUpdate` |
+| `queryFrontend.updateStrategy.rollingUpdate`          | queryFrontend statefulset rolling update configuration parameters                                       | `{}`            |
+| `queryFrontend.extraVolumes`                          | Optionally specify extra list of additional volumes for the queryFrontend pod(s)                        | `[]`            |
+| `queryFrontend.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the queryFrontend container(s)             | `[]`            |
+| `queryFrontend.sidecars`                              | Add additional sidecar containers to the queryFrontend pod(s)                                           | `[]`            |
+| `queryFrontend.initContainers`                        | Add additional init containers to the queryFrontend pod(s)                                              | `[]`            |
+
+
+### Query Frontend Traffic Exposure Parameters
+
+| Name                                             | Description                                                      | Value       |
+| ------------------------------------------------ | ---------------------------------------------------------------- | ----------- |
+| `queryFrontend.service.type`                     | queryFrontend service type                                       | `ClusterIP` |
+| `queryFrontend.service.ports.http`               | queryFrontend HTTP service port                                  | `3100`      |
+| `queryFrontend.service.ports.grpc`               | queryFrontend GRPC service port                                  | `9095`      |
+| `queryFrontend.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `queryFrontend.service.nodePorts.grpc`           | Node port for GRPC                                               | `""`        |
+| `queryFrontend.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `queryFrontend.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `queryFrontend.service.clusterIP`                | queryFrontend service Cluster IP                                 | `""`        |
+| `queryFrontend.service.loadBalancerIP`           | queryFrontend service Load Balancer IP                           | `""`        |
+| `queryFrontend.service.loadBalancerSourceRanges` | queryFrontend service Load Balancer sources                      | `[]`        |
+| `queryFrontend.service.externalTrafficPolicy`    | queryFrontend service external traffic policy                    | `Cluster`   |
+| `queryFrontend.service.annotations`              | Additional custom annotations for queryFrontend service          | `{}`        |
+| `queryFrontend.service.extraPorts`               | Extra ports to expose in the queryFrontend service               | `[]`        |
+
+
+### Ruler Deployment Parameters
+
+| Name                                          | Description                                                                                     | Value           |
+| --------------------------------------------- | ----------------------------------------------------------------------------------------------- | --------------- |
+| `ruler.enabled`                               | Deploy ruler component                                                                          | `false`         |
+| `ruler.extraEnvVars`                          | Array with extra environment variables to add to ruler nodes                                    | `[]`            |
+| `ruler.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for ruler nodes                            | `""`            |
+| `ruler.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for ruler nodes                               | `""`            |
+| `ruler.command`                               | Override default container command (useful when using custom images)                            | `[]`            |
+| `ruler.args`                                  | Override default container args (useful when using custom images)                               | `[]`            |
+| `ruler.podManagementPolicy`                   | podManagementPolicy to manage scaling operation                                                 | `""`            |
+| `ruler.replicaCount`                          | Number of Ruler replicas to deploy                                                              | `1`             |
+| `ruler.livenessProbe.enabled`                 | Enable livenessProbe on Ruler nodes                                                             | `true`          |
+| `ruler.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                         | `10`            |
+| `ruler.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                | `10`            |
+| `ruler.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                               | `1`             |
+| `ruler.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                             | `3`             |
+| `ruler.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                             | `1`             |
+| `ruler.readinessProbe.enabled`                | Enable readinessProbe on Ruler nodes                                                            | `true`          |
+| `ruler.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                        | `10`            |
+| `ruler.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                               | `10`            |
+| `ruler.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                              | `1`             |
+| `ruler.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                            | `3`             |
+| `ruler.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                            | `1`             |
+| `ruler.startupProbe.enabled`                  | Enable startupProbe on Ruler containers                                                         | `false`         |
+| `ruler.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                          | `30`            |
+| `ruler.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                 | `10`            |
+| `ruler.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                | `1`             |
+| `ruler.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                              | `15`            |
+| `ruler.startupProbe.successThreshold`         | Success threshold for startupProbe                                                              | `1`             |
+| `ruler.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                             | `{}`            |
+| `ruler.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                            | `{}`            |
+| `ruler.customStartupProbe`                    | Custom startupProbe that overrides the default one                                              | `{}`            |
+| `ruler.lifecycleHooks`                        | for the ruler container(s) to automate configuration before or after startup                    | `{}`            |
+| `ruler.resources.limits`                      | The resources limits for the Ruler containers                                                   | `{}`            |
+| `ruler.resources.requests`                    | The requested resources for the Ruler containers                                                | `{}`            |
+| `ruler.podSecurityContext.enabled`            | Enabled Ruler pods' Security Context                                                            | `true`          |
+| `ruler.podSecurityContext.fsGroup`            | Set Ruler pod's Security Context fsGroup                                                        | `1001`          |
+| `ruler.containerSecurityContext.enabled`      | Enabled Ruler containers' Security Context                                                      | `true`          |
+| `ruler.containerSecurityContext.runAsUser`    | Set Ruler containers' Security Context runAsUser                                                | `1001`          |
+| `ruler.containerSecurityContext.runAsNonRoot` | Set Ruler containers' Security Context runAsNonRoot                                             | `true`          |
+| `ruler.hostAliases`                           | ruler pods host aliases                                                                         | `[]`            |
+| `ruler.podLabels`                             | Extra labels for ruler pods                                                                     | `{}`            |
+| `ruler.podAnnotations`                        | Annotations for ruler pods                                                                      | `{}`            |
+| `ruler.podAffinityPreset`                     | Pod affinity preset. Ignored if `ruler.affinity` is set. Allowed values: `soft` or `hard`       | `""`            |
+| `ruler.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `ruler.affinity` is set. Allowed values: `soft` or `hard`  | `soft`          |
+| `ruler.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `ruler.affinity` is set. Allowed values: `soft` or `hard` | `""`            |
+| `ruler.nodeAffinityPreset.key`                | Node label key to match. Ignored if `ruler.affinity` is set                                     | `""`            |
+| `ruler.nodeAffinityPreset.values`             | Node label values to match. Ignored if `ruler.affinity` is set                                  | `[]`            |
+| `ruler.affinity`                              | Affinity for ruler pods assignment                                                              | `{}`            |
+| `ruler.nodeSelector`                          | Node labels for Ruler pods assignment                                                           | `{}`            |
+| `ruler.tolerations`                           | Tolerations for Ruler pods assignment                                                           | `[]`            |
+| `ruler.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains | `{}`            |
+| `ruler.priorityClassName`                     | Ruler pods' priorityClassName                                                                   | `""`            |
+| `ruler.schedulerName`                         | Kubernetes pod scheduler registry                                                               | `""`            |
+| `ruler.updateStrategy.type`                   | Ruler statefulset strategy type                                                                 | `RollingUpdate` |
+| `ruler.updateStrategy.rollingUpdate`          | Ruler statefulset rolling update configuration parameters                                       | `{}`            |
+| `ruler.extraVolumes`                          | Optionally specify extra list of additional volumes for the Ruler pod(s)                        | `[]`            |
+| `ruler.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the ruler container(s)             | `[]`            |
+| `ruler.sidecars`                              | Add additional sidecar containers to the Ruler pod(s)                                           | `[]`            |
+| `ruler.initContainers`                        | Add additional init containers to the Ruler pod(s)                                              | `[]`            |
+
+
+### Ruler Persistence Parameters
+
+| Name                             | Description                                                          | Value               |
+| -------------------------------- | -------------------------------------------------------------------- | ------------------- |
+| `ruler.persistence.enabled`      | Enable persistence in Ruler instances                                | `true`              |
+| `ruler.persistence.storageClass` | PVC Storage Class for Memcached data volume                          | `""`                |
+| `ruler.persistence.subPath`      | The subdirectory of the volume to mount to                           | `""`                |
+| `ruler.persistence.accessModes`  | PVC Access modes                                                     | `["ReadWriteOnce"]` |
+| `ruler.persistence.size`         | PVC Storage Request for Memcached data volume                        | `8Gi`               |
+| `ruler.persistence.annotations`  | Additional PVC annotations                                           | `{}`                |
+| `ruler.persistence.selector`     | Selector to match an existing Persistent Volume for Ruler's data PVC | `{}`                |
+
+
+### Ruler Traffic Exposure Parameters
+
+| Name                                     | Description                                                      | Value       |
+| ---------------------------------------- | ---------------------------------------------------------------- | ----------- |
+| `ruler.service.type`                     | Ruler service type                                               | `ClusterIP` |
+| `ruler.service.ports.http`               | Ruler HTTP service port                                          | `3100`      |
+| `ruler.service.ports.grpc`               | Ruler GRPC service port                                          | `9095`      |
+| `ruler.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `ruler.service.nodePorts.grpc`           | Node port for GRPC                                               | `""`        |
+| `ruler.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `ruler.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `ruler.service.clusterIP`                | Ruler service Cluster IP                                         | `""`        |
+| `ruler.service.loadBalancerIP`           | Ruler service Load Balancer IP                                   | `""`        |
+| `ruler.service.loadBalancerSourceRanges` | Ruler service Load Balancer sources                              | `[]`        |
+| `ruler.service.externalTrafficPolicy`    | Ruler service external traffic policy                            | `Cluster`   |
+| `ruler.service.annotations`              | Additional custom annotations for Ruler service                  | `{}`        |
+| `ruler.service.extraPorts`               | Extra ports to expose in the Ruler service                       | `[]`        |
+
+
+### table-manager Deployment Parameters
+
+| Name                                                 | Description                                                                                            | Value           |
+| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | --------------- |
+| `tableManager.enabled`                               | Deploy table-manager                                                                                   | `false`         |
+| `tableManager.extraEnvVars`                          | Array with extra environment variables to add to tableManager nodes                                    | `[]`            |
+| `tableManager.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for tableManager nodes                            | `""`            |
+| `tableManager.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for tableManager nodes                               | `""`            |
+| `tableManager.command`                               | Override default container command (useful when using custom images)                                   | `[]`            |
+| `tableManager.args`                                  | Override default container args (useful when using custom images)                                      | `[]`            |
+| `tableManager.replicaCount`                          | Number of table-manager replicas to deploy                                                             | `1`             |
+| `tableManager.livenessProbe.enabled`                 | Enable livenessProbe on table-manager nodes                                                            | `true`          |
+| `tableManager.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                                | `10`            |
+| `tableManager.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                       | `10`            |
+| `tableManager.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                      | `1`             |
+| `tableManager.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                                    | `3`             |
+| `tableManager.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                                    | `1`             |
+| `tableManager.readinessProbe.enabled`                | Enable readinessProbe on table-manager nodes                                                           | `true`          |
+| `tableManager.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                               | `10`            |
+| `tableManager.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                      | `10`            |
+| `tableManager.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                     | `1`             |
+| `tableManager.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                                   | `3`             |
+| `tableManager.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                                   | `1`             |
+| `tableManager.startupProbe.enabled`                  | Enable startupProbe on table-manager containers                                                        | `false`         |
+| `tableManager.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                                 | `30`            |
+| `tableManager.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                        | `10`            |
+| `tableManager.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                       | `1`             |
+| `tableManager.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                     | `15`            |
+| `tableManager.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                     | `1`             |
+| `tableManager.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                                    | `{}`            |
+| `tableManager.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                                   | `{}`            |
+| `tableManager.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                     | `{}`            |
+| `tableManager.resources.limits`                      | The resources limits for the tableManager containers                                                   | `{}`            |
+| `tableManager.resources.requests`                    | The requested resources for the tableManager containers                                                | `{}`            |
+| `tableManager.podSecurityContext.enabled`            | Enabled table-manager pods' Security Context                                                           | `true`          |
+| `tableManager.podSecurityContext.fsGroup`            | Set table-manager pod's Security Context fsGroup                                                       | `1001`          |
+| `tableManager.containerSecurityContext.enabled`      | Enabled table-manager containers' Security Context                                                     | `true`          |
+| `tableManager.containerSecurityContext.runAsUser`    | Set table-manager containers' Security Context runAsUser                                               | `1001`          |
+| `tableManager.containerSecurityContext.runAsNonRoot` | Set table-manager containers' Security Context runAsNonRoot                                            | `true`          |
+| `tableManager.lifecycleHooks`                        | for the tableManager container(s) to automate configuration before or after startup                    | `{}`            |
+| `tableManager.hostAliases`                           | tableManager pods host aliases                                                                         | `[]`            |
+| `tableManager.podLabels`                             | Extra labels for tableManager pods                                                                     | `{}`            |
+| `tableManager.podAnnotations`                        | Annotations for tableManager pods                                                                      | `{}`            |
+| `tableManager.podAffinityPreset`                     | Pod affinity preset. Ignored if `tableManager.affinity` is set. Allowed values: `soft` or `hard`       | `""`            |
+| `tableManager.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `tableManager.affinity` is set. Allowed values: `soft` or `hard`  | `soft`          |
+| `tableManager.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `tableManager.affinity` is set. Allowed values: `soft` or `hard` | `""`            |
+| `tableManager.nodeAffinityPreset.key`                | Node label key to match. Ignored if `tableManager.affinity` is set                                     | `""`            |
+| `tableManager.nodeAffinityPreset.values`             | Node label values to match. Ignored if `tableManager.affinity` is set                                  | `[]`            |
+| `tableManager.affinity`                              | Affinity for table-manager pods assignment                                                             | `{}`            |
+| `tableManager.nodeSelector`                          | Node labels for table-manager pods assignment                                                          | `{}`            |
+| `tableManager.tolerations`                           | Tolerations for table-manager pods assignment                                                          | `[]`            |
+| `tableManager.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains        | `{}`            |
+| `tableManager.priorityClassName`                     | table-manager pods' priorityClassName                                                                  | `""`            |
+| `tableManager.schedulerName`                         | Kubernetes pod scheduler registry                                                                      | `""`            |
+| `tableManager.updateStrategy.type`                   | table-manager statefulset strategy type                                                                | `RollingUpdate` |
+| `tableManager.updateStrategy.rollingUpdate`          | table-manager statefulset rolling update configuration parameters                                      | `{}`            |
+| `tableManager.extraVolumes`                          | Optionally specify extra list of additional volumes for the table-manager pod(s)                       | `[]`            |
+| `tableManager.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the table-manager container(s)            | `[]`            |
+| `tableManager.sidecars`                              | Add additional sidecar containers to the table-manager pod(s)                                          | `[]`            |
+| `tableManager.initContainers`                        | Add additional init containers to the table-manager pod(s)                                             | `[]`            |
+
+
+### table-manager Traffic Exposure Parameters
+
+| Name                                            | Description                                                      | Value       |
+| ----------------------------------------------- | ---------------------------------------------------------------- | ----------- |
+| `tableManager.service.type`                     | table-manager service type                                       | `ClusterIP` |
+| `tableManager.service.ports.http`               | table-manager HTTP service port                                  | `3100`      |
+| `tableManager.service.ports.grpc`               | table-manager GRPC service port                                  | `9095`      |
+| `tableManager.service.nodePorts.http`           | Node port for HTTP                                               | `""`        |
+| `tableManager.service.nodePorts.grpc`           | Node port for GRPC                                               | `""`        |
+| `tableManager.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                      | `{}`        |
+| `tableManager.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin | `None`      |
+| `tableManager.service.clusterIP`                | table-manager service Cluster IP                                 | `""`        |
+| `tableManager.service.loadBalancerIP`           | table-manager service Load Balancer IP                           | `""`        |
+| `tableManager.service.loadBalancerSourceRanges` | table-manager service Load Balancer sources                      | `[]`        |
+| `tableManager.service.externalTrafficPolicy`    | table-manager service external traffic policy                    | `Cluster`   |
+| `tableManager.service.annotations`              | Additional custom annotations for table-manager service          | `{}`        |
+| `tableManager.service.extraPorts`               | Extra ports to expose in the table-manager service               | `[]`        |
+
+
+### Promtail Deployment Parameters
+
+| Name                                             | Description                                                                                        | Value                |
+| ------------------------------------------------ | -------------------------------------------------------------------------------------------------- | -------------------- |
+| `promtail.image.registry`                        | Grafana Promtail image registry                                                                    | `docker.io`          |
+| `promtail.image.repository`                      | Grafana Promtail image repository                                                                  | `bitnami/promtail`   |
+| `promtail.image.tag`                             | Grafana Promtail image tag (immutable tags are recommended)                                        | `2.5.0-debian-10-r3` |
+| `promtail.image.pullPolicy`                      | Grafana Promtail image pull policy                                                                 | `IfNotPresent`       |
+| `promtail.image.pullSecrets`                     | Grafana Promtail image pull secrets                                                                | `[]`                 |
+| `promtail.extraEnvVars`                          | Array with extra environment variables to add to promtail nodes                                    | `[]`                 |
+| `promtail.extraEnvVarsCM`                        | Name of existing ConfigMap containing extra env vars for promtail nodes                            | `""`                 |
+| `promtail.extraEnvVarsSecret`                    | Name of existing Secret containing extra env vars for promtail nodes                               | `""`                 |
+| `promtail.command`                               | Override default container command (useful when using custom images)                               | `[]`                 |
+| `promtail.args`                                  | Override default container args (useful when using custom images)                                  | `[]`                 |
+| `promtail.containerPorts.http`                   | Promtail HTTP port                                                                                 | `8080`               |
+| `promtail.livenessProbe.enabled`                 | Enable livenessProbe on Promtail nodes                                                             | `true`               |
+| `promtail.livenessProbe.initialDelaySeconds`     | Initial delay seconds for livenessProbe                                                            | `10`                 |
+| `promtail.livenessProbe.periodSeconds`           | Period seconds for livenessProbe                                                                   | `10`                 |
+| `promtail.livenessProbe.timeoutSeconds`          | Timeout seconds for livenessProbe                                                                  | `1`                  |
+| `promtail.livenessProbe.failureThreshold`        | Failure threshold for livenessProbe                                                                | `3`                  |
+| `promtail.livenessProbe.successThreshold`        | Success threshold for livenessProbe                                                                | `1`                  |
+| `promtail.readinessProbe.enabled`                | Enable readinessProbe on Promtail nodes                                                            | `true`               |
+| `promtail.readinessProbe.initialDelaySeconds`    | Initial delay seconds for readinessProbe                                                           | `10`                 |
+| `promtail.readinessProbe.periodSeconds`          | Period seconds for readinessProbe                                                                  | `10`                 |
+| `promtail.readinessProbe.timeoutSeconds`         | Timeout seconds for readinessProbe                                                                 | `1`                  |
+| `promtail.readinessProbe.failureThreshold`       | Failure threshold for readinessProbe                                                               | `3`                  |
+| `promtail.readinessProbe.successThreshold`       | Success threshold for readinessProbe                                                               | `1`                  |
+| `promtail.startupProbe.enabled`                  | Enable startupProbe on Promtail containers                                                         | `false`              |
+| `promtail.startupProbe.initialDelaySeconds`      | Initial delay seconds for startupProbe                                                             | `30`                 |
+| `promtail.startupProbe.periodSeconds`            | Period seconds for startupProbe                                                                    | `10`                 |
+| `promtail.startupProbe.timeoutSeconds`           | Timeout seconds for startupProbe                                                                   | `1`                  |
+| `promtail.startupProbe.failureThreshold`         | Failure threshold for startupProbe                                                                 | `15`                 |
+| `promtail.startupProbe.successThreshold`         | Success threshold for startupProbe                                                                 | `1`                  |
+| `promtail.customLivenessProbe`                   | Custom livenessProbe that overrides the default one                                                | `{}`                 |
+| `promtail.customReadinessProbe`                  | Custom readinessProbe that overrides the default one                                               | `{}`                 |
+| `promtail.customStartupProbe`                    | Custom startupProbe that overrides the default one                                                 | `{}`                 |
+| `promtail.lifecycleHooks`                        | for the promtail container(s) to automate configuration before or after startup                    | `{}`                 |
+| `promtail.resources.limits`                      | The resources limits for the Promtail containers                                                   | `{}`                 |
+| `promtail.resources.requests`                    | The requested resources for the Promtail containers                                                | `{}`                 |
+| `promtail.podSecurityContext.enabled`            | Enabled Promtail pods' Security Context                                                            | `true`               |
+| `promtail.podSecurityContext.fsGroup`            | Set Promtail pod's Security Context fsGroup                                                        | `0`                  |
+| `promtail.containerSecurityContext.enabled`      | Enabled Promtail containers' Security Context                                                      | `true`               |
+| `promtail.containerSecurityContext.runAsUser`    | Set Promtail containers' Security Context runAsUser                                                | `0`                  |
+| `promtail.containerSecurityContext.runAsNonRoot` | Set Promtail containers' Security Context runAsNonRoot                                             | `false`              |
+| `promtail.hostAliases`                           | promtail pods host aliases                                                                         | `[]`                 |
+| `promtail.podLabels`                             | Extra labels for promtail pods                                                                     | `{}`                 |
+| `promtail.podAnnotations`                        | Annotations for promtail pods                                                                      | `{}`                 |
+| `promtail.podAffinityPreset`                     | Pod affinity preset. Ignored if `promtail.affinity` is set. Allowed values: `soft` or `hard`       | `""`                 |
+| `promtail.podAntiAffinityPreset`                 | Pod anti-affinity preset. Ignored if `promtail.affinity` is set. Allowed values: `soft` or `hard`  | `soft`               |
+| `promtail.nodeAffinityPreset.type`               | Node affinity preset type. Ignored if `promtail.affinity` is set. Allowed values: `soft` or `hard` | `""`                 |
+| `promtail.nodeAffinityPreset.key`                | Node label key to match. Ignored if `promtail.affinity` is set                                     | `""`                 |
+| `promtail.nodeAffinityPreset.values`             | Node label values to match. Ignored if `promtail.affinity` is set                                  | `[]`                 |
+| `promtail.affinity`                              | Affinity for promtail pods assignment                                                              | `{}`                 |
+| `promtail.nodeSelector`                          | Node labels for Promtail pods assignment                                                           | `{}`                 |
+| `promtail.tolerations`                           | Tolerations for Promtail pods assignment                                                           | `[]`                 |
+| `promtail.topologySpreadConstraints`             | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains    | `{}`                 |
+| `promtail.priorityClassName`                     | Promtail pods' priorityClassName                                                                   | `""`                 |
+| `promtail.schedulerName`                         | Kubernetes pod scheduler registry                                                                  | `""`                 |
+| `promtail.updateStrategy.type`                   | Promtail statefulset strategy type                                                                 | `RollingUpdate`      |
+| `promtail.updateStrategy.rollingUpdate`          | Promtail statefulset rolling update configuration parameters                                       | `{}`                 |
+| `promtail.extraVolumes`                          | Optionally specify extra list of additional volumes for the Promtail pod(s)                        | `[]`                 |
+| `promtail.extraVolumeMounts`                     | Optionally specify extra list of additional volumeMounts for the promtail container(s)             | `[]`                 |
+| `promtail.sidecars`                              | Add additional sidecar containers to the Promtail pod(s)                                           | `[]`                 |
+| `promtail.initContainers`                        | Add additional init containers to the Promtail pod(s)                                              | `[]`                 |
+| `promtail.configuration`                         | Promtail configuration                                                                             | `""`                 |
+| `promtail.existingSecret`                        | Name of a Secret that contains the Promtail configuration                                          | `""`                 |
+| `promtail.logLevel`                              | Promtail logging level                                                                             | `info`               |
+
+
+### Promtail Traffic Exposure Parameters
+
+| Name                                                   | Description                                                                     | Value       |
+| ------------------------------------------------------ | ------------------------------------------------------------------------------- | ----------- |
+| `promtail.service.type`                                | Promtail service type                                                           | `ClusterIP` |
+| `promtail.service.ports.http`                          | Promtail HTTP service port                                                      | `3100`      |
+| `promtail.service.nodePorts.http`                      | Node port for HTTP                                                              | `""`        |
+| `promtail.service.sessionAffinityConfig`               | Additional settings for the sessionAffinity                                     | `{}`        |
+| `promtail.service.sessionAffinity`                     | Control where client requests go, to the same pod or round-robin                | `None`      |
+| `promtail.service.clusterIP`                           | Promtail service Cluster IP                                                     | `""`        |
+| `promtail.service.loadBalancerIP`                      | Promtail service Load Balancer IP                                               | `""`        |
+| `promtail.service.loadBalancerSourceRanges`            | Promtail service Load Balancer sources                                          | `[]`        |
+| `promtail.service.externalTrafficPolicy`               | Promtail service external traffic policy                                        | `Cluster`   |
+| `promtail.service.annotations`                         | Additional custom annotations for Promtail service                              | `{}`        |
+| `promtail.service.extraPorts`                          | Extra ports to expose in the Promtail service                                   | `[]`        |
+| `promtail.rbac.create`                                 | Create RBAC rules                                                               | `true`      |
+| `promtail.serviceAccount.create`                       | Enable creation of ServiceAccount for Promtail pods                             | `true`      |
+| `promtail.serviceAccount.name`                         | The name of the ServiceAccount to use                                           | `""`        |
+| `promtail.serviceAccount.automountServiceAccountToken` | Allows auto mount of ServiceAccountToken on the promtail.serviceAccount.created | `true`      |
+| `promtail.serviceAccount.annotations`                  | Additional custom annotations for the ServiceAccount                            | `{}`        |
+
+
+### Init Container Parameters
+
+| Name                                                   | Description                                                                                     | Value                   |
+| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | ----------------------- |
+| `volumePermissions.enabled`                            | Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup` | `false`                 |
+| `volumePermissions.image.registry`                     | Bitnami Shell image registry                                                                    | `docker.io`             |
+| `volumePermissions.image.repository`                   | Bitnami Shell image repository                                                                  | `bitnami/bitnami-shell` |
+| `volumePermissions.image.tag`                          | Bitnami Shell image tag (immutable tags are recommended)                                        | `10-debian-10-r429`     |
+| `volumePermissions.image.pullPolicy`                   | Bitnami Shell image pull policy                                                                 | `IfNotPresent`          |
+| `volumePermissions.image.pullSecrets`                  | Bitnami Shell image pull secrets                                                                | `[]`                    |
+| `volumePermissions.resources.limits`                   | The resources limits for the init container                                                     | `{}`                    |
+| `volumePermissions.resources.requests`                 | The requested resources for the init container                                                  | `{}`                    |
+| `volumePermissions.containerSecurityContext.runAsUser` | Set init container's Security Context runAsUser                                                 | `0`                     |
+
+
+### Other Parameters
+
+| Name                                          | Description                                                            | Value   |
+| --------------------------------------------- | ---------------------------------------------------------------------- | ------- |
+| `serviceAccount.create`                       | Enable creation of ServiceAccount for Loki pods                        | `false` |
+| `serviceAccount.name`                         | The name of the ServiceAccount to use                                  | `""`    |
+| `serviceAccount.automountServiceAccountToken` | Allows auto mount of ServiceAccountToken on the serviceAccount created | `true`  |
+| `serviceAccount.annotations`                  | Additional custom annotations for the ServiceAccount                   | `{}`    |
+
+
+### Metrics Parameters
+
+| Name                                       | Description                                                                           | Value   |
+| ------------------------------------------ | ------------------------------------------------------------------------------------- | ------- |
+| `metrics.enabled`                          | Enable metrics                                                                        | `false` |
+| `metrics.serviceMonitor.enabled`           | Create ServiceMonitor Resource for scraping metrics using Prometheus Operator         | `false` |
+| `metrics.serviceMonitor.namespace`         | Namespace for the ServiceMonitor Resource (defaults to the Release Namespace)         | `""`    |
+| `metrics.serviceMonitor.interval`          | Interval at which metrics should be scraped.                                          | `""`    |
+| `metrics.serviceMonitor.scrapeTimeout`     | Timeout after which the scrape is ended                                               | `""`    |
+| `metrics.serviceMonitor.labels`            | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}`    |
+| `metrics.serviceMonitor.selector`          | Prometheus instance selector labels                                                   | `{}`    |
+| `metrics.serviceMonitor.relabelings`       | RelabelConfigs to apply to samples before scraping                                    | `[]`    |
+| `metrics.serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion                             | `[]`    |
+| `metrics.serviceMonitor.honorLabels`       | Specify honorLabels parameter to add the scrape endpoint                              | `false` |
+| `metrics.serviceMonitor.jobLabel`          | The name of the label on the target service to use as the job name in prometheus.     | `""`    |
+
+
+### External Memcached (Chunks) Parameters
+
+| Name                           | Description                                   | Value   |
+| ------------------------------ | --------------------------------------------- | ------- |
+| `externalMemcachedChunks.host` | Host of a running external memcached instance | `""`    |
+| `externalMemcachedChunks.port` | Port of a running external memcached instance | `11211` |
+
+
+### Memcached Sub-chart Parameters (Chunks)
+
+| Name                                      | Description                | Value               |
+| ----------------------------------------- | -------------------------- | ------------------- |
+| `memcachedchunks.enabled`                 | Deploy memcached sub-chart | `true`              |
+| `memcachedchunks.nameOverride`            | override the subchart name | `""`                |
+| `memcachedchunks.architecture`            | Memcached architecture     | `high-availability` |
+| `memcachedchunks.service.ports.memcached` | Memcached service port     | `11211`             |
+
+
+### External Memcached (Frontend) Parameters
+
+| Name                             | Description                                   | Value   |
+| -------------------------------- | --------------------------------------------- | ------- |
+| `externalMemcachedFrontend.host` | Host of a running external memcached instance | `""`    |
+| `externalMemcachedFrontend.port` | Port of a running external memcached instance | `11211` |
+
+
+### Memcached Sub-chart Parameters (Frontend)
+
+| Name                                        | Description                | Value               |
+| ------------------------------------------- | -------------------------- | ------------------- |
+| `memcachedfrontend.enabled`                 | Deploy memcached sub-chart | `true`              |
+| `memcachedfrontend.architecture`            | Memcached architecture     | `high-availability` |
+| `memcachedfrontend.nameOverride`            | override the subchart name | `""`                |
+| `memcachedfrontend.service.ports.memcached` | Memcached service port     | `11211`             |
+
+
+### External Memcached (Index-Queries) Parameters
+
+| Name                                 | Description                                   | Value   |
+| ------------------------------------ | --------------------------------------------- | ------- |
+| `externalMemcachedIndexQueries.host` | Host of a running external memcached instance | `""`    |
+| `externalMemcachedIndexQueries.port` | Port of a running external memcached instance | `11211` |
+
+
+### Memcached Sub-chart Parameters (Index-Queries)
+
+| Name                                            | Description                | Value               |
+| ----------------------------------------------- | -------------------------- | ------------------- |
+| `memcachedindexqueries.enabled`                 | Deploy memcached sub-chart | `true`              |
+| `memcachedindexqueries.architecture`            | Memcached architecture     | `high-availability` |
+| `memcachedindexqueries.nameOverride`            | override the subchart name | `""`                |
+| `memcachedindexqueries.service.ports.memcached` | Memcached service port     | `11211`             |
+
+
+### External Memcached (IndexWrites) Parameters
+
+| Name                                | Description                                   | Value   |
+| ----------------------------------- | --------------------------------------------- | ------- |
+| `externalMemcachedIndexWrites.host` | Host of a running external memcached instance | `""`    |
+| `externalMemcachedIndexWrites.port` | Port of a running external memcached instance | `11211` |
+
+
+### Memcached Sub-chart Parameters (Index-Writes)
+
+| Name                                           | Description                | Value               |
+| ---------------------------------------------- | -------------------------- | ------------------- |
+| `memcachedindexwrites.enabled`                 | Deploy memcached sub-chart | `false`             |
+| `memcachedindexwrites.architecture`            | Memcached architecture     | `high-availability` |
+| `memcachedindexwrites.nameOverride`            | override the subchart name | `""`                |
+| `memcachedindexwrites.service.ports.memcached` | Memcached service port     | `11211`             |
+
+
+See https://github.com/bitnami-labs/readme-generator-for-helm to create the table
+
+The above parameters map to the env variables defined in [bitnami/grafana-loki](https://github.com/bitnami/bitnami-docker-grafana-loki). For more information please refer to the [bitnami/grafana-loki](https://github.com/bitnami/bitnami-docker-grafana-loki) image documentation.
+
+Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
+
+```console
+helm install my-release \
+  --set loki.traces.jaeger.grpc=true \
+  bitnami/grafana-loki
+```
+
+The above command enables the Jaeger GRPC traces.
+
+Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example,
+
+```console
+helm install my-release -f values.yaml bitnami/grafana-loki
+```
+
+> **Tip**: You can use the default [values.yaml](values.yaml)
+
+## Configuration and installation details
+
+### [Rolling VS Immutable tags](https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/)
+
+It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image.
+
+Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist.
+### Loki configuration
+
+The loki configuration file `loki.yaml` is shared across the different components: `distributor`, `compactor`, `ingester`, `querier` and `queryFrontend`. This is set in the `loki.configuration` value. Check the official [Loki Grafana documentation](https://grafana.com/docs/loki/latest/configuration/) for the list of possible configurations.
+
+## Persistence
+
+The [Bitnami grafana-loki](https://github.com/bitnami/bitnami-docker-grafana-loki) image stores the grafana-loki `ingester` data at the `/bitnami` path of the container. Persistent Volume Claims are used to keep the data across deployments.
+
+### Additional environment variables
+
+In case you want to add extra environment variables (useful for advanced operations like custom init scripts), you can use the `extraEnvVars` property inside each of the subsections: `distributor`, `compactor`, `ingester`, `querier`, `queryFrontend` and `vulture`.
+
+```yaml
+compactor:
+  extraEnvVars:
+    - name: LOG_LEVEL
+      value: error
+
+distributor:
+  extraEnvVars:
+    - name: LOG_LEVEL
+      value: error
+
+ingester:
+  extraEnvVars:
+    - name: LOG_LEVEL
+      value: error
+
+querier:
+  extraEnvVars:
+    - name: LOG_LEVEL
+      value: error
+
+queryFrontend:
+  extraEnvVars:
+    - name: LOG_LEVEL
+      value: error
+
+vulture:
+  extraEnvVars:
+    - name: LOG_LEVEL
+      value: error
+```
+
+Alternatively, you can use a ConfigMap or a Secret with the environment variables. To do so, use the `extraEnvVarsCM` or the `extraEnvVarsSecret` values.
+
+### Sidecars
+
+If additional containers are needed in the same pod as grafana-loki (such as additional metrics or logging exporters), they can be defined using the `sidecars` parameter inside each of the subsections: `distributor`, `compactor`, `ingester`, `querier`, `queryFrontend` and `vulture` . If these sidecars export extra ports, extra port definitions can be added using the `service.extraPorts` parameter. [Learn more about configuring and using sidecar containers](https://docs.bitnami.com/kubernetes/infrastructure/grafana-loki/configuration/configure-sidecar-init-containers/).
+
+### Pod affinity
+
+This chart allows you to set your custom affinity using the `affinity` parameter. Find more information about Pod affinity in the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity).
+
+As an alternative, use one of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/master/bitnami/common#affinities) chart. To do so, set the `podAffinityPreset`, `podAntiAffinityPreset`, or `nodeAffinityPreset` parameters inside each of the subsections: `distributor`, `compactor`, `ingester`, `querier`, `queryFrontend` and `vulture`.
+
+### External cache support
+
+You may want to have Grafana Loki connect to an external Memcached rather than installing one inside your cluster. Typical reasons for this are to use a managed cache service, or to share a common cache server for all your applications. To achieve this, the chart allows you to specify credentials for an external database with the [`externalMemcached` parameter](#parameters). You should also disable the Memcached installation with the `memcached.enabled` option. Here is an example:
+
+```console
+memcached.enabled=false
+externalMemcached.host=myexternalhost
+externalMemcached.port=11211
+```
+
+## Troubleshooting
+
+Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues).
+
+## Upgrading
+
+### To 1.0.0
+
+This major release renames several values in this chart and adds missing features, in order to be inline with the rest of assets in the Bitnami charts repository.
+
+- `loki.containerPort`, `loki.grpcContainerPort` and `loki.gossipRing.containerPort` have been regrouped under the `loki.containerPorts` map.
+- `queryFrontend.query.jaegerMetricsContainerPort` and `queryFrontend.query.jaegerUIContainerPort` have been regrouped under the `queryFrontend.query.containerPorts` map.
+- `vulture.containerPort` has been regrouped under the `vulture.containerPorts` map.
+- `XXX.service.port` and `XXX.service.grpcPort` have been regrouped under the `XXX.service.ports` map.
+
+Additionally updates the Memcached subchart to its newest major `6.x.x`, which contains similar changes.
+
+## License
+
+Copyright &copy; 2022 Bitnami
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.

+ 102 - 0
bitnami/grafana-loki/templates/NOTES.txt

@@ -0,0 +1,102 @@
+CHART NAME: {{ .Chart.Name }}
+CHART VERSION: {{ .Chart.Version }}
+APP VERSION: {{ .Chart.AppVersion }}
+
+** Please be patient while the chart is being deployed **
+
+{{- if .Values.diagnosticMode.enabled }}
+The chart has been deployed in diagnostic mode. All probes have been disabled and the command has been overwritten with:
+
+  command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 4 }}
+  args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 4 }}
+
+Get the list of pods by executing:
+
+  kubectl get pods --namespace {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }}
+
+Access the pod you want to debug by executing
+
+  kubectl exec --namespace {{ .Release.Namespace }} -ti <NAME OF THE POD> -- bash
+
+In order to replicate the container startup execute this command:
+
+    loki -config.file=/bitnami/grafana-loki/conf/loki.yaml
+
+{{- else }}
+
+Installed components:
+
+  * ingester
+  * distributor
+  * querier
+  * query-frontend
+  * promtail
+  {{- if .Values.compactor.enabled }}
+  * compactor
+  {{- end }}
+  {{- if .Values.indexGateway.enabled }}
+  * index-gateway
+  {{- end }}
+  {{- if .Values.gateway.enabled }}
+  * gateway
+  {{- end }}
+  {{- if .Values.ruler.enabled }}
+  * ruler
+  {{- end }}
+  {{- if .Values.tableManager.enabled }}
+  * table-manager
+  {{- end }}
+
+{{- if .Values.gateway.enabled }}
+{{- if .Values.gateway.ingress.enabled }}
+
+1. Get the gateway URL and associate the gateway hostname to your cluster external IP:
+
+   export CLUSTER_IP=$(minikube ip) # On Minikube. Use: `kubectl cluster-info` on others K8s clusters
+   echo "Gateway URL: http{{ if .Values.gateway.ingress.tls }}s{{ end }}://{{ .Values.gateway.ingress.hostname }}/"
+   echo "$CLUSTER_IP  {{ .Values.gateway.ingress.hostname }}" | sudo tee -a /etc/hosts
+{{- else }}
+
+1. Get the gateway URL by running these commands:
+
+{{- if contains "NodePort" .Values.gateway.service.type }}
+    export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "grafana-loki.gateway.fullname" . }})
+    export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+    echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.gateway.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ template "common.names.fullname" . }}
+    export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "common.names.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+    echo http://$SERVICE_IP:{{ .Values.gateway.service.ports.http }}
+{{- else if contains "ClusterIP" .Values.gateway.service.type }}
+    echo "The Gateway is available at http://127.0.0.1:{{ .Values.gateway.service.ports.http }}"
+    kubectl port-forward svc/{{ template "grafana-loki.gateway.fullname" . }} {{ .Values.gateway.service.ports.http }}:{{ .Values.gateway.service.ports.http }} &
+{{- end }}
+{{- end }}
+{{- if .Values.gateway.auth.enabled }}
+2. Login with the following credentials below to see your blog:
+
+  echo Username: {{ .Values.gateway.auth.username }}
+  echo Password: $(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "grafana-loki.gateway.secretName" . }} -o jsonpath="{.data.password}" | base64 --decode)
+{{- end }}
+{{- else }}
+1. Get the query-frontend URL by running these commands:
+
+{{- if contains "NodePort" .Values.queryFrontend.service.type }}
+    export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "grafana-loki.query-frontend.fullname" . }})
+    export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+    echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.queryFrontend.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ template "common.names.fullname" . }}
+    export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "common.names.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+    echo http://$SERVICE_IP:{{ .Values.queryFrontend.service.ports.http }}
+{{- else if contains "ClusterIP" .Values.queryFrontend.service.type }}
+    echo "The Query Frontend is available at http://127.0.0.1:{{ .Values.queryFrontend.service.ports.http }}"
+    kubectl port-forward svc/{{ template "grafana-loki.query-frontend.fullname" . }} {{ .Values.queryFrontend.service.ports.http }}:{{ .Values.queryFrontend.service.ports.http }} &
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{- include "grafana-loki.checkRollingTags" . }}
+{{- include "grafana-loki.validateValues" . }}

+ 337 - 0
bitnami/grafana-loki/templates/_helpers.tpl

@@ -0,0 +1,337 @@
+{{/*
+Return the proper Grafana Loki image name
+*/}}
+{{- define "grafana-loki.image" -}}
+{{ include "common.images.image" (dict "imageRoot" .Values.loki.image "global" .Values.global) }}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki compactor fullname
+*/}}
+{{- define "grafana-loki.compactor.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "compactor" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki distributor fullname
+*/}}
+{{- define "grafana-loki.distributor.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "distributor" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki gateway fullname
+*/}}
+{{- define "grafana-loki.gateway.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "gateway" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki index-gateway fullname
+*/}}
+{{- define "grafana-loki.index-gateway.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "index-gateway" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki ingester fullname
+*/}}
+{{- define "grafana-loki.ingester.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "ingester" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki querier fullname
+*/}}
+{{- define "grafana-loki.querier.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "querier" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki query-frontend fullname
+*/}}
+{{- define "grafana-loki.query-frontend.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "query-frontend" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki ruler fullname
+*/}}
+{{- define "grafana-loki.ruler.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "ruler" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki table-manager fullname
+*/}}
+{{- define "grafana-loki.table-manager.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "table-manager" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki gossip-ring fullname
+*/}}
+{{- define "grafana-loki.gossip-ring.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "gossip-ring" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki promtail fullname
+*/}}
+{{- define "grafana-loki.promtail.fullname" -}}
+{{- printf "%s-%s" (include "common.names.fullname" .) "promtail" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki image name
+*/}}
+{{- define "grafana-loki.promtail.image" -}}
+{{ include "common.images.image" (dict "imageRoot" .Values.promtail.image "global" .Values.global) }}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki image name
+*/}}
+{{- define "grafana-loki.volumePermissions.image" -}}
+{{ include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) }}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Loki image name
+*/}}
+{{- define "grafana-loki.gateway.image" -}}
+{{ include "common.images.image" (dict "imageRoot" .Values.gateway.image "global" .Values.global) }}
+{{- end -}}
+
+{{/*
+Return the proper Docker Image Registry Secret Names
+*/}}
+{{- define "grafana-loki.imagePullSecrets" -}}
+{{- include "common.images.pullSecrets" (dict "images" (list .Values.loki.image .Values.gateway.image .Values.promtail.image .Values.volumePermissions.image) "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "grafana-loki.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+    {{ default (printf "%s" (include "common.names.fullname" .)) .Values.serviceAccount.name }}
+{{- else -}}
+    {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Get the Loki configuration configmap.
+*/}}
+{{- define "grafana-loki.loki.configmapName" -}}
+{{- if .Values.loki.existingConfigmap -}}
+    {{- .Values.loki.existingConfigmap -}}
+{{- else }}
+    {{- printf "%s" (include "common.names.fullname" . ) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Get the promtail configuration configmap.
+*/}}
+{{- define "grafana-loki.promtail.secretName" -}}
+{{- if .Values.promtail.existingSecret -}}
+    {{- .Values.promtail.existingSecret -}}
+{{- else }}
+    {{- include "grafana-loki.promtail.fullname" .  -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Get the promtail configuration configmap.
+*/}}
+{{- define "grafana-loki.gateway.secretName" -}}
+{{- if .Values.gateway.auth.existingSecret -}}
+    {{- .Values.gateway.auth.existingSecret -}}
+{{- else }}
+    {{- include "grafana-loki.gateway.fullname" .  -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "grafana-loki.promtail.serviceAccountName" -}}
+{{- if .Values.promtail.serviceAccount.create -}}
+    {{ default (printf "%s" (include "common.names.fullname" .)) .Values.promtail.serviceAccount.name }}
+{{- else -}}
+    {{ default "default" .Values.promtail.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (chunks) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-chunks.fullname" -}}
+{{- $name := default "memcachedchunks" .Values.memcachedchunks.nameOverride -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (chunks) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-chunks.host" -}}
+{{- $port := "" -}}
+{{- if .Values.externalMemcachedChunks.host -}}
+  {{- $servicePortString := printf "%v" .Values.externalMemcachedChunks.port -}}
+  {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" .Values.externalMemcachedChunks.host $port }}
+{{- else -}}
+  {{- $servicePortString := printf "%v" .Values.memcachedchunks.service.ports.memcached -}}
+  {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" (include "grafana-loki.memcached-chunks.fullname" .) $port }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (index-queries) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-index-queries.fullname" -}}
+{{- $name := default "memcachedindexqueries" .Values.memcachedindexqueries.nameOverride -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (index-queries) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-index-queries.host" -}}
+{{- $port := "" -}}
+{{- if .Values.externalMemcachedIndexQueries.host -}}
+  {{- $servicePortString := printf "%v" .Values.externalMemcachedIndexQueries.port -}}
+    {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" .Values.externalMemcachedIndexQueries.host $port }}
+{{- else -}}
+  {{- $servicePortString := printf "%v" .Values.memcachedindexqueries.service.ports.memcached -}}
+    {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" (include "grafana-loki.memcached-index-queries.fullname" .) $port }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (frontend) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-frontend.fullname" -}}
+{{- $name := default "memcachedfrontend" .Values.memcachedfrontend.nameOverride -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (frontend) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-frontend.host" -}}
+{{- $port := "" -}}
+{{- if .Values.externalMemcachedFrontend.host -}}
+  {{- $servicePortString := printf "%v" .Values.externalMemcachedFrontend.port -}}
+  {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" .Values.externalMemcachedFrontend.host $port }}
+{{- else -}}
+  {{- $servicePortString := printf "%v" .Values.memcachedfrontend.service.ports.memcached -}}
+  {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" (include "grafana-loki.memcached-frontend.fullname" .) $port }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (index-writes) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-index-writes.fullname" -}}
+{{- $name := default "memcachedindexwrites" .Values.memcachedindexwrites.nameOverride -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified memcached (index-writes) name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "grafana-loki.memcached-index-writes.host" -}}
+{{- $port := "" -}}
+{{- if .Values.externalMemcachedIndexWrites.host -}}
+  {{- $servicePortString := printf "%v" .Values.externalMemcachedIndexWrites.port -}}
+  {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" .Values.externalMemcachedIndexWrites.host $port }}
+{{- else -}}
+  {{- $servicePortString := printf "%v" .Values.memcachedindexwrites.service.ports.memcached -}}
+  {{- $port = printf ":%s" $servicePortString -}}
+  {{- printf "%s%s" (include "grafana-loki.memcached-index-writes.fullname" .) $port }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Check if there are rolling tags in the images
+*/}}
+{{- define "grafana-loki.checkRollingTags" -}}
+{{- include "common.warnings.rollingTag" .Values.loki.image }}
+{{- include "common.warnings.rollingTag" .Values.promtail.image }}
+{{- include "common.warnings.rollingTag" .Values.gateway.image }}
+{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }}
+{{- end -}}
+
+{{/*
+Compile all warnings into a single message.
+*/}}
+{{- define "grafana-loki.validateValues" -}}
+{{- $messages := list -}}
+{{- $messages := append $messages (include "grafana-loki.validateValues.memcachedChunks" .) -}}
+{{- $messages := append $messages (include "grafana-loki.validateValues.memcachedIndexWrites" .) -}}
+{{- $messages := append $messages (include "grafana-loki.validateValues.memcachedIndexQueries" .) -}}
+{{- $messages := append $messages (include "grafana-loki.validateValues.memcachedFrontend" .) -}}
+{{- $messages := without $messages "" -}}
+{{- $message := join "\n" $messages -}}
+
+{{- if $message -}}
+{{-   printf "\nVALUES VALIDATION:\n%s" $message -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana Loki - Memcached (Chunks) */}}
+{{- define "grafana-loki.validateValues.memcachedChunks" -}}
+{{- if and .Values.memcachedchunks.enabled .Values.externalMemcachedChunks.host -}}
+grafana-loki: Memcached Chunks
+    You can only use one chunk cache.
+    Please choose installing a Memcached chart (--set memcachedChunks.enabled=true) or
+    using an external database (--set externalMemcachedChunks.host)
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana Loki - Memcached (IndexWrites) */}}
+{{- define "grafana-loki.validateValues.memcachedIndexWrites" -}}
+{{- if and .Values.memcachedindexwrites.enabled .Values.externalMemcachedIndexWrites.host -}}
+grafana-loki: Memcached Index Writes
+    You can only use one index-write cache.
+    Please choose installing a Memcached chart (--set memcachedIndexWrites.enabled=true) or
+    using an external database (--set externalMemcachedIndexWrites.host)
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana Loki - Memcached (IndexQueries) */}}
+{{- define "grafana-loki.validateValues.memcachedIndexQueries" -}}
+{{- if and .Values.memcachedindexqueries.enabled .Values.externalMemcachedIndexQueries.host -}}
+grafana-loki: Memcached Index Queries
+    You can only use one chunk cache.
+    Please choose installing a Memcached chart (--set memcachedIndexQueries.enabled=true) or
+    using an external database (--set externalMemcachedIndexQueries.host)
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana Loki - Memcached (Frontend) */}}
+{{- define "grafana-loki.validateValues.memcachedFrontend" -}}
+{{- if and .Values.memcachedfrontend.enabled .Values.externalMemcachedFrontend.host -}}
+grafana-loki: Memcached Frontend
+    You can only use one frontend cache.
+    Please choose installing a Memcached chart (--set memcachedFrontend.enabled=true) or
+    using an external database (--set externalMemcachedFrontend.host)
+{{- end -}}
+{{- end -}}

+ 171 - 0
bitnami/grafana-loki/templates/compactor/deployment.yaml

@@ -0,0 +1,171 @@
+{{- if .Values.compactor.enabled }}
+apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+  name: {{ template "grafana-loki.compactor.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: compactor
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.compactor.replicaCount }}
+  {{- if .Values.compactor.updateStrategy }}
+  strategy: {{- toYaml .Values.compactor.updateStrategy | nindent 4 }}
+  {{- end }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: compactor
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.compactor.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.compactor.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: compactor
+        loki-gossip-member: "true"
+        {{- if .Values.compactor.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.compactor.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.compactor.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.compactor.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.compactor.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.compactor.podAffinityPreset "component" "compactor" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.compactor.podAntiAffinityPreset "component" "compactor" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.compactor.nodeAffinityPreset.type "key" .Values.compactor.nodeAffinityPreset.key "values" .Values.compactor.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.compactor.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.compactor.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.compactor.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.compactor.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.compactor.priorityClassName }}
+      priorityClassName: {{ .Values.compactor.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.compactor.schedulerName }}
+      schedulerName: {{ .Values.compactor.schedulerName }}
+      {{- end }}
+      {{- if .Values.compactor.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.compactor.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.compactor.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.compactor.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-compactor
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.compactor.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.compactor.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.compactor.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.compactor.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=compactor
+            - -config.file={{ .Values.loki.dataDir }}/conf/loki.yaml
+            - -boltdb.shipper.compactor.working-directory={{ .Values.loki.dataDir }}/loki/compactor
+          {{- end }}
+          {{- if .Values.compactor.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.compactor.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.compactor.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.compactor.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.compactor.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.gossipRing }}
+              name: http-memberlist
+          {{- if .Values.compactor.resources }}
+          resources: {{- toYaml .Values.compactor.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.compactor.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.compactor.livenessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.compactor.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.compactor.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.compactor.readinessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.compactor.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.compactor.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.compactor.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.compactor.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.compactor.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: {{ .Values.loki.dataDir }}/conf/loki.yaml
+              subPath: loki.yaml
+            - name: data
+              mountPath: {{ .Values.loki.dataDir }}/loki/compactor
+          {{- if .Values.compactor.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.compactor.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.compactor.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.compactor.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: data
+          {{- if .Values.compactor.persistence.enabled }}
+          persistentVolumeClaim:
+            claimName: {{ .Values.compactor.persistence.existingClaim | default (include "grafana-loki.compactor.fullname" .) }}
+          {{- else }}
+          emptyDir: {}
+          {{- end }}
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.compactor.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.compactor.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+{{- end }}

+ 35 - 0
bitnami/grafana-loki/templates/compactor/pvc.yaml

@@ -0,0 +1,35 @@
+{{- if and .Values.compactor.enabled .Values.compactor.persistence.enabled (not .Values.compactor.persistence.existingClaim) }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: {{ include "common.names.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.compactor.persistence.annotations .Values.commonAnnotations }}
+  annotations:
+    {{- if .Values.compactor.persistence.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.compactor.persistence.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  accessModes:
+  {{- range .Values.compactor.persistence.accessModes }}
+    - {{ . | quote }}
+  {{- end }}
+  resources:
+    requests:
+      storage: {{ .Values.compactor.persistence.size | quote }}
+  {{- include "common.storage.class" (dict "persistence" .Values.compactor.persistence "global" .Values.global) | nindent 2 }}
+  {{- if .Values.compactor.persistence.dataSource }}
+  dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.persistence.dataSource "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.compactor.persistence.selector }}
+  selector: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.persistence.selector "context" $) | nindent 4 }}
+  {{- end }}
+{{- end }}

+ 58 - 0
bitnami/grafana-loki/templates/compactor/service.yaml

@@ -0,0 +1,58 @@
+{{- if .Values.compactor.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.compactor.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: compactor
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.compactor.service.annotations }}
+  annotations:
+    {{- if .Values.compactor.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.compactor.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.compactor.service.type }}
+  {{- if .Values.compactor.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.compactor.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.compactor.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.compactor.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.compactor.service.clusterIP }}
+  clusterIP: {{ .Values.compactor.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.compactor.service.type "LoadBalancer") (eq .Values.compactor.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.compactor.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.compactor.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.compactor.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.compactor.service.type "LoadBalancer") (not (empty .Values.compactor.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.compactor.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.compactor.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.compactor.service.type "NodePort") (eq .Values.compactor.service.type "LoadBalancer")) (not (empty .Values.compactor.service.nodePorts.http))) }}
+      nodePort: {{ .Values.compactor.service.nodePorts.http }}
+      {{- else if eq .Values.compactor.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.compactor.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.compactor.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: compactor
+{{- end }}

+ 56 - 0
bitnami/grafana-loki/templates/compactor/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.compactor.enabled .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.compactor.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: compactor
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: compactor
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 163 - 0
bitnami/grafana-loki/templates/distributor/deployment.yaml

@@ -0,0 +1,163 @@
+apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+  name: {{ template "grafana-loki.distributor.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: distributor
+    loki-gossip-member: "true"
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.distributor.replicaCount }}
+  {{- if .Values.distributor.updateStrategy }}
+  strategy: {{- toYaml .Values.distributor.updateStrategy | nindent 4 }}
+  {{- end }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: distributor
+      loki-gossip-member: "true"
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.distributor.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.distributor.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: distributor
+        loki-gossip-member: "true"
+        {{- if .Values.distributor.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.distributor.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.distributor.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.distributor.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.distributor.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.distributor.podAffinityPreset "component" "distributor" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.distributor.podAntiAffinityPreset "component" "distributor" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.distributor.nodeAffinityPreset.type "key" .Values.distributor.nodeAffinityPreset.key "values" .Values.distributor.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.distributor.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.distributor.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.distributor.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.distributor.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.distributor.priorityClassName }}
+      priorityClassName: {{ .Values.distributor.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.distributor.schedulerName }}
+      schedulerName: {{ .Values.distributor.schedulerName }}
+      {{- end }}
+      {{- if .Values.distributor.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.distributor.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.distributor.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.distributor.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-distributor
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.distributor.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.distributor.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.distributor.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.distributor.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=distributor
+            - -config.file={{ .Values.loki.dataDir }}/conf/loki.yaml
+          {{- end }}
+          {{- if .Values.distributor.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.distributor.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.distributor.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.distributor.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.distributor.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.gossipRing }}
+              name: http-memberlist
+            - containerPort: {{ .Values.loki.containerPorts.grpc }}
+              name: grpc
+          {{- if .Values.distributor.resources }}
+          resources: {{- toYaml .Values.distributor.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.distributor.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.distributor.livenessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.distributor.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.distributor.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.distributor.readinessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.distributor.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.distributor.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.distributor.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.distributor.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.distributor.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: {{ .Values.loki.dataDir }}/conf/loki.yaml
+              subPath: loki.yaml
+          {{- if .Values.distributor.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.distributor.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.distributor.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.distributor.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.distributor.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.distributor.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}

+ 65 - 0
bitnami/grafana-loki/templates/distributor/service.yaml

@@ -0,0 +1,65 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.distributor.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: distributor
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.distributor.service.annotations }}
+  annotations:
+    {{- if .Values.distributor.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.distributor.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.distributor.service.type }}
+  {{- if .Values.distributor.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.distributor.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.distributor.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.distributor.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.distributor.service.clusterIP }}
+  clusterIP: {{ .Values.distributor.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.distributor.service.type "LoadBalancer") (eq .Values.distributor.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.distributor.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.distributor.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.distributor.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.distributor.service.type "LoadBalancer") (not (empty .Values.distributor.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.distributor.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.distributor.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.distributor.service.type "NodePort") (eq .Values.distributor.service.type "LoadBalancer")) (not (empty .Values.distributor.service.nodePorts.http))) }}
+      nodePort: {{ .Values.distributor.service.nodePorts.http }}
+      {{- else if eq .Values.distributor.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    - name: grpc
+      port: {{ .Values.distributor.service.ports.grpc }}
+      protocol: TCP
+      targetPort: grpc
+      {{- if (and (or (eq .Values.distributor.service.type "NodePort") (eq .Values.distributor.service.type "LoadBalancer")) (not (empty .Values.distributor.service.nodePorts.grpc))) }}
+      nodePort: {{ .Values.distributor.service.nodePorts.grpc }}
+      {{- else if eq .Values.distributor.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.distributor.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.distributor.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: distributor

+ 56 - 0
bitnami/grafana-loki/templates/distributor/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.distributor.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: distributor
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: distributor
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 4 - 0
bitnami/grafana-loki/templates/extra-list.yaml

@@ -0,0 +1,4 @@
+{{- range .Values.extraDeploy }}
+---
+{{ include "common.tplvalues.render" (dict "value" . "context" $) }}
+{{- end }}

+ 109 - 0
bitnami/grafana-loki/templates/gateway/configmap-http.yaml

@@ -0,0 +1,109 @@
+{{- if .Values.gateway.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "grafana-loki.gateway.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: gateway
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+data:
+  nginx.conf: |+
+      worker_processes  5;  ## Default: 1
+      error_log  /dev/stderr;
+      pid        /tmp/nginx.pid;
+      worker_rlimit_nofile 8192;
+
+      events {
+        worker_connections  4096;  ## Default: 1024
+      }
+
+      http {
+        client_body_temp_path /tmp/client_temp;
+        proxy_temp_path       /tmp/proxy_temp_path;
+        fastcgi_temp_path     /tmp/fastcgi_temp;
+        uwsgi_temp_path       /tmp/uwsgi_temp;
+        scgi_temp_path        /tmp/scgi_temp;
+
+        default_type application/octet-stream;
+        log_format  main '$remote_addr - $remote_user [$time_local]  $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
+
+        include /opt/bitnami/nginx/conf/resolvers.conf;
+
+        {{- if .Values.gateway.verboseLogging }}
+        access_log   /dev/stderr  main;
+        {{- else }}
+
+        map $status $loggable {
+          ~^[23]  0;
+          default 1;
+        }
+        access_log   /dev/stderr  main  if=$loggable;
+        {{- end }}
+
+        sendfile     on;
+        tcp_nopush   on;
+
+        server {
+          listen             8080;
+
+          {{- if .Values.gateway.auth.enabled }}
+          auth_basic           "Loki";
+          auth_basic_user_file /bitnami/nginx/secrets/.htpasswd;
+          {{- end }}
+
+          location = / {
+            return 200 'OK';
+            auth_basic off;
+          }
+
+          location = /api/prom/push {
+            proxy_pass       http://{{ include "grafana-loki.distributor.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+
+          location = /api/prom/tail {
+            proxy_pass       http://{{ include "grafana-loki.querier.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+            proxy_set_header Upgrade $http_upgrade;
+            proxy_set_header Connection "upgrade";
+          }
+
+          # Ruler
+          location ~ /prometheus/api/v1/alerts.* {
+            proxy_pass       http://{{ include "grafana-loki.ruler.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+          location ~ /prometheus/api/v1/rules.* {
+            proxy_pass       http://{{ include "grafana-loki.ruler.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+          location ~ /api/prom/rules.* {
+            proxy_pass       http://{{ include "grafana-loki.ruler.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+          location ~ /api/prom/alerts.* {
+            proxy_pass       http://{{ include "grafana-loki.ruler.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+
+          location ~ /api/prom/.* {
+            proxy_pass       http://{{ include "grafana-loki.query-frontend.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+
+          location = /loki/api/v1/push {
+            proxy_pass       http://{{ include "grafana-loki.distributor.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+
+          location = /loki/api/v1/tail {
+            proxy_pass       http://{{ include "grafana-loki.querier.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+            proxy_set_header Upgrade $http_upgrade;
+            proxy_set_header Connection "upgrade";
+          }
+
+          location ~ /loki/api/.* {
+            proxy_pass       http://{{ include "grafana-loki.query-frontend.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:3100$request_uri;
+          }
+        }
+      }
+{{- end }}

+ 178 - 0
bitnami/grafana-loki/templates/gateway/deployment.yaml

@@ -0,0 +1,178 @@
+{{- if .Values.gateway.enabled }}
+apiVersion: {{ template "common.capabilities.deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+  name: {{ include "grafana-loki.gateway.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: gateway
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.gateway.replicaCount }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: gateway
+  {{- if .Values.gateway.updateStrategy }}
+  strategy: {{- toYaml .Values.gateway.updateStrategy | nindent 4 }}
+  {{- end }}
+  template:
+    metadata:
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        {{- if .Values.commonLabels }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 8 }}
+        {{- end }}
+        {{- if .Values.gateway.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.gateway.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: gateway
+      annotations:
+        checksum/configmap: {{ include (print $.Template.BasePath "/gateway/configmap-http.yaml") . | sha256sum }}
+        {{- if .Values.gateway.podAnnotations }}
+        annotations: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.gateway.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.gateway.affinity }}
+      affinity: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.gateway.podAffinityPreset "component" "gateway" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.gateway.podAntiAffinityPreset "component" "gateway" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.gateway.nodeAffinityPreset.type "key" .Values.gateway.nodeAffinityPreset.key "values" .Values.gateway.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.gateway.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.gateway.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.tolerations "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.gateway.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.gateway.priorityClassName }}
+      priorityClassName: {{ .Values.gateway.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.gateway.schedulerName }}
+      schedulerName: {{ .Values.gateway.schedulerName }}
+      {{- end }}
+      {{- if .Values.gateway.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.gateway.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      {{- if .Values.gateway.initContainers }}
+      initContainers: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.initContainers "context" $) | nindent 8 }}
+      {{- end }}
+      containers:
+        - name: gateway
+          image: {{ include "grafana-loki.gateway.image" . }}
+          imagePullPolicy: {{ .Values.gateway.image.pullPolicy | quote }}
+          {{- if .Values.gateway.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.gateway.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.gateway.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.command "context" $) | nindent 12 }}
+          {{- else }}
+          command:
+            - /bin/bash
+            - -ec
+            - |
+              # Generate resolver data
+              echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /opt/bitnami/nginx/conf/resolvers.conf
+              /opt/bitnami/scripts/nginx/entrypoint.sh /opt/bitnami/scripts/nginx/run.sh
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.gateway.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.args "context" $) | nindent 12 }}
+          {{- end }}
+          env:
+            - name: BITNAMI_DEBUG
+              value: {{ ternary "true" "false" .Values.gateway.image.debug | quote }}
+            {{- if .Values.gateway.extraEnvVars }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.gateway.extraEnvVars "context" $) | nindent 12 }}
+            {{- end }}
+          envFrom:
+            {{- if .Values.gateway.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.gateway.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.gateway.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.gateway.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          {{- if .Values.gateway.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          ports:
+            - containerPort: {{ .Values.gateway.containerPorts.http }}
+              name: http
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.gateway.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.gateway.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.gateway.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.gateway.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.gateway.livenessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /
+              port: http
+          {{- else if .Values.gateway.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.gateway.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.gateway.readinessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /
+              port: http
+          {{- else if .Values.gateway.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.gateway.resources }}
+          resources: {{- toYaml .Values.gateway.resources | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: config
+              mountPath: /opt/bitnami/nginx/conf/nginx.conf
+              subPath: nginx.conf
+            {{- if .Values.gateway.auth.enabled }}
+            - name: htpasswd
+              mountPath: /bitnami/nginx/secrets/
+            {{- end }}
+            {{- if .Values.gateway.extraVolumeMounts }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.gateway.extraVolumeMounts "context" $) | nindent 12 }}
+            {{- end }}
+        {{- if .Values.gateway.sidecars }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.gateway.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: config
+          configMap:
+            name: {{ include "grafana-loki.gateway.fullname" . }}
+      {{- if .Values.gateway.auth.enabled }}
+        - name: htpasswd
+          secret:
+            secretName: {{ include "grafana-loki.gateway.secretName" . }}
+            items:
+              - key: htpasswd
+                path: .htpasswd
+      {{- end }}
+      {{- if .Values.gateway.extraVolumes }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.gateway.extraVolumes "context" $) | nindent 8 }}
+      {{- end }}
+{{- end }}

+ 57 - 0
bitnami/grafana-loki/templates/gateway/ingress.yaml

@@ -0,0 +1,57 @@
+{{- if .Values.gateway.ingress.enabled }}
+apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }}
+kind: Ingress
+metadata:
+  name: {{ include "grafana-loki.gateway.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  annotations:
+    {{- if .Values.gateway.ingress.annotations }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.gateway.ingress.annotations "context" $) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+spec:
+  {{- if and .Values.gateway.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
+  ingressClassName: {{ .Values.gateway.ingress.ingressClassName | quote }}
+  {{- end }}
+  rules:
+    {{- if .Values.gateway.ingress.hostname }}
+    - host: {{ .Values.gateway.ingress.hostname | quote }}
+      http:
+        paths:
+          {{- if .Values.gateway.ingress.extraPaths }}
+          {{- toYaml .Values.gateway.ingress.extraPaths | nindent 10 }}
+          {{- end }}
+          - path: {{ .Values.gateway.ingress.path }}
+            {{- if eq "true" (include "common.ingress.supportsPathType" .) }}
+            pathType: {{ .Values.gateway.ingress.pathType }}
+            {{- end }}
+            backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" .) "servicePort" "http" "context" $)  | nindent 14 }}
+    {{- end }}
+    {{- range .Values.gateway.ingress.extraHosts }}
+    - host: {{ .name | quote }}
+      http:
+        paths:
+          - path: {{ default "/" .path }}
+            {{- if eq "true" (include "common.ingress.supportsPathType" $) }}
+            pathType: {{ default "ImplementationSpecific" .pathType }}
+            {{- end }}
+            backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" $) "servicePort" "http" "context" $) | nindent 14 }}
+    {{- end }}
+  {{- if or (and .Values.gateway.ingress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" .Values.gateway.ingress.annotations )) .Values.gateway.ingress.selfSigned)) .Values.gateway.ingress.extraTls }}
+  tls:
+    {{- if and .Values.gateway.ingress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" .Values.gateway.ingress.annotations )) .Values.gateway.ingress.selfSigned) }}
+    - hosts:
+        - {{ .Values.gateway.ingress.hostname | quote }}
+      secretName: {{ printf "%s-tls" .Values.gateway.ingress.hostname }}
+    {{- end }}
+    {{- if .Values.gateway.ingress.extraTls }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.gateway.ingress.extraTls "context" $) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+{{- end }}

+ 21 - 0
bitnami/grafana-loki/templates/gateway/secret.yaml

@@ -0,0 +1,21 @@
+{{- if and .Values.gateway.enabled .Values.gateway.auth.enabled (not .Values.gateway.auth.existingSecret)  }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "grafana-loki.gateway.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: gateway
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+type: Opaque
+data:
+  {{- $password := (include "common.secrets.passwords.manage" (dict "secret" (include "grafana-loki.gateway.fullname" .) "key" "password" "providedValues" (list "gateway.auth.password") "context" $)) }}
+  password: {{ $password | quote }}
+  htpasswd: {{ htpasswd .Values.gateway.auth.username (b64dec $password) | b64enc | quote }}
+{{- end }}

+ 57 - 0
bitnami/grafana-loki/templates/gateway/service.yaml

@@ -0,0 +1,57 @@
+{{- if .Values.gateway.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.gateway.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: gateway
+  annotations:
+    {{- if .Values.gateway.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.gateway.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+spec:
+  type: {{ .Values.gateway.service.type }}
+  {{- if .Values.gateway.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.gateway.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.gateway.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.gateway.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if and .Values.gateway.service.clusterIP (eq .Values.gateway.service.type "ClusterIP") }}
+  clusterIP: {{ .Values.gateway.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.gateway.service.type "LoadBalancer") (eq .Values.gateway.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.gateway.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{- if (and (eq .Values.gateway.service.type "LoadBalancer") .Values.gateway.service.loadBalancerSourceRanges) }}
+  {{- with .Values.gateway.service.loadBalancerSourceRanges }}
+  loadBalancerSourceRanges: {{- toYaml . | nindent 4 }}
+  {{- end }}
+  {{- end }}
+  {{- if (and (eq .Values.gateway.service.type "LoadBalancer") (not (empty .Values.gateway.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.gateway.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.gateway.service.ports.http }}
+      targetPort: http
+      {{- if and (or (eq .Values.gateway.service.type "NodePort") (eq .Values.gateway.service.type "LoadBalancer")) (not (empty .Values.gateway.service.nodePorts.http)) }}
+      nodePort: {{ .Values.gateway.service.nodePorts.http }}
+      {{- else if eq .Values.gateway.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.gateway.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.gateway.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: gateway
+{{- end }}

+ 44 - 0
bitnami/grafana-loki/templates/gateway/tls-secret.yaml

@@ -0,0 +1,44 @@
+{{- if .Values.gateway.ingress.enabled }}
+{{- if .Values.gateway.ingress.secrets }}
+{{- range .Values.gateway.ingress.secrets }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ .name }}
+  namespace: {{ $.Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" $ | nindent 4 }}
+    {{- if $.Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if $.Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+type: kubernetes.io/tls
+data:
+  tls.crt: {{ .certificate | b64enc }}
+  tls.key: {{ .key | b64enc }}
+---
+{{- end }}
+{{- end }}
+{{- if and .Values.gateway.ingress.tls .Values.gateway.ingress.selfSigned }}
+{{- $ca := genCA "grafana-loki-ca" 365 }}
+{{- $cert := genSignedCert .Values.gateway.ingress.hostname nil (list .Values.gateway.ingress.hostname) 365 $ca }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ printf "%s-tls" .Values.gateway.ingress.hostname }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+type: kubernetes.io/tls
+data:
+  tls.crt: {{ $cert.Cert | b64enc | quote }}
+  tls.key: {{ $cert.Key | b64enc | quote }}
+  ca.crt: {{ $ca.Cert | b64enc | quote }}
+{{- end }}
+{{- end }}

+ 31 - 0
bitnami/grafana-loki/templates/gossip-ring-headless-service.yaml

@@ -0,0 +1,31 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.gossip-ring.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: loki
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.loki.gossipRing.service.annotations }}
+  annotations:
+    {{- if .Values.loki.gossipRing.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.loki.gossipRing.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: ClusterIP
+  publishNotReadyAddresses: true
+  clusterIP: None
+  ports:
+    - name: http
+      port: {{ .Values.loki.gossipRing.service.ports.http }}
+      targetPort: http-memberlist
+      protocol: TCP
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    loki-gossip-member: "true"

+ 67 - 0
bitnami/grafana-loki/templates/index-gateway/service.yaml

@@ -0,0 +1,67 @@
+{{- if .Values.indexGateway.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.index-gateway.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: indexGateway
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.indexGateway.service.annotations }}
+  annotations:
+    {{- if .Values.indexGateway.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.indexGateway.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.indexGateway.service.type }}
+  {{- if .Values.indexGateway.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.indexGateway.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.indexGateway.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.indexGateway.service.clusterIP }}
+  clusterIP: {{ .Values.indexGateway.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.indexGateway.service.type "LoadBalancer") (eq .Values.indexGateway.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.indexGateway.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.indexGateway.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.indexGateway.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.indexGateway.service.type "LoadBalancer") (not (empty .Values.indexGateway.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.indexGateway.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.indexGateway.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.indexGateway.service.type "NodePort") (eq .Values.indexGateway.service.type "LoadBalancer")) (not (empty .Values.indexGateway.service.nodePorts.http))) }}
+      nodePort: {{ .Values.indexGateway.service.nodePorts.http }}
+      {{- else if eq .Values.indexGateway.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    - name: grpc
+      port: {{ .Values.indexGateway.service.ports.grpc }}
+      protocol: TCP
+      targetPort: grpc
+      {{- if (and (or (eq .Values.indexGateway.service.type "NodePort") (eq .Values.indexGateway.service.type "LoadBalancer")) (not (empty .Values.indexGateway.service.nodePorts.grpc))) }}
+      nodePort: {{ .Values.indexGateway.service.nodePorts.grpc }}
+      {{- else if eq .Values.indexGateway.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.indexGateway.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: indexGateway
+{{- end }}

+ 56 - 0
bitnami/grafana-loki/templates/index-gateway/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.indexGateway.enabled .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.index-gateway.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: index-gateway
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: indexGateway
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 166 - 0
bitnami/grafana-loki/templates/index-gateway/statefulset.yaml

@@ -0,0 +1,166 @@
+{{- if .Values.indexGateway.enabled }}
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+  name: {{ template "grafana-loki.index-gateway.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: index-gateway
+    loki-gossip-member: "true"
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.indexGateway.replicaCount }}
+  {{- if .Values.indexGateway.updateStrategy }}
+  updateStrategy: {{- toYaml .Values.indexGateway.updateStrategy | nindent 4 }}
+  {{- end }}
+  podManagementPolicy: {{ .Values.indexGateway.podManagementPolicy }}
+
+  serviceName: {{ template "grafana-loki.index-gateway.fullname" . }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: index-gateway
+      loki-gossip-member: "true"
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.indexGateway.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: index-gateway
+        loki-gossip-member: "true"
+        {{- if .Values.indexGateway.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.indexGateway.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.indexGateway.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.indexGateway.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.indexGateway.podAffinityPreset "component" "indexGateway" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.indexGateway.podAntiAffinityPreset "component" "indexGateway" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.indexGateway.nodeAffinityPreset.type "key" .Values.indexGateway.nodeAffinityPreset.key "values" .Values.indexGateway.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.indexGateway.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.indexGateway.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.indexGateway.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.indexGateway.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.indexGateway.priorityClassName }}
+      priorityClassName: {{ .Values.indexGateway.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.indexGateway.schedulerName }}
+      schedulerName: {{ .Values.indexGateway.schedulerName }}
+      {{- end }}
+      {{- if .Values.indexGateway.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.indexGateway.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.indexGateway.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-index-gateway
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.indexGateway.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.indexGateway.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.indexGateway.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.indexGateway.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=index-gateway
+            - -config.file={{ .Values.loki.dataDir }}/conf/loki.yaml
+          {{- end }}
+          {{- if .Values.indexGateway.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.indexGateway.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.indexGateway.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.indexGateway.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.indexGateway.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.grpc }}
+              name: grpc
+          {{- if .Values.indexGateway.resources }}
+          resources: {{- toYaml .Values.indexGateway.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.indexGateway.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.indexGateway.livenessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.indexGateway.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.indexGateway.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.indexGateway.readinessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.indexGateway.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.indexGateway.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.indexGateway.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.indexGateway.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.indexGateway.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: {{ .Values.loki.dataDir }}/conf/loki.yaml
+              subPath: loki.yaml
+          {{- if .Values.indexGateway.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.indexGateway.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.indexGateway.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.indexGateway.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.indexGateway.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+{{- end }}

+ 65 - 0
bitnami/grafana-loki/templates/ingester/service.yaml

@@ -0,0 +1,65 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.ingester.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ingester
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.ingester.service.annotations }}
+  annotations:
+    {{- if .Values.ingester.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.ingester.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.ingester.service.type }}
+  {{- if .Values.ingester.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.ingester.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.ingester.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.ingester.service.clusterIP }}
+  clusterIP: {{ .Values.ingester.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.ingester.service.type "LoadBalancer") (eq .Values.ingester.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.ingester.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.ingester.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.ingester.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.ingester.service.type "LoadBalancer") (not (empty .Values.ingester.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.ingester.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.ingester.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.ingester.service.type "NodePort") (eq .Values.ingester.service.type "LoadBalancer")) (not (empty .Values.ingester.service.nodePorts.http))) }}
+      nodePort: {{ .Values.ingester.service.nodePorts.http }}
+      {{- else if eq .Values.ingester.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    - name: grpc
+      port: {{ .Values.ingester.service.ports.grpc }}
+      targetPort: grpc
+      protocol: TCP
+      {{- if (and (or (eq .Values.ingester.service.type "NodePort") (eq .Values.ingester.service.type "LoadBalancer")) (not (empty .Values.ingester.service.nodePorts.grpc))) }}
+      nodePort: {{ .Values.ingester.service.nodePorts.grpc }}
+      {{- else if eq .Values.ingester.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.ingester.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.ingester.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ingester

+ 56 - 0
bitnami/grafana-loki/templates/ingester/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.ingester.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ingester
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: ingester
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 218 - 0
bitnami/grafana-loki/templates/ingester/statefulset.yaml

@@ -0,0 +1,218 @@
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+  name: {{ template "grafana-loki.ingester.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ingester
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.ingester.replicaCount }}
+  {{- if .Values.ingester.updateStrategy }}
+  updateStrategy: {{- toYaml .Values.ingester.updateStrategy | nindent 4 }}
+  {{- end }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: ingester
+  serviceName: {{ template "grafana-loki.ingester.fullname" . }}
+  podManagementPolicy: {{ .Values.ingester.podManagementPolicy }}
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.ingester.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.ingester.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: ingester
+        loki-gossip-member: "true"
+        {{- if .Values.ingester.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.ingester.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.ingester.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ingester.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.ingester.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.ingester.podAffinityPreset "component" "ingester" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.ingester.podAntiAffinityPreset "component" "ingester" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.ingester.nodeAffinityPreset.type "key" .Values.ingester.nodeAffinityPreset.key "values" .Values.ingester.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.ingester.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.ingester.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ingester.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ingester.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ingester.priorityClassName }}
+      priorityClassName: {{ .Values.ingester.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.ingester.schedulerName }}
+      schedulerName: {{ .Values.ingester.schedulerName }}
+      {{- end }}
+      {{- if .Values.ingester.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.ingester.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.ingester.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.ingester.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+        {{- if and .Values.volumePermissions.enabled .Values.ingester.persistence.enabled }}
+        - name: volume-permissions
+          image: {{ include "grafana-loki.volumePermissions.image" . }}
+          imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+          command:
+            - /bin/bash
+          args:
+            - -ec
+            - |
+              mkdir -p {{ .Values.loki.dataDir }}{{- if .Values.ingester.persistence.subPath }}/{{ .Values.ingester.persistence.subPath }}{{- end }}
+              {{- if and .Values.ingester.podSecurityContext.enabled .Values.ingester.containerSecurityContext.enabled }}
+              find {{ .Values.loki.dataDir }}{{- if .Values.ingester.persistence.subPath }}/{{ .Values.ingester.persistence.subPath }}{{- end }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R {{ .Values.ingester.containerSecurityContext.runAsUser }}:{{ .Values.ingester.podSecurityContext.fsGroup }}
+              {{- end }}
+          {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
+          securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }}
+          {{- else }}
+          securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.volumePermissions.resources }}
+          resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: data
+              mountPath: {{ .Values.loki.dataDir }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-ingester
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.ingester.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.ingester.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.ingester.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.ingester.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=ingester
+            - -config.file=/bitnami/grafana-loki/conf/loki.yaml
+          {{- end }}
+          {{- if .Values.ingester.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.ingester.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.ingester.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.ingester.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.ingester.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.gossipRing }}
+              name: http-memberlist
+            - containerPort: {{ .Values.loki.containerPorts.grpc }}
+              name: grpc
+          {{- if .Values.ingester.resources }}
+          resources: {{- toYaml .Values.ingester.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.ingester.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.ingester.livenessProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.ingester.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.ingester.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.ingester.readinessProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.ingester.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.ingester.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.ingester.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.ingester.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.ingester.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: /bitnami/grafana-loki/conf/loki.yaml
+              subPath: loki.yaml
+            - name: data
+              mountPath: {{ .Values.loki.dataDir }}
+          {{- if .Values.ingester.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.ingester.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.ingester.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.ingester.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.ingester.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.ingester.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+  {{- if not .Values.ingester.persistence.enabled }}
+        - name: data
+          emptyDir: {}
+  {{- else }}
+  volumeClaimTemplates:
+    - metadata:
+        name: data
+        {{- if .Values.commonLabels }}
+        labels: {{- include "common.tplvalues.render" (dict "value" .Values.commonLabels "context" $) | nindent 10 }}
+        {{- end }}
+        annotations:
+          {{- if .Values.ingester.persistence.annotations }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.ingester.persistence.annotations "context" $) | nindent 10 }}
+          {{- end }}
+          {{- if .Values.commonAnnotations }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 10 }}
+          {{- end }}
+      spec:
+        accessModes:
+        {{- range .Values.ingester.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.ingester.persistence.size | quote }}
+        {{- if .Values.ingester.persistence.selector }}
+        selector: {{- include "common.tplvalues.render" (dict "value" .Values.ingester.persistence.selector "context" $) | nindent 10 }}
+        {{- end }}
+        {{- include "common.storage.class" (dict "persistence" .Values.ingester.persistence "global" .Values.global) | nindent 8 }}
+  {{- end }}

+ 17 - 0
bitnami/grafana-loki/templates/loki-configmap.yaml

@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ template "common.names.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: loki
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+data:
+  loki.yaml: |-
+    {{- include "common.tplvalues.render" (dict "value" .Values.loki.configuration "context" $) | nindent 4 }}

+ 28 - 0
bitnami/grafana-loki/templates/promtail/clusterrole.yaml

@@ -0,0 +1,28 @@
+{{- if .Values.promtail.rbac.create }}
+apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
+kind: ClusterRole
+metadata:
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: promtail
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  name: {{ template "grafana-loki.promtail.fullname" . }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+rules:
+  - apiGroups:
+      - ""
+    resources:
+      - nodes
+      - nodes/proxy
+      - services
+      - endpoints
+      - pods
+    verbs:
+      - get
+      - watch
+      - list
+{{- end }}

+ 23 - 0
bitnami/grafana-loki/templates/promtail/clusterrolebinding.yaml

@@ -0,0 +1,23 @@
+{{- if .Values.promtail.rbac.create }}
+apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
+kind: ClusterRoleBinding
+metadata:
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: promtail
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  name: {{ template "grafana-loki.promtail.fullname" . }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: {{ template "grafana-loki.promtail.fullname" . }}
+subjects:
+  - kind: ServiceAccount
+    name: {{ template "grafana-loki.promtail.serviceAccountName" . }}
+    namespace: {{ include "common.names.namespace" . | quote }}
+{{- end }}

+ 190 - 0
bitnami/grafana-loki/templates/promtail/daemonset.yaml

@@ -0,0 +1,190 @@
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+  name: {{ template "grafana-loki.promtail.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: promtail
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if .Values.promtail.updateStrategy }}
+  updateStrategy: {{- toYaml .Values.promtail.updateStrategy | nindent 4 }}
+  {{- end }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: promtail
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.promtail.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.promtail.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: promtail
+        loki-gossip-member: "true"
+        {{- if .Values.promtail.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.promtail.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.promtail.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.promtail.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.promtail.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.promtail.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.promtail.podAffinityPreset "component" "promtail" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.promtail.podAntiAffinityPreset "component" "promtail" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.promtail.nodeAffinityPreset.type "key" .Values.promtail.nodeAffinityPreset.key "values" .Values.promtail.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.promtail.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.promtail.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.promtail.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.promtail.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.promtail.priorityClassName }}
+      priorityClassName: {{ .Values.promtail.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.promtail.schedulerName }}
+      schedulerName: {{ .Values.promtail.schedulerName }}
+      {{- end }}
+      {{- if .Values.promtail.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.promtail.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.promtail.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.promtail.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: promtail
+          image: {{ template "grafana-loki.promtail.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.promtail.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.promtail.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.promtail.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.promtail.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -config.file=/bitnami/promtail/conf/promtail.yaml
+          {{- end }}
+          env:
+            - name: HOSTNAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: spec.nodeName
+            {{- if .Values.promtail.extraEnvVars }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.promtail.extraEnvVars "context" $) | nindent 12 }}
+            {{- end }}
+          envFrom:
+            {{- if .Values.promtail.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.promtail.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.promtail.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.promtail.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.promtail.containerPorts.http }}
+              name: http
+          {{- if .Values.promtail.resources }}
+          resources: {{- toYaml .Values.promtail.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.promtail.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.promtail.livenessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.promtail.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.promtail.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.promtail.readinessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.promtail.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.promtail.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.promtail.startupProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.promtail.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.promtail.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: /bitnami/promtail/conf/promtail.yaml
+              subPath: promtail.yaml
+            - name: containers
+              mountPath: /var/lib/docker/containers
+              readOnly: true
+            - name: pods
+              mountPath: /var/log/pods
+              readOnly: true
+            - name: run
+              mountPath: /run/promtail
+          {{- if .Values.gateway.auth.enabled }}
+            - name: gateway-password
+              mountPath: /bitnami/promtail/conf/secrets
+          {{- end }}
+          {{- if .Values.promtail.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.promtail.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.promtail.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.promtail.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          secret:
+            secretName: {{ template "grafana-loki.promtail.secretName" . }}
+        - name: containers
+          hostPath:
+            path: /var/lib/docker/containers
+        - name: pods
+          hostPath:
+            path: /var/log/pods
+        - name: run
+          hostPath:
+            path: /run/promtail
+      {{- if .Values.gateway.auth.enabled }}
+        - name: gateway-password
+          secret:
+            secretName: {{ include "grafana-loki.gateway.secretName" . }}
+            items:
+              - key: password
+                path: password
+      {{- end }}
+        {{- if .Values.promtail.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.promtail.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}

+ 17 - 0
bitnami/grafana-loki/templates/promtail/secret.yaml

@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ template "grafana-loki.promtail.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: loki
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+stringData:
+  promtail.yaml: |-
+    {{- include "common.tplvalues.render" (dict "value" .Values.promtail.configuration "context" $) | nindent 4 }}

+ 21 - 0
bitnami/grafana-loki/templates/promtail/service-account.yaml

@@ -0,0 +1,21 @@
+{{- if .Values.promtail.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ template "grafana-loki.promtail.serviceAccountName" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: loki
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.promtail.serviceAccount.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.promtail.serviceAccount.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+automountServiceAccountToken: {{ .Values.promtail.serviceAccount.automountServiceAccountToken }}
+{{- end }}

+ 56 - 0
bitnami/grafana-loki/templates/promtail/service.yaml

@@ -0,0 +1,56 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.promtail.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: promtail
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.promtail.service.annotations }}
+  annotations:
+    {{- if .Values.promtail.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.promtail.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.promtail.service.type }}
+  {{- if .Values.promtail.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.promtail.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.promtail.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.promtail.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.promtail.service.clusterIP }}
+  clusterIP: {{ .Values.promtail.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.promtail.service.type "LoadBalancer") (eq .Values.promtail.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.promtail.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.promtail.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.promtail.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.promtail.service.type "LoadBalancer") (not (empty .Values.promtail.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.promtail.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.promtail.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.promtail.service.type "NodePort") (eq .Values.promtail.service.type "LoadBalancer")) (not (empty .Values.promtail.service.nodePorts.http))) }}
+      nodePort: {{ .Values.promtail.service.nodePorts.http }}
+      {{- else if eq .Values.promtail.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.promtail.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.promtail.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: promtail

+ 56 - 0
bitnami/grafana-loki/templates/promtail/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.promtail.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: promtail
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: promtail
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 65 - 0
bitnami/grafana-loki/templates/querier/service.yaml

@@ -0,0 +1,65 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.querier.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: querier
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.querier.service.annotations }}
+  annotations:
+    {{- if .Values.querier.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.querier.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.querier.service.type }}
+  {{- if .Values.querier.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.querier.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.querier.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.querier.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.querier.service.clusterIP }}
+  clusterIP: {{ .Values.querier.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.querier.service.type "LoadBalancer") (eq .Values.querier.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.querier.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.querier.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.querier.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.querier.service.type "LoadBalancer") (not (empty .Values.querier.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.querier.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.querier.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.querier.service.type "NodePort") (eq .Values.querier.service.type "LoadBalancer")) (not (empty .Values.querier.service.nodePorts.http))) }}
+      nodePort: {{ .Values.querier.service.nodePorts.http }}
+      {{- else if eq .Values.querier.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    - name: grpc
+      port: {{ .Values.querier.service.ports.grpc }}
+      targetPort: grpc
+      protocol: TCP
+      {{- if (and (or (eq .Values.querier.service.type "NodePort") (eq .Values.querier.service.type "LoadBalancer")) (not (empty .Values.querier.service.nodePorts.grpc))) }}
+      nodePort: {{ .Values.querier.service.nodePorts.grpc }}
+      {{- else if eq .Values.querier.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.querier.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.querier.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: querier

+ 56 - 0
bitnami/grafana-loki/templates/querier/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.querier.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: querier
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: querier
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 220 - 0
bitnami/grafana-loki/templates/querier/statefulset.yaml

@@ -0,0 +1,220 @@
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+  name: {{ template "grafana-loki.querier.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: querier
+    loki-gossip-member: "true"
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.querier.replicaCount }}
+  {{- if .Values.querier.updateStrategy }}
+  updateStrategy: {{- toYaml .Values.querier.updateStrategy | nindent 4 }}
+  {{- end }}
+  podManagementPolicy: {{ .Values.querier.podManagementPolicy }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: querier
+      loki-gossip-member: "true"
+  serviceName: {{ template "grafana-loki.querier.fullname" . }}
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.querier.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.querier.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: querier
+        loki-gossip-member: "true"
+        {{- if .Values.querier.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.querier.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.querier.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.querier.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.querier.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.querier.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.querier.podAffinityPreset "component" "querier" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.querier.podAntiAffinityPreset "component" "querier" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.querier.nodeAffinityPreset.type "key" .Values.querier.nodeAffinityPreset.key "values" .Values.querier.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.querier.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.querier.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.querier.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.querier.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.querier.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.querier.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.querier.priorityClassName }}
+      priorityClassName: {{ .Values.querier.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.querier.schedulerName }}
+      schedulerName: {{ .Values.querier.schedulerName }}
+      {{- end }}
+      {{- if .Values.querier.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.querier.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.querier.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.querier.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+        {{- if and .Values.volumePermissions.enabled .Values.querier.persistence.enabled }}
+        - name: volume-permissions
+          image: {{ include "grafana-loki.volumePermissions.image" . }}
+          imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+          command:
+            - /bin/bash
+          args:
+            - -ec
+            - |
+              mkdir -p {{ .Values.loki.dataDir }}{{- if .Values.querier.persistence.subPath }}/{{ .Values.querier.persistence.subPath }}{{- end }}
+              {{- if and .Values.querier.podSecurityContext.enabled .Values.querier.containerSecurityContext.enabled }}
+              find {{ .Values.loki.dataDir }}{{- if .Values.querier.persistence.subPath }}/{{ .Values.querier.persistence.subPath }}{{- end }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R {{ .Values.querier.containerSecurityContext.runAsUser }}:{{ .Values.querier.podSecurityContext.fsGroup }}
+              {{- end }}
+          {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
+          securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }}
+          {{- else }}
+          securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.volumePermissions.resources }}
+          resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: data
+              mountPath: {{ .Values.loki.dataDir }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-querier
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.querier.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.querier.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.querier.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.querier.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.querier.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.querier.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=querier
+            - -config.file={{ .Values.loki.dataDir }}/conf/loki.yaml
+          {{- end }}
+          {{- if .Values.querier.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.querier.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.querier.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.querier.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.querier.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.querier.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.gossipRing }}
+              name: http-memberlist
+            - containerPort: {{ .Values.loki.containerPorts.grpc }}
+              name: grpc
+          {{- if .Values.querier.resources }}
+          resources: {{- toYaml .Values.querier.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.querier.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.querier.livenessProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.querier.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.querier.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.querier.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.querier.readinessProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.querier.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.querier.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.querier.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.querier.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.querier.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.querier.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.querier.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.querier.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: {{ .Values.loki.dataDir }}/conf/loki.yaml
+              subPath: loki.yaml
+            - name: data
+              mountPath: {{ .Values.loki.dataDir }}
+          {{- if .Values.querier.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.querier.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.querier.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.querier.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.querier.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.querier.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+  {{- if not .Values.querier.persistence.enabled }}
+        - name: data
+          emptyDir: {}
+  {{- else }}
+  volumeClaimTemplates:
+    - metadata:
+        name: data
+        {{- if .Values.commonLabels }}
+        labels: {{- include "common.tplvalues.render" (dict "value" .Values.commonLabels "context" $) | nindent 10 }}
+        {{- end }}
+        annotations:
+          {{- if .Values.querier.persistence.annotations }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.querier.persistence.annotations "context" $) | nindent 10 }}
+          {{- end }}
+          {{- if .Values.commonAnnotations }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 10 }}
+          {{- end }}
+      spec:
+        accessModes:
+        {{- range .Values.querier.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.querier.persistence.size | quote }}
+        {{- if .Values.querier.persistence.selector }}
+        selector: {{- include "common.tplvalues.render" (dict "value" .Values.querier.persistence.selector "context" $) | nindent 10 }}
+        {{- end }}
+        {{- include "common.storage.class" (dict "persistence" .Values.querier.persistence "global" .Values.global) | nindent 8 }}
+  {{- end }}

+ 159 - 0
bitnami/grafana-loki/templates/query-frontend/deployment.yaml

@@ -0,0 +1,159 @@
+apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+  name: {{ template "grafana-loki.query-frontend.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: query-frontend
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.queryFrontend.replicaCount }}
+  {{- if .Values.queryFrontend.updateStrategy }}
+  strategy: {{- toYaml .Values.queryFrontend.updateStrategy | nindent 4 }}
+  {{- end }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: query-frontend
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.queryFrontend.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: query-frontend
+        loki-gossip-member: "true"
+        {{- if .Values.queryFrontend.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.queryFrontend.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.queryFrontend.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.queryFrontend.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.queryFrontend.podAffinityPreset "component" "query-frontend" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.queryFrontend.podAntiAffinityPreset "component" "query-frontend" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.queryFrontend.nodeAffinityPreset.type "key" .Values.queryFrontend.nodeAffinityPreset.key "values" .Values.queryFrontend.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.queryFrontend.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.queryFrontend.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.queryFrontend.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.queryFrontend.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.queryFrontend.priorityClassName }}
+      priorityClassName: {{ .Values.queryFrontend.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.queryFrontend.schedulerName }}
+      schedulerName: {{ .Values.queryFrontend.schedulerName }}
+      {{- end }}
+      {{- if .Values.queryFrontend.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.queryFrontend.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.queryFrontend.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-query-frontend
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.queryFrontend.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.queryFrontend.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.queryFrontend.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.queryFrontend.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=query-frontend
+            - -config.file={{ .Values.loki.dataDir }}/conf/loki.yaml
+          {{- end }}
+          {{- if .Values.queryFrontend.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.queryFrontend.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.queryFrontend.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.queryFrontend.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.queryFrontend.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.grpc }}
+              name: grpc
+          {{- if .Values.queryFrontend.resources }}
+          resources: {{- toYaml .Values.queryFrontend.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.queryFrontend.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.queryFrontend.livenessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.queryFrontend.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.queryFrontend.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.queryFrontend.readinessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.queryFrontend.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.queryFrontend.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.queryFrontend.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.queryFrontend.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.queryFrontend.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: /bitnami/grafana-loki/conf/loki.yaml
+              subPath: loki.yaml
+          {{- if .Values.queryFrontend.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.queryFrontend.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.queryFrontend.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.queryFrontend.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}

+ 34 - 0
bitnami/grafana-loki/templates/query-frontend/headless-service.yaml

@@ -0,0 +1,34 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.query-frontend.fullname" . }}-headless
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: query-frontend
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  # NOTE: this is based on this https://github.com/grafana/helm-charts/pull/451. Should be reviewed if it is actually necessary in the future
+  publishNotReadyAddresses: true
+  type: ClusterIP
+  clusterIP: None
+  ports:
+    - name: http
+      port: {{ .Values.queryFrontend.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+    - name: grpc
+      port: {{ .Values.queryFrontend.service.ports.grpc }}
+      targetPort: grpc
+      protocol: TCP
+    {{- if .Values.queryFrontend.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: query-frontend

+ 66 - 0
bitnami/grafana-loki/templates/query-frontend/service.yaml

@@ -0,0 +1,66 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.query-frontend.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: query-frontend
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.queryFrontend.service.annotations }}
+  annotations:
+    {{- if .Values.queryFrontend.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.queryFrontend.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.queryFrontend.service.type }}
+  {{- if .Values.queryFrontend.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.queryFrontend.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.queryFrontend.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.queryFrontend.service.clusterIP }}
+  clusterIP: {{ .Values.queryFrontend.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.queryFrontend.service.type "LoadBalancer") (eq .Values.queryFrontend.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.queryFrontend.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.queryFrontend.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.queryFrontend.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.queryFrontend.service.type "LoadBalancer") (not (empty .Values.queryFrontend.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.queryFrontend.service.loadBalancerIP }}
+  {{- end }}
+  publishNotReadyAddresses: true
+  ports:
+    - name: http
+      port: {{ .Values.queryFrontend.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.queryFrontend.service.type "NodePort") (eq .Values.queryFrontend.service.type "LoadBalancer")) (not (empty .Values.queryFrontend.service.nodePorts.http))) }}
+      nodePort: {{ .Values.queryFrontend.service.nodePorts.http }}
+      {{- else if eq .Values.queryFrontend.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    - name: grpc
+      port: {{ .Values.queryFrontend.service.ports.grpc }}
+      targetPort: grpc
+      protocol: TCP
+      {{- if (and (or (eq .Values.queryFrontend.service.type "NodePort") (eq .Values.queryFrontend.service.type "LoadBalancer")) (not (empty .Values.queryFrontend.service.nodePorts.grpc))) }}
+      nodePort: {{ .Values.queryFrontend.service.nodePorts.grpc }}
+      {{- else if eq .Values.queryFrontend.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.queryFrontend.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.queryFrontend.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: query-frontend

+ 56 - 0
bitnami/grafana-loki/templates/query-frontend/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.query-frontend.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: query-frontend
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: query-frontend
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 67 - 0
bitnami/grafana-loki/templates/ruler/service.yaml

@@ -0,0 +1,67 @@
+{{- if .Values.ruler.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.ruler.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ruler
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.ruler.service.annotations }}
+  annotations:
+    {{- if .Values.ruler.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.ruler.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.ruler.service.type }}
+  {{- if .Values.ruler.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.ruler.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.ruler.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.ruler.service.clusterIP }}
+  clusterIP: {{ .Values.ruler.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.ruler.service.type "LoadBalancer") (eq .Values.ruler.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.ruler.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.ruler.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.ruler.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.ruler.service.type "LoadBalancer") (not (empty .Values.ruler.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.ruler.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.ruler.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.ruler.service.type "NodePort") (eq .Values.ruler.service.type "LoadBalancer")) (not (empty .Values.ruler.service.nodePorts.http))) }}
+      nodePort: {{ .Values.ruler.service.nodePorts.http }}
+      {{- else if eq .Values.ruler.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    - name: grpc
+      port: {{ .Values.ruler.service.ports.grpc }}
+      targetPort: grpc
+      protocol: TCP
+      {{- if (and (or (eq .Values.ruler.service.type "NodePort") (eq .Values.ruler.service.type "LoadBalancer")) (not (empty .Values.ruler.service.nodePorts.grpc))) }}
+      nodePort: {{ .Values.ruler.service.nodePorts.grpc }}
+      {{- else if eq .Values.ruler.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.ruler.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.ruler.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ruler
+{{- end }}

+ 56 - 0
bitnami/grafana-loki/templates/ruler/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.ruler.enabled .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.ruler.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ruler
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: ruler
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 222 - 0
bitnami/grafana-loki/templates/ruler/statefulset.yaml

@@ -0,0 +1,222 @@
+{{- if .Values.indexGateway.enabled }}
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+  name: {{ template "grafana-loki.ruler.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: ruler
+    loki-gossip-member: "true"
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.ruler.replicaCount }}
+  {{- if .Values.ruler.updateStrategy }}
+  updateStrategy: {{- toYaml .Values.ruler.updateStrategy | nindent 4 }}
+  {{- end }}
+  podManagementPolicy: {{ .Values.ruler.podManagementPolicy }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: ruler
+      loki-gossip-member: "true"
+  serviceName: {{ template "grafana-loki.ruler.fullname" . }}
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.ruler.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.ruler.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: ruler
+        loki-gossip-member: "true"
+        {{- if .Values.ruler.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.ruler.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.ruler.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ruler.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.ruler.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.ruler.podAffinityPreset "component" "ruler" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.ruler.podAntiAffinityPreset "component" "ruler" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.ruler.nodeAffinityPreset.type "key" .Values.ruler.nodeAffinityPreset.key "values" .Values.ruler.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.ruler.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.ruler.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ruler.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ruler.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.ruler.priorityClassName }}
+      priorityClassName: {{ .Values.ruler.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.ruler.schedulerName }}
+      schedulerName: {{ .Values.ruler.schedulerName }}
+      {{- end }}
+      {{- if .Values.ruler.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.ruler.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.ruler.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.ruler.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+        {{- if and .Values.volumePermissions.enabled .Values.ruler.persistence.enabled }}
+        - name: volume-permissions
+          image: {{ include "grafana-loki.volumePermissions.image" . }}
+          imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+          command:
+            - /bin/bash
+          args:
+            - -ec
+            - |
+              mkdir -p {{ .Values.loki.dataDir }}{{- if .Values.ruler.persistence.subPath }}/{{ .Values.ruler.persistence.subPath }}{{- end }}
+              {{- if and .Values.ruler.podSecurityContext.enabled .Values.ruler.containerSecurityContext.enabled }}
+              find {{ .Values.loki.dataDir }}{{- if .Values.ruler.persistence.subPath }}/{{ .Values.ruler.persistence.subPath }}{{- end }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R {{ .Values.ruler.containerSecurityContext.runAsUser }}:{{ .Values.ruler.podSecurityContext.fsGroup }}
+              {{- end }}
+          {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }}
+          securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }}
+          {{- else }}
+          securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.volumePermissions.resources }}
+          resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: data
+              mountPath: {{ .Values.loki.dataDir }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-ruler
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.ruler.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.ruler.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.ruler.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.ruler.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=ruler
+            - -config.file={{ .Values.loki.dataDir }}/conf/loki.yaml
+          {{- end }}
+          {{- if .Values.ruler.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.ruler.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.ruler.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.ruler.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.ruler.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.gossipRing }}
+              name: http-memberlist
+            - containerPort: {{ .Values.loki.containerPorts.grpc }}
+              name: grpc
+          {{- if .Values.ruler.resources }}
+          resources: {{- toYaml .Values.ruler.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.ruler.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.ruler.livenessProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.ruler.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.ruler.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.ruler.readinessProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.ruler.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.ruler.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.ruler.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.ruler.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.ruler.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: {{ .Values.loki.dataDir }}/conf/loki.yaml
+              subPath: loki.yaml
+            - name: data
+              mountPath: {{ .Values.loki.dataDir }}
+          {{- if .Values.ruler.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.ruler.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.ruler.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.ruler.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.ruler.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.ruler.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+  {{- if not .Values.ruler.persistence.enabled }}
+        - name: data
+          emptyDir: {}
+  {{- else }}
+  volumeClaimTemplates:
+    - metadata:
+        name: data
+        {{- if .Values.commonLabels }}
+        labels: {{- include "common.tplvalues.render" (dict "value" .Values.commonLabels "context" $) | nindent 10 }}
+        {{- end }}
+        annotations:
+          {{- if .Values.ruler.persistence.annotations }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.ruler.persistence.annotations "context" $) | nindent 10 }}
+          {{- end }}
+          {{- if .Values.commonAnnotations }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 10 }}
+          {{- end }}
+      spec:
+        accessModes:
+        {{- range .Values.ruler.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.ruler.persistence.size | quote }}
+        {{- if .Values.ruler.persistence.selector }}
+        selector: {{- include "common.tplvalues.render" (dict "value" .Values.ruler.persistence.selector "context" $) | nindent 10 }}
+        {{- end }}
+        {{- include "common.storage.class" (dict "persistence" .Values.ruler.persistence "global" .Values.global) | nindent 8 }}
+  {{- end }}
+{{- end }}

+ 21 - 0
bitnami/grafana-loki/templates/service-account.yaml

@@ -0,0 +1,21 @@
+{{- if .Values.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ template "grafana-loki.serviceAccountName" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: loki
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.serviceAccount.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.serviceAccount.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
+{{- end }}

+ 161 - 0
bitnami/grafana-loki/templates/table-manager/deployment.yaml

@@ -0,0 +1,161 @@
+{{- if .Values.tableManager.enabled }}
+apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+  name: {{ template "grafana-loki.table-manager.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: table-manager
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.tableManager.replicaCount }}
+  {{- if .Values.tableManager.updateStrategy }}
+  strategy: {{- toYaml .Values.tableManager.updateStrategy | nindent 4 }}
+  {{- end }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: table-manager
+  template:
+    metadata:
+      annotations:
+        checksum/config: {{ include (print $.Template.BasePath "/loki-configmap.yaml") . | sha256sum }}
+        {{- if .Values.tableManager.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/part-of: grafana-loki
+        app.kubernetes.io/component: table-manager
+        loki-gossip-member: "true"
+        {{- if .Values.tableManager.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      serviceAccountName: {{ template "grafana-loki.serviceAccountName" . }}
+      {{- include "grafana-loki.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.tableManager.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.tableManager.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.tableManager.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.tableManager.podAffinityPreset "component" "tableManager" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.tableManager.podAntiAffinityPreset "component" "tableManager" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.tableManager.nodeAffinityPreset.type "key" .Values.tableManager.nodeAffinityPreset.key "values" .Values.tableManager.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.tableManager.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.tableManager.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.tableManager.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.tableManager.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.tableManager.priorityClassName }}
+      priorityClassName: {{ .Values.tableManager.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.tableManager.schedulerName }}
+      schedulerName: {{ .Values.tableManager.schedulerName }}
+      {{- end }}
+      {{- if .Values.tableManager.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.tableManager.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.tableManager.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: grafana-loki-table-manager
+          image: {{ template "grafana-loki.image" . }}
+          imagePullPolicy: {{ .Values.loki.image.pullPolicy }}
+          {{- if .Values.tableManager.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.tableManager.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.tableManager.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.tableManager.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -target=table-manager
+            - -config.file=/bitnami/grafana-loki/conf/loki.yaml
+          {{- end }}
+          {{- if .Values.tableManager.extraEnvVars }}
+          env: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.extraEnvVars "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.tableManager.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.tableManager.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.tableManager.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.tableManager.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          ports:
+            - containerPort: {{ .Values.loki.containerPorts.http }}
+              name: http
+            - containerPort: {{ .Values.loki.containerPorts.grpc }}
+              name: grpc
+          {{- if .Values.tableManager.resources }}
+          resources: {{- toYaml .Values.tableManager.resources | nindent 12 }}
+          {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.tableManager.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.tableManager.livenessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.tableManager.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.customLivenessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.tableManager.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.tableManager.readinessProbe "enabled") "context" $) | nindent 12 }}
+            httpGet:
+              path: /ready
+              port: http
+          {{- else if .Values.tableManager.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.customReadinessProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.tableManager.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.tableManager.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: http
+          {{- else if .Values.tableManager.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.customStartupProbe "context" $) | nindent 12 }}
+          {{- end }}
+          {{- end }}
+          {{- if .Values.tableManager.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: loki-config
+              mountPath: {{ .Values.loki.dataDir }}/conf/loki.yaml
+              subPath: loki.yaml
+          {{- if .Values.tableManager.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.tableManager.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.tableManager.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: loki-config
+          configMap:
+            name: {{ template "grafana-loki.loki.configmapName" . }}
+        {{- if .Values.tableManager.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+{{- end }}

+ 67 - 0
bitnami/grafana-loki/templates/table-manager/service.yaml

@@ -0,0 +1,67 @@
+{{- if .Values.indexGateway.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "grafana-loki.table-manager.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: table-manager
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if or .Values.commonAnnotations .Values.tableManager.service.annotations }}
+  annotations:
+    {{- if .Values.tableManager.service.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.tableManager.service.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.tableManager.service.type }}
+  {{- if .Values.tableManager.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.tableManager.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.tableManager.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.tableManager.service.clusterIP }}
+  clusterIP: {{ .Values.tableManager.service.clusterIP }}
+  {{- end }}
+  {{- if (or (eq .Values.tableManager.service.type "LoadBalancer") (eq .Values.tableManager.service.type "NodePort")) }}
+  externalTrafficPolicy: {{ .Values.tableManager.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{ if eq .Values.tableManager.service.type "LoadBalancer" }}
+  loadBalancerSourceRanges: {{ .Values.tableManager.service.loadBalancerSourceRanges }}
+  {{ end }}
+  {{- if (and (eq .Values.tableManager.service.type "LoadBalancer") (not (empty .Values.tableManager.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.tableManager.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: http
+      port: {{ .Values.tableManager.service.ports.http }}
+      targetPort: http
+      protocol: TCP
+      {{- if (and (or (eq .Values.tableManager.service.type "NodePort") (eq .Values.tableManager.service.type "LoadBalancer")) (not (empty .Values.tableManager.service.nodePorts.http))) }}
+      nodePort: {{ .Values.tableManager.service.nodePorts.http }}
+      {{- else if eq .Values.tableManager.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    - name: grpc
+      port: {{ .Values.tableManager.service.ports.grpc }}
+      protocol: TCP
+      targetPort: grpc
+      {{- if (and (or (eq .Values.tableManager.service.type "NodePort") (eq .Values.tableManager.service.type "LoadBalancer")) (not (empty .Values.tableManager.service.nodePorts.grpc))) }}
+      nodePort: {{ .Values.tableManager.service.nodePorts.grpc }}
+      {{- else if eq .Values.tableManager.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.tableManager.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.tableManager.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: table-manager
+{{- end }}

+ 56 - 0
bitnami/grafana-loki/templates/table-manager/servicemonitor.yaml

@@ -0,0 +1,56 @@
+{{- if and .Values.tableManager.enabled .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "grafana-loki.table-manager.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/part-of: grafana-loki
+    app.kubernetes.io/component: table-manager
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+   {{- if or .Values.commonAnnotations .Values.metrics.serviceMonitor.annotations }}
+   annotations:
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/part-of: grafana-loki
+      app.kubernetes.io/component: table-manager
+  endpoints:
+    - port: http
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabelings | nindent 6 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}

+ 3591 - 0
bitnami/grafana-loki/values.yaml

@@ -0,0 +1,3591 @@
+## @section Global parameters
+## Global Docker image parameters
+## Please, note that this will override the image parameters, including dependencies, configured to use the global value
+## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass
+##
+
+## @param global.imageRegistry Global Docker image registry
+## @param global.imagePullSecrets Global Docker registry secret names as an array
+## @param global.storageClass Global StorageClass for Persistent Volume(s)
+##
+global:
+  imageRegistry: ""
+  ## E.g.
+  ## imagePullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  imagePullSecrets: []
+  storageClass: ""
+
+## @section Common parameters
+##
+
+## @param kubeVersion Override Kubernetes version
+##
+kubeVersion: ""
+## @param nameOverride String to partially override common.names.fullname
+##
+nameOverride: ""
+## @param fullnameOverride String to fully override common.names.fullname
+##
+fullnameOverride: ""
+## @param commonLabels Labels to add to all deployed objects
+##
+commonLabels: {}
+## @param commonAnnotations Annotations to add to all deployed objects
+##
+commonAnnotations: {}
+## @param clusterDomain Kubernetes cluster domain name
+##
+clusterDomain: cluster.local
+## @param extraDeploy Array of extra objects to deploy with the release
+##
+extraDeploy: []
+
+## Enable diagnostic mode in the deployments/statefulsets
+##
+diagnosticMode:
+  ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden)
+  ##
+  enabled: false
+  ## @param diagnosticMode.command Command to override all containers in the deployments/statefulsets
+  ##
+  command:
+    - sleep
+  ## @param diagnosticMode.args Args to override all containers in the deployments/statefulsets
+  ##
+  args:
+    - infinity
+
+## @section Common Grafana Loki Parameters
+##
+loki:
+  ## Bitnami Grafana Loki image
+  ## ref: https://hub.docker.com/r/bitnami/grafana-loki/tags/
+  ## @param loki.image.registry Grafana Loki image registry
+  ## @param loki.image.repository Grafana Loki image repository
+  ## @param loki.image.tag Grafana Loki image tag (immutable tags are recommended)
+  ## @param loki.image.pullPolicy Grafana Loki image pull policy
+  ## @param loki.image.pullSecrets Grafana Loki image pull secrets
+  ##
+  image:
+    registry: docker.io
+    repository: bitnami/grafana-loki
+    tag: 2.5.0-debian-10-r3
+    ## Specify a imagePullPolicy
+    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+    ##
+    pullPolicy: IfNotPresent
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ## e.g:
+    ## pullSecrets:
+    ##   - myRegistryKeySecretName
+    ##
+    pullSecrets: []
+  ## @param loki.configuration [string] Loki components configuration
+  ##
+  configuration: |
+    auth_enabled: false
+
+    server:
+      http_listen_port: {{ .Values.loki.containerPorts.http }}
+
+    distributor:
+      ring:
+        kvstore:
+          store: memberlist
+
+    memberlist:
+      join_members:
+        - {{ include "grafana-loki.gossip-ring.fullname" . }}
+
+    ingester:
+      lifecycler:
+        ring:
+          kvstore:
+            store: memberlist
+          replication_factor: 1
+      chunk_idle_period: 30m
+      chunk_block_size: 262144
+      chunk_encoding: snappy
+      chunk_retain_period: 1m
+      max_transfer_retries: 0
+      wal:
+        dir: {{ .Values.loki.dataDir }}/wal
+
+    limits_config:
+      enforce_metric_name: false
+      reject_old_samples: true
+      reject_old_samples_max_age: 168h
+      max_cache_freshness_per_query: 10m
+      split_queries_by_interval: 15m
+
+    schema_config:
+      configs:
+      - from: 2020-10-24
+        store: boltdb-shipper
+        object_store: filesystem
+        schema: v11
+        index:
+          prefix: index_
+          period: 24h
+
+    storage_config:
+      boltdb_shipper:
+        shared_store: filesystem
+        active_index_directory: {{ .Values.loki.dataDir }}/loki/index
+        cache_location: {{ .Values.loki.dataDir }}/loki/cache
+        cache_ttl: 168h
+        {{- if .Values.indexGateway.enabled }}
+        index_gateway_client:
+          server_address: {{ (printf "dns:///%s:9095" (include "grafana-loki.index-gateway.fullname" .)) }}
+        {{- end }}
+      filesystem:
+        directory: {{ .Values.loki.dataDir }}/chunks
+      index_queries_cache_config:
+        {{- if .Values.memcachedindexqueries.enabled }}
+        memcached:
+          batch_size: 100
+          parallelism: 100
+        memcached_client:
+          consistent_hash: true
+          addresses: dns+{{ include "grafana-loki.memcached-index-queries.host" . }}
+          service: http
+        {{- end }}
+
+    chunk_store_config:
+      max_look_back_period: 0s
+      {{- if .Values.memcachedchunks.enabled }}
+      chunk_cache_config:
+        memcached:
+          batch_size: 100
+          parallelism: 100
+        memcached_client:
+          consistent_hash: true
+          addresses: dns+{{ include "grafana-loki.memcached-chunks.host" . }}
+      {{- end }}
+      {{- if .Values.memcachedindexwrites.enabled }}
+      write_dedupe_cache_config:
+        memcached:
+          batch_size: 100
+          parallelism: 100
+        memcached_client:
+          consistent_hash: true
+          addresses: dns+{{ include "grafana-loki.memcached-index-writes.host" . }}
+      {{- end }}
+
+    table_manager:
+      retention_deletes_enabled: false
+      retention_period: 0s
+
+    query_range:
+      align_queries_with_step: true
+      max_retries: 5
+      cache_results: true
+      results_cache:
+        cache:
+          {{- if .Values.memcachedfrontend.enabled }}
+          memcached_client:
+            consistent_hash: true
+            addresses: dns+{{ include "grafana-loki.memcached-frontend.host" . }}
+            max_idle_conns: 16
+            timeout: 500ms
+            update_interval: 1m
+          {{- else }}
+          enable_fifocache: true
+          fifocache:
+            max_size_items: 1024
+            validity: 24h
+          {{- end }}
+
+    frontend_worker:
+      frontend_address: {{ include "grafana-loki.query-frontend.fullname" . }}:{{ .Values.queryFrontend.service.ports.grpc }}
+
+    frontend:
+      log_queries_longer_than: 5s
+      compress_responses: true
+      tail_proxy_url: http://{{ include "grafana-loki.querier.fullname" . }}:{{ .Values.querier.service.ports.http }}
+
+    compactor:
+      shared_store: filesystem
+
+    ruler:
+      storage:
+        type: local
+        local:
+          directory: {{ .Values.loki.dataDir }}/conf/rules
+      ring:
+        kvstore:
+          store: memberlist
+      rule_path: /tmp/loki/scratch
+      alertmanager_url: https://alertmanager.xx
+      external_url: https://alertmanager.xx
+
+  ## @param loki.existingConfigmap Name of a ConfigMap with the Loki configuration
+  ##
+  existingConfigmap: ""
+
+  ## @param loki.dataDir path to the Loki data directory
+  ##
+  dataDir: "/bitnami/grafana-loki"
+
+  ## @param loki.containerPorts.http Loki components web container port
+  ## @param loki.containerPorts.grpc Loki components GRPC container port
+  ## @param loki.containerPorts.gossipRing Loki components Gossip Ring container port
+  ##
+  containerPorts:
+    http: 3100
+    grpc: 9095
+    gossipRing: 7946
+  ## Gossip Ring parameters
+  ##
+  gossipRing:
+    ## Gossip Ring service parameters
+    ##
+    service:
+      ## @param loki.gossipRing.service.ports.http Gossip Ring HTTP headless service port
+      ##
+      ports:
+        http: 7946
+      ## @param loki.gossipRing.service.annotations Additional custom annotations for Gossip Ring headless service
+      ##
+      annotations: {}
+
+## @section Compactor Deployment Parameters
+##
+compactor:
+  ## @param compactor.enabled Enable Compactor deployment
+  ##
+  enabled: false
+  ## @param compactor.extraEnvVars Array with extra environment variables to add to compactor nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param compactor.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for compactor nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param compactor.extraEnvVarsSecret Name of existing Secret containing extra env vars for compactor nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param compactor.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param compactor.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param compactor.replicaCount Number of Compactor replicas to deploy
+  ##
+  replicaCount: 1
+  ## Configure extra options for Compactor containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param compactor.livenessProbe.enabled Enable livenessProbe on Compactor nodes
+  ## @param compactor.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param compactor.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param compactor.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param compactor.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param compactor.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 60
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param compactor.readinessProbe.enabled Enable readinessProbe on Compactor nodes
+  ## @param compactor.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param compactor.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param compactor.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param compactor.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param compactor.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 60
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param compactor.startupProbe.enabled Enable startupProbe on Compactor containers
+  ## @param compactor.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param compactor.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param compactor.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param compactor.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param compactor.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param compactor.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param compactor.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param compactor.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## compactor resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param compactor.resources.limits The resources limits for the compactor containers
+  ## @param compactor.resources.requests The requested resources for the compactor containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param compactor.podSecurityContext.enabled Enabled Compactor pods' Security Context
+  ## @param compactor.podSecurityContext.fsGroup Set Compactor pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param compactor.containerSecurityContext.enabled Enabled Compactor containers' Security Context
+  ## @param compactor.containerSecurityContext.runAsUser Set Compactor containers' Security Context runAsUser
+  ## @param compactor.containerSecurityContext.runAsNonRoot Set Compactor containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param compactor.lifecycleHooks for the compactor container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param compactor.hostAliases compactor pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param compactor.podLabels Extra labels for compactor pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param compactor.podAnnotations Annotations for compactor pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param compactor.podAffinityPreset Pod affinity preset. Ignored if `compactor.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param compactor.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `compactor.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node compactor.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param compactor.nodeAffinityPreset.type Node affinity preset type. Ignored if `compactor.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param compactor.nodeAffinityPreset.key Node label key to match. Ignored if `compactor.affinity` is set
+    ##
+    key: ""
+    ## @param compactor.nodeAffinityPreset.values Node label values to match. Ignored if `compactor.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param compactor.affinity Affinity for Compactor pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `compactor.podAffinityPreset`, `compactor.podAntiAffinityPreset`, and `compactor.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param compactor.nodeSelector Node labels for Compactor pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param compactor.tolerations Tolerations for Compactor pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param compactor.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param compactor.priorityClassName Compactor pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param compactor.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param compactor.updateStrategy.type Compactor statefulset strategy type
+  ## @param compactor.updateStrategy.rollingUpdate Compactor statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param compactor.extraVolumes Optionally specify extra list of additional volumes for the Compactor pod(s)
+  ##
+  extraVolumes: []
+  ## @param compactor.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Compactor container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param compactor.sidecars Add additional sidecar containers to the Compactor pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param compactor.initContainers Add additional init containers to the Compactor pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## Enable persistence using Persistent Volume Claims
+  ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/
+  ##
+  persistence:
+    ## @param compactor.persistence.enabled Enable persistence in Compactor instances
+    ##
+    enabled: true
+    ## @param compactor.persistence.existingClaim Name of an existing PVC to use
+    ##
+    existingClaim: ""
+    ## @param compactor.persistence.storageClass PVC Storage Class for Memcached data volume
+    ## If defined, storageClassName: <storageClass>
+    ## If set to "-", storageClassName: "", which disables dynamic provisioning
+    ## If undefined (the default) or set to null, no storageClassName spec is
+    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+    ##   GKE, AWS & OpenStack)
+    ##
+    storageClass: ""
+    ## @param compactor.persistence.accessModes PVC Access modes
+    ##
+    accessModes:
+      - ReadWriteOnce
+    ## @param compactor.persistence.size PVC Storage Request for Memcached data volume
+    ##
+    size: 8Gi
+    ## @param compactor.persistence.annotations Additional PVC annotations
+    ##
+    annotations: {}
+    ## @param compactor.persistence.selector Selector to match an existing Persistent Volume for Compactor's data PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
+    ## @param compactor.persistence.dataSource PVC data source
+    ##
+    dataSource: {}
+
+  ## @section Compactor Traffic Exposure Parameters
+  ##
+
+  ## compactor service parameters
+  ##
+  service:
+    ## @param compactor.service.type Compactor service type
+    ##
+    type: ClusterIP
+    ## @param compactor.service.ports.http Compactor HTTP service port
+    ##
+    ports:
+      http: 3100
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param compactor.service.nodePorts.http Node port for HTTP
+    ##
+    nodePorts:
+      http: ""
+    ## @param compactor.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param compactor.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param compactor.service.clusterIP Compactor service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param compactor.service.loadBalancerIP Compactor service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param compactor.service.loadBalancerSourceRanges Compactor service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param compactor.service.externalTrafficPolicy Compactor service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param compactor.service.annotations Additional custom annotations for Compactor service
+    ##
+    annotations: {}
+    ## @param compactor.service.extraPorts Extra ports to expose in the Compactor service
+    ##
+    extraPorts: []
+
+## @section Gateway Deployment Parameters
+##
+gateway:
+  ## @param gateway.enabled Enable Gateway deployment
+  ##
+  enabled: true
+
+  ## Bitnami Nginx image
+  ## ref: https://hub.docker.com/r/bitnami/grafana-nginx/tags/
+  ## @param gateway.image.registry Nginx image registry
+  ## @param gateway.image.repository Nginx image repository
+  ## @param gateway.image.tag Nginx image tag (immutable tags are recommended)
+  ## @param gateway.image.pullPolicy Nginx image pull policy
+  ## @param gateway.image.pullSecrets Nginx image pull secrets
+  ## @param gateway.image.debug Enable debugging in the initialization process
+  ##
+  image:
+    registry: docker.io
+    repository: bitnami/nginx
+    tag: 1.21.6-debian-10-r105
+    ## Specify a imagePullPolicy
+    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+    ##
+    pullPolicy: IfNotPresent
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ## e.g:
+    ## pullSecrets:
+    ##   - myRegistryKeySecretName
+    ##
+    pullSecrets: []
+    debug: false
+
+  ## @param gateway.extraEnvVars Array with extra environment variables to add to gateway nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param gateway.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for gateway nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param gateway.extraEnvVarsSecret Name of existing Secret containing extra env vars for gateway nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param gateway.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param gateway.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param gateway.verboseLogging Show the gateway access_log
+  ##
+  verboseLogging: false
+  ## @param gateway.replicaCount Number of Gateway replicas to deploy
+  ##
+  replicaCount: 1
+  ## @param gateway.auth.enabled Enable basic auth
+  ## @param gateway.auth.username Basic auth username
+  ## @param gateway.auth.password Basic auth password
+  ## @param gateway.auth.existingSecret Name of a secret containing the Basic auth password
+  ##
+  auth:
+    enabled: false
+    username: "user"
+    password: ""
+    existingSecret: ""
+  ## Configure extra options for Gateway containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param gateway.livenessProbe.enabled Enable livenessProbe on Gateway nodes
+  ## @param gateway.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param gateway.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param gateway.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param gateway.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param gateway.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param gateway.readinessProbe.enabled Enable readinessProbe on Gateway nodes
+  ## @param gateway.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param gateway.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param gateway.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param gateway.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param gateway.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param gateway.startupProbe.enabled Enable startupProbe on Gateway containers
+  ## @param gateway.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param gateway.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param gateway.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param gateway.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param gateway.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param gateway.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param gateway.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param gateway.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## @param gateway.containerPorts.http Gateway HTTP port
+  ##
+  containerPorts:
+    http: 8080
+  ## gateway resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param gateway.resources.limits The resources limits for the gateway containers
+  ## @param gateway.resources.requests The requested resources for the gateway containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param gateway.podSecurityContext.enabled Enabled Gateway pods' Security Context
+  ## @param gateway.podSecurityContext.fsGroup Set Gateway pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param gateway.containerSecurityContext.enabled Enabled Gateway containers' Security Context
+  ## @param gateway.containerSecurityContext.runAsUser Set Gateway containers' Security Context runAsUser
+  ## @param gateway.containerSecurityContext.runAsNonRoot Set Gateway containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param gateway.lifecycleHooks for the gateway container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param gateway.hostAliases gateway pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param gateway.podLabels Extra labels for gateway pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param gateway.podAnnotations Annotations for gateway pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param gateway.podAffinityPreset Pod affinity preset. Ignored if `gateway.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param gateway.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `gateway.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node gateway.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param gateway.nodeAffinityPreset.type Node affinity preset type. Ignored if `gateway.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param gateway.nodeAffinityPreset.key Node label key to match. Ignored if `gateway.affinity` is set
+    ##
+    key: ""
+    ## @param gateway.nodeAffinityPreset.values Node label values to match. Ignored if `gateway.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param gateway.affinity Affinity for Gateway pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `gateway.podAffinityPreset`, `gateway.podAntiAffinityPreset`, and `gateway.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param gateway.nodeSelector Node labels for Gateway pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param gateway.tolerations Tolerations for Gateway pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param gateway.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param gateway.priorityClassName Gateway pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param gateway.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param gateway.updateStrategy.type Gateway statefulset strategy type
+  ## @param gateway.updateStrategy.rollingUpdate Gateway statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param gateway.extraVolumes Optionally specify extra list of additional volumes for the Gateway pod(s)
+  ##
+  extraVolumes: []
+  ## @param gateway.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Gateway container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param gateway.sidecars Add additional sidecar containers to the Gateway pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param gateway.initContainers Add additional init containers to the Gateway pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section Gateway Traffic Exposure Parameters
+  ##
+
+  ## gateway service parameters
+  ##
+  service:
+    ## @param gateway.service.type Gateway service type
+    ##
+    type: ClusterIP
+    ## @param gateway.service.ports.http Gateway HTTP service port
+    ##
+    ports:
+      http: 80
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param gateway.service.nodePorts.http Node port for HTTP
+    ##
+    nodePorts:
+      http: ""
+    ## @param gateway.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param gateway.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param gateway.service.clusterIP Gateway service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param gateway.service.loadBalancerIP Gateway service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param gateway.service.loadBalancerSourceRanges Gateway service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param gateway.service.externalTrafficPolicy Gateway service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param gateway.service.annotations Additional custom annotations for Gateway service
+    ##
+    annotations: {}
+    ## @param gateway.service.extraPorts Extra ports to expose in the Gateway service
+    ##
+    extraPorts: []
+
+  ## Configure the ingress resource that allows you to access the Loki Gateway installation
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/
+  ##
+  ingress:
+    ## @param gateway.ingress.enabled Enable ingress record generation for Loki Gateway
+    ##
+    enabled: false
+    ## @param gateway.ingress.pathType Ingress path type
+    ##
+    pathType: ImplementationSpecific
+    ## @param gateway.ingress.apiVersion Force Ingress API version (automatically detected if not set)
+    ##
+    apiVersion: ""
+    ## @param gateway.ingress.ingressClassName IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)
+    ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster .
+    ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/
+    ##
+    ingressClassName: ""
+    ## @param gateway.ingress.hostname Default host for the ingress record
+    ##
+    hostname: grafana-loki.local
+    ## @param gateway.ingress.path Default path for the ingress record
+    ## NOTE: You may need to set this to '/*' in order to use this with ALB ingress controllers
+    ##
+    path: /
+    ## @param gateway.ingress.annotations Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.
+    ## For a full list of possible ingress annotations, please see
+    ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
+    ## Use this parameter to set the required annotations for cert-manager, see
+    ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations
+    ##
+    ## e.g:
+    ## annotations:
+    ##   kubernetes.io/ingress.class: nginx
+    ##   cert-manager.io/cluster-issuer: cluster-issuer-name
+    ##
+    annotations: {}
+    ## @param gateway.ingress.tls Enable TLS configuration for the host defined at `ingress.hostname` parameter
+    ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf "%s-tls" .Values.ingress.hostname }}`
+    ## You can:
+    ##   - Use the `ingress.secrets` parameter to create this TLS secret
+    ##   - Rely on cert-manager to create it by setting the corresponding annotations
+    ##   - Rely on Helm to create self-signed certificates by setting `ingress.selfSigned=true`
+    ##
+    tls: false
+    ## @param gateway.ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm
+    ##
+    selfSigned: false
+    ## @param gateway.ingress.extraHosts An array with additional hostname(s) to be covered with the ingress record
+    ## e.g:
+    ## extraHosts:
+    ##   - name: Loki Gateway.local
+    ##     path: /
+    ##
+    extraHosts: []
+    ## @param gateway.ingress.extraPaths An array with additional arbitrary paths that may need to be added to the ingress under the main host
+    ## e.g:
+    ## extraPaths:
+    ## - path: /*
+    ##   backend:
+    ##     serviceName: ssl-redirect
+    ##     servicePort: use-annotation
+    ##
+    extraPaths: []
+    ## @param gateway.ingress.extraTls TLS configuration for additional hostname(s) to be covered with this ingress record
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
+    ## e.g:
+    ## extraTls:
+    ## - hosts:
+    ##     - Loki Gateway.local
+    ##   secretName: Loki Gateway.local-tls
+    ##
+    extraTls: []
+    ## @param gateway.ingress.secrets Custom TLS certificates as secrets
+    ## NOTE: 'key' and 'certificate' are expected in PEM format
+    ## NOTE: 'name' should line up with a 'secretName' set further up
+    ## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates
+    ## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days
+    ## It is also possible to create and manage the certificates outside of this helm chart
+    ## Please see README.md for more information
+    ## e.g:
+    ## secrets:
+    ##   - name: Loki Gateway.local-tls
+    ##     key: |-
+    ##       -----BEGIN RSA PRIVATE KEY-----
+    ##       ...
+    ##       -----END RSA PRIVATE KEY-----
+    ##     certificate: |-
+    ##       -----BEGIN CERTIFICATE-----
+    ##       ...
+    ##       -----END CERTIFICATE-----
+    ##
+    secrets: []
+
+## @section index-gateway Deployment Parameters
+##
+indexGateway:
+  ## @param indexGateway.enabled Enable index-gateway deployment
+  ##
+  enabled: false
+  ## @param indexGateway.extraEnvVars Array with extra environment variables to add to indexGateway nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param indexGateway.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for indexGateway nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param indexGateway.extraEnvVarsSecret Name of existing Secret containing extra env vars for indexGateway nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param indexGateway.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param indexGateway.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param indexGateway.replicaCount Number of index-gateway replicas to deploy
+  ##
+  replicaCount: 1
+  ## @param indexGateway.podManagementPolicy podManagementPolicy to manage scaling operation
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies
+  ##
+  podManagementPolicy: ""
+  ## Configure extra options for index-gateway containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param indexGateway.livenessProbe.enabled Enable livenessProbe on index-gateway nodes
+  ## @param indexGateway.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param indexGateway.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param indexGateway.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param indexGateway.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param indexGateway.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 60
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param indexGateway.readinessProbe.enabled Enable readinessProbe on index-gateway nodes
+  ## @param indexGateway.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param indexGateway.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param indexGateway.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param indexGateway.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param indexGateway.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 60
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param indexGateway.startupProbe.enabled Enable startupProbe on index-gateway containers
+  ## @param indexGateway.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param indexGateway.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param indexGateway.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param indexGateway.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param indexGateway.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param indexGateway.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param indexGateway.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param indexGateway.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## indexGateway resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param indexGateway.resources.limits The resources limits for the indexGateway containers
+  ## @param indexGateway.resources.requests The requested resources for the indexGateway containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param indexGateway.podSecurityContext.enabled Enabled index-gateway pods' Security Context
+  ## @param indexGateway.podSecurityContext.fsGroup Set index-gateway pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param indexGateway.containerSecurityContext.enabled Enabled index-gateway containers' Security Context
+  ## @param indexGateway.containerSecurityContext.runAsUser Set index-gateway containers' Security Context runAsUser
+  ## @param indexGateway.containerSecurityContext.runAsNonRoot Set index-gateway containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param indexGateway.lifecycleHooks for the indexGateway container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param indexGateway.hostAliases indexGateway pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param indexGateway.podLabels Extra labels for indexGateway pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param indexGateway.podAnnotations Annotations for indexGateway pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param indexGateway.podAffinityPreset Pod affinity preset. Ignored if `indexGateway.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param indexGateway.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `indexGateway.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node indexGateway.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param indexGateway.nodeAffinityPreset.type Node affinity preset type. Ignored if `indexGateway.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param indexGateway.nodeAffinityPreset.key Node label key to match. Ignored if `indexGateway.affinity` is set
+    ##
+    key: ""
+    ## @param indexGateway.nodeAffinityPreset.values Node label values to match. Ignored if `indexGateway.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param indexGateway.affinity Affinity for index-gateway pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `indexGateway.podAffinityPreset`, `indexGateway.podAntiAffinityPreset`, and `indexGateway.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param indexGateway.nodeSelector Node labels for index-gateway pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param indexGateway.tolerations Tolerations for index-gateway pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param indexGateway.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param indexGateway.priorityClassName index-gateway pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param indexGateway.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param indexGateway.updateStrategy.type index-gateway statefulset strategy type
+  ## @param indexGateway.updateStrategy.rollingUpdate index-gateway statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param indexGateway.extraVolumes Optionally specify extra list of additional volumes for the index-gateway pod(s)
+  ##
+  extraVolumes: []
+  ## @param indexGateway.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the index-gateway container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param indexGateway.sidecars Add additional sidecar containers to the index-gateway pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param indexGateway.initContainers Add additional init containers to the index-gateway pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section index-gateway Traffic Exposure Parameters
+  ##
+
+  ## indexGateway service parameters
+  ##
+  service:
+    ## @param indexGateway.service.type index-gateway service type
+    ##
+    type: ClusterIP
+    ## @param indexGateway.service.ports.http index-gateway HTTP service port
+    ## @param indexGateway.service.ports.grpc index-gateway GRPC service port
+    ##
+    ports:
+      http: 3100
+      grpc: 9095
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param indexGateway.service.nodePorts.http Node port for HTTP
+    ## @param indexGateway.service.nodePorts.grpc Node port for GRPC
+    ##
+    nodePorts:
+      http: ""
+      grpc: ""
+    ## @param indexGateway.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param indexGateway.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param indexGateway.service.clusterIP index-gateway service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param indexGateway.service.loadBalancerIP index-gateway service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param indexGateway.service.loadBalancerSourceRanges index-gateway service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param indexGateway.service.externalTrafficPolicy index-gateway service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param indexGateway.service.annotations Additional custom annotations for index-gateway service
+    ##
+    annotations: {}
+    ## @param indexGateway.service.extraPorts Extra ports to expose in the index-gateway service
+    ##
+    extraPorts: []
+
+## @section Distributor Deployment Parameters
+##
+distributor:
+  ## @param distributor.extraEnvVars Array with extra environment variables to add to distributor nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param distributor.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for distributor nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param distributor.extraEnvVarsSecret Name of existing Secret containing extra env vars for distributor nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param distributor.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param distributor.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param distributor.replicaCount Number of Distributor replicas to deploy
+  ##
+  replicaCount: 1
+  ## Configure extra options for Distributor containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param distributor.livenessProbe.enabled Enable livenessProbe on Distributor nodes
+  ## @param distributor.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param distributor.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param distributor.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param distributor.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param distributor.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param distributor.readinessProbe.enabled Enable readinessProbe on Distributor nodes
+  ## @param distributor.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param distributor.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param distributor.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param distributor.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param distributor.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param distributor.startupProbe.enabled Enable startupProbe on Distributor containers
+  ## @param distributor.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param distributor.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param distributor.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param distributor.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param distributor.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param distributor.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param distributor.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param distributor.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## distributor resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param distributor.resources.limits The resources limits for the distributor containers
+  ## @param distributor.resources.requests The requested resources for the distributor containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param distributor.podSecurityContext.enabled Enabled Distributor pods' Security Context
+  ## @param distributor.podSecurityContext.fsGroup Set Distributor pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param distributor.containerSecurityContext.enabled Enabled Distributor containers' Security Context
+  ## @param distributor.containerSecurityContext.runAsUser Set Distributor containers' Security Context runAsUser
+  ## @param distributor.containerSecurityContext.runAsNonRoot Set Distributor containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param distributor.lifecycleHooks for the distributor container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param distributor.hostAliases distributor pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param distributor.podLabels Extra labels for distributor pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param distributor.podAnnotations Annotations for distributor pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param distributor.podAffinityPreset Pod affinity preset. Ignored if `distributor.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param distributor.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `distributor.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node distributor.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param distributor.nodeAffinityPreset.type Node affinity preset type. Ignored if `distributor.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param distributor.nodeAffinityPreset.key Node label key to match. Ignored if `distributor.affinity` is set
+    ##
+    key: ""
+    ## @param distributor.nodeAffinityPreset.values Node label values to match. Ignored if `distributor.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param distributor.affinity Affinity for Distributor pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `distributor.podAffinityPreset`, `distributor.podAntiAffinityPreset`, and `distributor.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param distributor.nodeSelector Node labels for Distributor pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param distributor.tolerations Tolerations for Distributor pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param distributor.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param distributor.priorityClassName Distributor pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param distributor.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param distributor.updateStrategy.type Distributor statefulset strategy type
+  ## @param distributor.updateStrategy.rollingUpdate Distributor statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param distributor.extraVolumes Optionally specify extra list of additional volumes for the Distributor pod(s)
+  ##
+  extraVolumes: []
+  ## @param distributor.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Distributor container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param distributor.sidecars Add additional sidecar containers to the Distributor pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param distributor.initContainers Add additional init containers to the Distributor pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section Distributor Traffic Exposure Parameters
+  ##
+
+  ## distributor service parameters
+  ##
+  service:
+    ## @param distributor.service.type Distributor service type
+    ##
+    type: ClusterIP
+    ## @param distributor.service.ports.http Distributor HTTP service port
+    ## @param distributor.service.ports.grpc Distributor GRPC service port
+    ##
+    ports:
+      http: 3100
+      grpc: 9095
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param distributor.service.nodePorts.http Node port for HTTP
+    ## @param distributor.service.nodePorts.grpc Node port for GRPC
+    ##
+    nodePorts:
+      http: ""
+      grpc: ""
+    ## @param distributor.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param distributor.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param distributor.service.clusterIP Distributor service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param distributor.service.loadBalancerIP Distributor service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param distributor.service.loadBalancerSourceRanges Distributor service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param distributor.service.externalTrafficPolicy Distributor service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param distributor.service.annotations Additional custom annotations for Distributor service
+    ##
+    annotations: {}
+    ## @param distributor.service.extraPorts Extra ports to expose in the Distributor service
+    ##
+    extraPorts: []
+
+## @section Ingester Deployment Parameters
+##
+ingester:
+  ## @param ingester.extraEnvVars Array with extra environment variables to add to ingester nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param ingester.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for ingester nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param ingester.extraEnvVarsSecret Name of existing Secret containing extra env vars for ingester nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param ingester.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param ingester.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param ingester.replicaCount Number of Ingester replicas to deploy
+  ##
+  replicaCount: 1
+  ## Configure extra options for Ingester containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param ingester.livenessProbe.enabled Enable livenessProbe on Ingester nodes
+  ## @param ingester.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param ingester.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param ingester.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param ingester.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param ingester.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param ingester.readinessProbe.enabled Enable readinessProbe on Ingester nodes
+  ## @param ingester.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param ingester.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param ingester.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param ingester.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param ingester.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param ingester.startupProbe.enabled Enable startupProbe on Ingester containers
+  ## @param ingester.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param ingester.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param ingester.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param ingester.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param ingester.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param ingester.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param ingester.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param ingester.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## @param ingester.lifecycleHooks for the ingester container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## ingester resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param ingester.resources.limits The resources limits for the Ingester containers
+  ## @param ingester.resources.requests The requested resources for the Ingester containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param ingester.podSecurityContext.enabled Enabled Ingester pods' Security Context
+  ## @param ingester.podSecurityContext.fsGroup Set Ingester pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param ingester.containerSecurityContext.enabled Enabled Ingester containers' Security Context
+  ## @param ingester.containerSecurityContext.runAsUser Set Ingester containers' Security Context runAsUser
+  ## @param ingester.containerSecurityContext.runAsNonRoot Set Ingester containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param ingester.hostAliases ingester pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param ingester.podLabels Extra labels for ingester pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param ingester.podAnnotations Annotations for ingester pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param ingester.podAffinityPreset Pod affinity preset. Ignored if `ingester.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param ingester.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `ingester.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node ingester.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param ingester.nodeAffinityPreset.type Node affinity preset type. Ignored if `ingester.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param ingester.nodeAffinityPreset.key Node label key to match. Ignored if `ingester.affinity` is set
+    ##
+    key: ""
+    ## @param ingester.nodeAffinityPreset.values Node label values to match. Ignored if `ingester.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param ingester.affinity Affinity for ingester pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `ingester.podAffinityPreset`, `ingester.podAntiAffinityPreset`, and `ingester.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param ingester.nodeSelector Node labels for Ingester pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param ingester.tolerations Tolerations for Ingester pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param ingester.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param ingester.podManagementPolicy podManagementPolicy to manage scaling operation
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies
+  ##
+  podManagementPolicy: ""
+  ## @param ingester.priorityClassName Ingester pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param ingester.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param ingester.updateStrategy.type Ingester statefulset strategy type
+  ## @param ingester.updateStrategy.rollingUpdate Ingester statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param ingester.extraVolumes Optionally specify extra list of additional volumes for the Ingester pod(s)
+  ##
+  extraVolumes: []
+  ## @param ingester.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the ingester container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param ingester.sidecars Add additional sidecar containers to the Ingester pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param ingester.initContainers Add additional init containers to the Ingester pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section Ingester Persistence Parameters
+  ##
+
+  ## Enable persistence using Persistent Volume Claims
+  ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/
+  ##
+  persistence:
+    ## @param ingester.persistence.enabled Enable persistence in Ingester instances
+    ##
+    enabled: true
+    ## @param ingester.persistence.storageClass PVC Storage Class for Memcached data volume
+    ## If defined, storageClassName: <storageClass>
+    ## If set to "-", storageClassName: "", which disables dynamic provisioning
+    ## If undefined (the default) or set to null, no storageClassName spec is
+    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+    ##   GKE, AWS & OpenStack)
+    ##
+    storageClass: ""
+    ## @param ingester.persistence.subPath The subdirectory of the volume to mount to
+    ##
+    subPath: ""
+    ## @param ingester.persistence.accessModes PVC Access modes
+    ##
+    accessModes:
+      - ReadWriteOnce
+    ## @param ingester.persistence.size PVC Storage Request for Memcached data volume
+    ##
+    size: 8Gi
+    ## @param ingester.persistence.annotations Additional PVC annotations
+    ##
+    annotations: {}
+    ## @param ingester.persistence.selector Selector to match an existing Persistent Volume for Ingester's data PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
+
+  ## @section Ingester Traffic Exposure Parameters
+  ##
+
+  ## ingester service parameters
+  ##
+  service:
+    ## @param ingester.service.type Ingester service type
+    ##
+    type: ClusterIP
+    ## @param ingester.service.ports.http Ingester HTTP service port
+    ## @param ingester.service.ports.grpc Ingester GRPC service port
+    ##
+    ports:
+      http: 3100
+      grpc: 9095
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param ingester.service.nodePorts.http Node port for HTTP
+    ## @param ingester.service.nodePorts.grpc Node port for GRPC
+    ##
+    nodePorts:
+      http: ""
+      grpc: ""
+    ## @param ingester.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param ingester.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param ingester.service.clusterIP Ingester service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param ingester.service.loadBalancerIP Ingester service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param ingester.service.loadBalancerSourceRanges Ingester service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param ingester.service.externalTrafficPolicy Ingester service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param ingester.service.annotations Additional custom annotations for Ingester service
+    ##
+    annotations: {}
+    ## @param ingester.service.extraPorts Extra ports to expose in the Ingester service
+    ##
+    extraPorts: []
+
+## @section Querier Deployment Parameters
+##
+querier:
+  ## @param querier.replicaCount Number of Querier replicas to deploy
+  ##
+  replicaCount: 1
+  ## @param querier.extraEnvVars Array with extra environment variables to add to Querier nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param querier.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Querier nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param querier.extraEnvVarsSecret Name of existing Secret containing extra env vars for Querier nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param querier.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param querier.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param querier.podManagementPolicy podManagementPolicy to manage scaling operation
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies
+  ##
+  podManagementPolicy: ""
+  ## Configure extra options for Querier containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param querier.livenessProbe.enabled Enable livenessProbe on Querier nodes
+  ## @param querier.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param querier.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param querier.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param querier.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param querier.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param querier.readinessProbe.enabled Enable readinessProbe on Querier nodes
+  ## @param querier.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param querier.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param querier.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param querier.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param querier.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param querier.startupProbe.enabled Enable startupProbe on Querier containers
+  ## @param querier.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param querier.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param querier.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param querier.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param querier.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param querier.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param querier.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param querier.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## querier resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param querier.resources.limits The resources limits for the Querier containers
+  ## @param querier.resources.requests The requested resources for the Querier containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param querier.podSecurityContext.enabled Enabled Querier pods' Security Context
+  ## @param querier.podSecurityContext.fsGroup Set Querier pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param querier.containerSecurityContext.enabled Enabled Querier containers' Security Context
+  ## @param querier.containerSecurityContext.runAsUser Set Querier containers' Security Context runAsUser
+  ## @param querier.containerSecurityContext.runAsNonRoot Set Querier containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param querier.lifecycleHooks for the Querier container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param querier.hostAliases querier pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param querier.podLabels Extra labels for querier pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param querier.podAnnotations Annotations for querier pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param querier.podAffinityPreset Pod affinity preset. Ignored if `querier.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param querier.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `querier.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node querier.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param querier.nodeAffinityPreset.type Node affinity preset type. Ignored if `querier.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param querier.nodeAffinityPreset.key Node label key to match. Ignored if `querier.affinity` is set
+    ##
+    key: ""
+    ## @param querier.nodeAffinityPreset.values Node label values to match. Ignored if `querier.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param querier.affinity Affinity for Querier pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `querier.podAffinityPreset`, `querier.podAntiAffinityPreset`, and `querier.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param querier.nodeSelector Node labels for Querier pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param querier.tolerations Tolerations for Querier pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param querier.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param querier.priorityClassName Querier pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param querier.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param querier.updateStrategy.type Querier statefulset strategy type
+  ## @param querier.updateStrategy.rollingUpdate Querier statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param querier.extraVolumes Optionally specify extra list of additional volumes for the Querier pod(s)
+  ##
+  extraVolumes: []
+  ## @param querier.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the querier container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param querier.sidecars Add additional sidecar containers to the Querier pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param querier.initContainers Add additional init containers to the Querier pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section Querier Persistence Parameters
+  ##
+
+  ## Enable persistence using Persistent Volume Claims
+  ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/
+  ##
+  persistence:
+    ## @param querier.persistence.enabled Enable persistence in Querier instances
+    ##
+    enabled: true
+    ## @param querier.persistence.storageClass PVC Storage Class for Memcached data volume
+    ## If defined, storageClassName: <storageClass>
+    ## If set to "-", storageClassName: "", which disables dynamic provisioning
+    ## If undefined (the default) or set to null, no storageClassName spec is
+    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+    ##   GKE, AWS & OpenStack)
+    ##
+    storageClass: ""
+    ## @param querier.persistence.subPath The subdirectory of the volume to mount to
+    ##
+    subPath: ""
+    ## @param querier.persistence.accessModes PVC Access modes
+    ##
+    accessModes:
+      - ReadWriteOnce
+    ## @param querier.persistence.size PVC Storage Request for Memcached data volume
+    ##
+    size: 8Gi
+    ## @param querier.persistence.annotations Additional PVC annotations
+    ##
+    annotations: {}
+    ## @param querier.persistence.selector Selector to match an existing Persistent Volume for Querier's data PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
+
+  ## @section Querier Traffic Exposure Parameters
+  ##
+
+  ## querier service parameters
+  ##
+  service:
+    ## @param querier.service.type Querier service type
+    ##
+    type: ClusterIP
+    ## @param querier.service.ports.http Querier HTTP service port
+    ## @param querier.service.ports.grpc Querier GRPC service port
+    ##
+    ports:
+      http: 3100
+      grpc: 9095
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param querier.service.nodePorts.http Node port for HTTP
+    ## @param querier.service.nodePorts.grpc Node port for GRPC
+    ##
+    nodePorts:
+      http: ""
+      grpc: ""
+    ## @param querier.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param querier.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param querier.service.clusterIP Querier service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param querier.service.loadBalancerIP Querier service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param querier.service.loadBalancerSourceRanges Querier service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param querier.service.externalTrafficPolicy Querier service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param querier.service.annotations Additional custom annotations for Querier service
+    ##
+    annotations: {}
+    ## @param querier.service.extraPorts Extra ports to expose in the Querier service
+    ##
+    extraPorts: []
+
+## @section Query Frontend Deployment Parameters
+##
+queryFrontend:
+  ## @param queryFrontend.extraEnvVars Array with extra environment variables to add to queryFrontend nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param queryFrontend.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for queryFrontend nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param queryFrontend.extraEnvVarsSecret Name of existing Secret containing extra env vars for queryFrontend nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param queryFrontend.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param queryFrontend.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param queryFrontend.replicaCount Number of queryFrontend replicas to deploy
+  ##
+  replicaCount: 1
+  ## Configure extra options for queryFrontend containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param queryFrontend.livenessProbe.enabled Enable livenessProbe on queryFrontend nodes
+  ## @param queryFrontend.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param queryFrontend.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param queryFrontend.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param queryFrontend.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param queryFrontend.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param queryFrontend.readinessProbe.enabled Enable readinessProbe on queryFrontend nodes
+  ## @param queryFrontend.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param queryFrontend.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param queryFrontend.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param queryFrontend.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param queryFrontend.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param queryFrontend.startupProbe.enabled Enable startupProbe on queryFrontend containers
+  ## @param queryFrontend.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param queryFrontend.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param queryFrontend.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param queryFrontend.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param queryFrontend.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param queryFrontend.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param queryFrontend.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param queryFrontend.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## queryFrontend resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param queryFrontend.resources.limits The resources limits for the queryFrontend containers
+  ## @param queryFrontend.resources.requests The requested resources for the queryFrontend containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param queryFrontend.podSecurityContext.enabled Enabled queryFrontend pods' Security Context
+  ## @param queryFrontend.podSecurityContext.fsGroup Set queryFrontend pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param queryFrontend.containerSecurityContext.enabled Enabled queryFrontend containers' Security Context
+  ## @param queryFrontend.containerSecurityContext.runAsUser Set queryFrontend containers' Security Context runAsUser
+  ## @param queryFrontend.containerSecurityContext.runAsNonRoot Set queryFrontend containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param queryFrontend.lifecycleHooks for the queryFrontend container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param queryFrontend.hostAliases queryFrontend pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param queryFrontend.podLabels Extra labels for queryFrontend pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param queryFrontend.podAnnotations Annotations for queryFrontend pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param queryFrontend.podAffinityPreset Pod affinity preset. Ignored if `queryFrontend.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param queryFrontend.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `queryFrontend.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node queryFrontend.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param queryFrontend.nodeAffinityPreset.type Node affinity preset type. Ignored if `queryFrontend.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param queryFrontend.nodeAffinityPreset.key Node label key to match. Ignored if `queryFrontend.affinity` is set
+    ##
+    key: ""
+    ## @param queryFrontend.nodeAffinityPreset.values Node label values to match. Ignored if `queryFrontend.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param queryFrontend.affinity Affinity for queryFrontend pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `queryFrontend.podAffinityPreset`, `queryFrontend.podAntiAffinityPreset`, and `queryFrontend.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param queryFrontend.nodeSelector Node labels for queryFrontend pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param queryFrontend.tolerations Tolerations for queryFrontend pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param queryFrontend.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param queryFrontend.priorityClassName queryFrontend pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param queryFrontend.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param queryFrontend.updateStrategy.type queryFrontend statefulset strategy type
+  ## @param queryFrontend.updateStrategy.rollingUpdate queryFrontend statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param queryFrontend.extraVolumes Optionally specify extra list of additional volumes for the queryFrontend pod(s)
+  ##
+  extraVolumes: []
+  ## @param queryFrontend.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the queryFrontend container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param queryFrontend.sidecars Add additional sidecar containers to the queryFrontend pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param queryFrontend.initContainers Add additional init containers to the queryFrontend pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section Query Frontend Traffic Exposure Parameters
+  ##
+
+  ## queryFrontend service parameters
+  ##
+  service:
+    ## @param queryFrontend.service.type queryFrontend service type
+    ##
+    type: ClusterIP
+    ## @param queryFrontend.service.ports.http queryFrontend HTTP service port
+    ## @param queryFrontend.service.ports.grpc queryFrontend GRPC service port
+    ##
+    ports:
+      http: 3100
+      grpc: 9095
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param queryFrontend.service.nodePorts.http Node port for HTTP
+    ## @param queryFrontend.service.nodePorts.grpc Node port for GRPC
+    ##
+    nodePorts:
+      http: ""
+      grpc: ""
+    ## @param queryFrontend.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param queryFrontend.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param queryFrontend.service.clusterIP queryFrontend service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param queryFrontend.service.loadBalancerIP queryFrontend service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param queryFrontend.service.loadBalancerSourceRanges queryFrontend service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param queryFrontend.service.externalTrafficPolicy queryFrontend service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param queryFrontend.service.annotations Additional custom annotations for queryFrontend service
+    ##
+    annotations: {}
+    ## @param queryFrontend.service.extraPorts Extra ports to expose in the queryFrontend service
+    ##
+    extraPorts: []
+
+## @section Ruler Deployment Parameters
+##
+ruler:
+  ## @param ruler.enabled Deploy ruler component
+  ##
+  enabled: false
+  ## @param ruler.extraEnvVars Array with extra environment variables to add to ruler nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param ruler.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for ruler nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param ruler.extraEnvVarsSecret Name of existing Secret containing extra env vars for ruler nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param ruler.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param ruler.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param ruler.podManagementPolicy podManagementPolicy to manage scaling operation
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies
+  ##
+  podManagementPolicy: ""
+  ## @param ruler.replicaCount Number of Ruler replicas to deploy
+  ##
+  replicaCount: 1
+  ## Configure extra options for Ruler containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param ruler.livenessProbe.enabled Enable livenessProbe on Ruler nodes
+  ## @param ruler.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param ruler.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param ruler.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param ruler.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param ruler.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param ruler.readinessProbe.enabled Enable readinessProbe on Ruler nodes
+  ## @param ruler.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param ruler.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param ruler.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param ruler.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param ruler.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param ruler.startupProbe.enabled Enable startupProbe on Ruler containers
+  ## @param ruler.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param ruler.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param ruler.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param ruler.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param ruler.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param ruler.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param ruler.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param ruler.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## @param ruler.lifecycleHooks for the ruler container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## ruler resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param ruler.resources.limits The resources limits for the Ruler containers
+  ## @param ruler.resources.requests The requested resources for the Ruler containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param ruler.podSecurityContext.enabled Enabled Ruler pods' Security Context
+  ## @param ruler.podSecurityContext.fsGroup Set Ruler pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param ruler.containerSecurityContext.enabled Enabled Ruler containers' Security Context
+  ## @param ruler.containerSecurityContext.runAsUser Set Ruler containers' Security Context runAsUser
+  ## @param ruler.containerSecurityContext.runAsNonRoot Set Ruler containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param ruler.hostAliases ruler pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param ruler.podLabels Extra labels for ruler pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param ruler.podAnnotations Annotations for ruler pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param ruler.podAffinityPreset Pod affinity preset. Ignored if `ruler.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param ruler.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `ruler.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node ruler.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param ruler.nodeAffinityPreset.type Node affinity preset type. Ignored if `ruler.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param ruler.nodeAffinityPreset.key Node label key to match. Ignored if `ruler.affinity` is set
+    ##
+    key: ""
+    ## @param ruler.nodeAffinityPreset.values Node label values to match. Ignored if `ruler.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param ruler.affinity Affinity for ruler pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `ruler.podAffinityPreset`, `ruler.podAntiAffinityPreset`, and `ruler.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param ruler.nodeSelector Node labels for Ruler pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param ruler.tolerations Tolerations for Ruler pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param ruler.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param ruler.priorityClassName Ruler pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param ruler.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param ruler.updateStrategy.type Ruler statefulset strategy type
+  ## @param ruler.updateStrategy.rollingUpdate Ruler statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param ruler.extraVolumes Optionally specify extra list of additional volumes for the Ruler pod(s)
+  ##
+  extraVolumes: []
+  ## @param ruler.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the ruler container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param ruler.sidecars Add additional sidecar containers to the Ruler pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param ruler.initContainers Add additional init containers to the Ruler pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section Ruler Persistence Parameters
+  ##
+
+  ## Enable persistence using Persistent Volume Claims
+  ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/
+  ##
+  persistence:
+    ## @param ruler.persistence.enabled Enable persistence in Ruler instances
+    ##
+    enabled: true
+    ## @param ruler.persistence.storageClass PVC Storage Class for Memcached data volume
+    ## If defined, storageClassName: <storageClass>
+    ## If set to "-", storageClassName: "", which disables dynamic provisioning
+    ## If undefined (the default) or set to null, no storageClassName spec is
+    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+    ##   GKE, AWS & OpenStack)
+    ##
+    storageClass: ""
+    ## @param ruler.persistence.subPath The subdirectory of the volume to mount to
+    ##
+    subPath: ""
+    ## @param ruler.persistence.accessModes PVC Access modes
+    ##
+    accessModes:
+      - ReadWriteOnce
+    ## @param ruler.persistence.size PVC Storage Request for Memcached data volume
+    ##
+    size: 8Gi
+    ## @param ruler.persistence.annotations Additional PVC annotations
+    ##
+    annotations: {}
+    ## @param ruler.persistence.selector Selector to match an existing Persistent Volume for Ruler's data PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
+
+  ## @section Ruler Traffic Exposure Parameters
+  ##
+
+  ## ruler service parameters
+  ##
+  service:
+    ## @param ruler.service.type Ruler service type
+    ##
+    type: ClusterIP
+    ## @param ruler.service.ports.http Ruler HTTP service port
+    ## @param ruler.service.ports.grpc Ruler GRPC service port
+    ##
+    ports:
+      http: 3100
+      grpc: 9095
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param ruler.service.nodePorts.http Node port for HTTP
+    ## @param ruler.service.nodePorts.grpc Node port for GRPC
+    ##
+    nodePorts:
+      http: ""
+      grpc: ""
+    ## @param ruler.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param ruler.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param ruler.service.clusterIP Ruler service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param ruler.service.loadBalancerIP Ruler service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param ruler.service.loadBalancerSourceRanges Ruler service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param ruler.service.externalTrafficPolicy Ruler service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param ruler.service.annotations Additional custom annotations for Ruler service
+    ##
+    annotations: {}
+    ## @param ruler.service.extraPorts Extra ports to expose in the Ruler service
+    ##
+    extraPorts: []
+
+## @section table-manager Deployment Parameters
+##
+tableManager:
+  ## @param tableManager.enabled Deploy table-manager
+  ##
+  enabled: false
+  ## @param tableManager.extraEnvVars Array with extra environment variables to add to tableManager nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param tableManager.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for tableManager nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param tableManager.extraEnvVarsSecret Name of existing Secret containing extra env vars for tableManager nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param tableManager.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param tableManager.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param tableManager.replicaCount Number of table-manager replicas to deploy
+  ##
+  replicaCount: 1
+  ## Configure extra options for table-manager containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param tableManager.livenessProbe.enabled Enable livenessProbe on table-manager nodes
+  ## @param tableManager.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param tableManager.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param tableManager.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param tableManager.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param tableManager.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param tableManager.readinessProbe.enabled Enable readinessProbe on table-manager nodes
+  ## @param tableManager.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param tableManager.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param tableManager.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param tableManager.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param tableManager.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param tableManager.startupProbe.enabled Enable startupProbe on table-manager containers
+  ## @param tableManager.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param tableManager.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param tableManager.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param tableManager.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param tableManager.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param tableManager.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param tableManager.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param tableManager.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## tableManager resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param tableManager.resources.limits The resources limits for the tableManager containers
+  ## @param tableManager.resources.requests The requested resources for the tableManager containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param tableManager.podSecurityContext.enabled Enabled table-manager pods' Security Context
+  ## @param tableManager.podSecurityContext.fsGroup Set table-manager pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param tableManager.containerSecurityContext.enabled Enabled table-manager containers' Security Context
+  ## @param tableManager.containerSecurityContext.runAsUser Set table-manager containers' Security Context runAsUser
+  ## @param tableManager.containerSecurityContext.runAsNonRoot Set table-manager containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    runAsNonRoot: true
+  ## @param tableManager.lifecycleHooks for the tableManager container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param tableManager.hostAliases tableManager pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param tableManager.podLabels Extra labels for tableManager pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param tableManager.podAnnotations Annotations for tableManager pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param tableManager.podAffinityPreset Pod affinity preset. Ignored if `tableManager.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param tableManager.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `tableManager.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node tableManager.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param tableManager.nodeAffinityPreset.type Node affinity preset type. Ignored if `tableManager.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param tableManager.nodeAffinityPreset.key Node label key to match. Ignored if `tableManager.affinity` is set
+    ##
+    key: ""
+    ## @param tableManager.nodeAffinityPreset.values Node label values to match. Ignored if `tableManager.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param tableManager.affinity Affinity for table-manager pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `tableManager.podAffinityPreset`, `tableManager.podAntiAffinityPreset`, and `tableManager.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param tableManager.nodeSelector Node labels for table-manager pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param tableManager.tolerations Tolerations for table-manager pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param tableManager.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param tableManager.priorityClassName table-manager pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param tableManager.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param tableManager.updateStrategy.type table-manager statefulset strategy type
+  ## @param tableManager.updateStrategy.rollingUpdate table-manager statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param tableManager.extraVolumes Optionally specify extra list of additional volumes for the table-manager pod(s)
+  ##
+  extraVolumes: []
+  ## @param tableManager.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the table-manager container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param tableManager.sidecars Add additional sidecar containers to the table-manager pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param tableManager.initContainers Add additional init containers to the table-manager pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @section table-manager Traffic Exposure Parameters
+  ##
+
+  ## tableManager service parameters
+  ##
+  service:
+    ## @param tableManager.service.type table-manager service type
+    ##
+    type: ClusterIP
+    ## @param tableManager.service.ports.http table-manager HTTP service port
+    ## @param tableManager.service.ports.grpc table-manager GRPC service port
+    ##
+    ports:
+      http: 3100
+      grpc: 9095
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param tableManager.service.nodePorts.http Node port for HTTP
+    ## @param tableManager.service.nodePorts.grpc Node port for GRPC
+    ##
+    nodePorts:
+      http: ""
+      grpc: ""
+    ## @param tableManager.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param tableManager.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param tableManager.service.clusterIP table-manager service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param tableManager.service.loadBalancerIP table-manager service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param tableManager.service.loadBalancerSourceRanges table-manager service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param tableManager.service.externalTrafficPolicy table-manager service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param tableManager.service.annotations Additional custom annotations for table-manager service
+    ##
+    annotations: {}
+    ## @param tableManager.service.extraPorts Extra ports to expose in the table-manager service
+    ##
+    extraPorts: []
+
+## @section Promtail Deployment Parameters
+##
+promtail:
+  ## Bitnami Promtail image
+  ## ref: https://hub.docker.com/r/bitnami/grafana-promtail/tags/
+  ## @param promtail.image.registry Grafana Promtail image registry
+  ## @param promtail.image.repository Grafana Promtail image repository
+  ## @param promtail.image.tag Grafana Promtail image tag (immutable tags are recommended)
+  ## @param promtail.image.pullPolicy Grafana Promtail image pull policy
+  ## @param promtail.image.pullSecrets Grafana Promtail image pull secrets
+  ##
+  image:
+    registry: docker.io
+    repository: bitnami/promtail
+    tag: 2.5.0-debian-10-r3
+    ## Specify a imagePullPolicy
+    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+    ##
+    pullPolicy: IfNotPresent
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ## e.g:
+    ## pullSecrets:
+    ##   - myRegistryKeySecretName
+    ##
+    pullSecrets: []
+
+  ## @param promtail.extraEnvVars Array with extra environment variables to add to promtail nodes
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param promtail.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for promtail nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param promtail.extraEnvVarsSecret Name of existing Secret containing extra env vars for promtail nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param promtail.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param promtail.args Override default container args (useful when using custom images)
+  ##
+  args: []
+
+  ## @param promtail.containerPorts.http Promtail HTTP port
+  ##
+  containerPorts:
+    http: 8080
+
+  ## Configure extra options for Promtail containers' liveness, readiness and startup probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+  ## @param promtail.livenessProbe.enabled Enable livenessProbe on Promtail nodes
+  ## @param promtail.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param promtail.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param promtail.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param promtail.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param promtail.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param promtail.readinessProbe.enabled Enable readinessProbe on Promtail nodes
+  ## @param promtail.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param promtail.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param promtail.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param promtail.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param promtail.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    failureThreshold: 3
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 1
+  ## @param promtail.startupProbe.enabled Enable startupProbe on Promtail containers
+  ## @param promtail.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param promtail.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param promtail.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param promtail.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param promtail.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+  ## @param promtail.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param promtail.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param promtail.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## @param promtail.lifecycleHooks for the promtail container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## promtail resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param promtail.resources.limits The resources limits for the Promtail containers
+  ## @param promtail.resources.requests The requested resources for the Promtail containers
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param promtail.podSecurityContext.enabled Enabled Promtail pods' Security Context
+  ## @param promtail.podSecurityContext.fsGroup Set Promtail pod's Security Context fsGroup
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroup: 0
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param promtail.containerSecurityContext.enabled Enabled Promtail containers' Security Context
+  ## @param promtail.containerSecurityContext.runAsUser Set Promtail containers' Security Context runAsUser
+  ## @param promtail.containerSecurityContext.runAsNonRoot Set Promtail containers' Security Context runAsNonRoot
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 0
+    runAsNonRoot: false
+  ## @param promtail.hostAliases promtail pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param promtail.podLabels Extra labels for promtail pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param promtail.podAnnotations Annotations for promtail pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param promtail.podAffinityPreset Pod affinity preset. Ignored if `promtail.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param promtail.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `promtail.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node promtail.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param promtail.nodeAffinityPreset.type Node affinity preset type. Ignored if `promtail.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param promtail.nodeAffinityPreset.key Node label key to match. Ignored if `promtail.affinity` is set
+    ##
+    key: ""
+    ## @param promtail.nodeAffinityPreset.values Node label values to match. Ignored if `promtail.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param promtail.affinity Affinity for promtail pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `promtail.podAffinityPreset`, `promtail.podAntiAffinityPreset`, and `promtail.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param promtail.nodeSelector Node labels for Promtail pods assignment
+  ## ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param promtail.tolerations Tolerations for Promtail pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param promtail.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: {}
+  ## @param promtail.priorityClassName Promtail pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param promtail.schedulerName Kubernetes pod scheduler registry
+  ## https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param promtail.updateStrategy.type Promtail statefulset strategy type
+  ## @param promtail.updateStrategy.rollingUpdate Promtail statefulset rolling update configuration parameters
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate: {}
+  ## @param promtail.extraVolumes Optionally specify extra list of additional volumes for the Promtail pod(s)
+  ##
+  extraVolumes: []
+  ## @param promtail.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the promtail container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param promtail.sidecars Add additional sidecar containers to the Promtail pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param promtail.initContainers Add additional init containers to the Promtail pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+
+  ## @param promtail.configuration [string] Promtail configuration
+  ##
+  configuration: |
+    server:
+      log_level: {{ .Values.promtail.logLevel }}
+      http_listen_port: {{ .Values.promtail.containerPorts.http }}
+
+    clients:
+      - url: http://{{ include "grafana-loki.gateway.fullname" . }}:{{ .Values.gateway.service.ports.http }}/loki/api/v1/push
+        {{- if .Values.gateway.auth.enabled }}
+        basic_auth:
+          # The username to use for basic auth
+          username: {{ .Values.gateway.auth.username }}
+          password_file: /bitnami/promtail/conf/secrets/password
+        {{- end }}
+    positions:
+      filename: /run/promtail/positions.yaml
+
+    scrape_configs:
+      # See also https://github.com/grafana/loki/blob/master/production/ksonnet/promtail/scrape_config.libsonnet for reference
+      - job_name: kubernetes-pods
+        pipeline_stages:
+          - cri: {}
+        kubernetes_sd_configs:
+          - role: pod
+        relabel_configs:
+          - source_labels:
+              - __meta_kubernetes_pod_controller_name
+            regex: ([0-9a-z-.]+?)(-[0-9a-f]{8,10})?
+            action: replace
+            target_label: __tmp_controller_name
+          - source_labels:
+              - __meta_kubernetes_pod_label_app_kubernetes_io_name
+              - __meta_kubernetes_pod_label_app
+              - __tmp_controller_name
+              - __meta_kubernetes_pod_name
+            regex: ^;*([^;]+)(;.*)?$
+            action: replace
+            target_label: app
+          - source_labels:
+              - __meta_kubernetes_pod_label_app_kubernetes_io_component
+              - __meta_kubernetes_pod_label_component
+            regex: ^;*([^;]+)(;.*)?$
+            action: replace
+            target_label: component
+          - action: replace
+            source_labels:
+            - __meta_kubernetes_pod_node_name
+            target_label: node_name
+          - action: replace
+            source_labels:
+            - __meta_kubernetes_namespace
+            target_label: namespace
+          - action: replace
+            replacement: $1
+            separator: /
+            source_labels:
+            - namespace
+            - app
+            target_label: job
+          - action: replace
+            source_labels:
+            - __meta_kubernetes_pod_name
+            target_label: pod
+          - action: replace
+            source_labels:
+            - __meta_kubernetes_pod_container_name
+            target_label: container
+          - action: replace
+            replacement: /var/log/pods/*$1/*.log
+            separator: /
+            source_labels:
+            - __meta_kubernetes_pod_uid
+            - __meta_kubernetes_pod_container_name
+            target_label: __path__
+          - action: replace
+            regex: true/(.*)
+            replacement: /var/log/pods/*$1/*.log
+            separator: /
+            source_labels:
+            - __meta_kubernetes_pod_annotationpresent_kubernetes_io_config_hash
+            - __meta_kubernetes_pod_annotation_kubernetes_io_config_hash
+            - __meta_kubernetes_pod_container_name
+            target_label: __path__
+  ## @param promtail.existingSecret Name of a Secret that contains the Promtail configuration
+  ##
+  existingSecret: ""
+
+  ## @param promtail.logLevel Promtail logging level
+  ##
+  logLevel: info
+
+  ## @section Promtail Traffic Exposure Parameters
+  ##
+
+  ## promtail service parameters
+  ##
+  service:
+    ## @param promtail.service.type Promtail service type
+    ##
+    type: ClusterIP
+    ## @param promtail.service.ports.http Promtail HTTP service port
+    ##
+    ports:
+      http: 3100
+    ## Node ports to expose
+    ## NOTE: choose port between <30000-32767>
+    ## @param promtail.service.nodePorts.http Node port for HTTP
+    ##
+    nodePorts:
+      http: ""
+    ## @param promtail.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## @param promtail.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/user-guide/services/
+    ##
+    sessionAffinity: None
+    ## @param promtail.service.clusterIP Promtail service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param promtail.service.loadBalancerIP Promtail service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param promtail.service.loadBalancerSourceRanges Promtail service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param promtail.service.externalTrafficPolicy Promtail service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param promtail.service.annotations Additional custom annotations for Promtail service
+    ##
+    annotations: {}
+    ## @param promtail.service.extraPorts Extra ports to expose in the Promtail service
+    ##
+    extraPorts: []
+
+  ## Create RBAC
+  ## @param promtail.rbac.create Create RBAC rules
+  ##
+  rbac:
+    create: true
+  ## Service account for Loki to use
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
+  ##
+  serviceAccount:
+    ## @param promtail.serviceAccount.create Enable creation of ServiceAccount for Promtail pods
+    ##
+    create: true
+    ## @param promtail.serviceAccount.name The name of the ServiceAccount to use
+    ## If not set and create is true, a name is generated using the common.names.fullname template
+    ##
+    name: ""
+    ## @param promtail.serviceAccount.automountServiceAccountToken Allows auto mount of ServiceAccountToken on the promtail.serviceAccount.created
+    ## Can be set to false if pods using this promtail.serviceAccount.do not need to use K8s API
+    ##
+    automountServiceAccountToken: true
+    ## @param promtail.serviceAccount.annotations Additional custom annotations for the ServiceAccount
+    ##
+    annotations: {}
+
+## @section Init Container Parameters
+##
+
+## 'volumePermissions' init container parameters
+## Changes the owner and group of the persistent volume mount point to runAsUser:fsGroup values
+##   based on the *podSecurityContext/*containerSecurityContext parameters
+##
+volumePermissions:
+  ## @param volumePermissions.enabled Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup`
+  ##
+  enabled: false
+  ## Bitnami Shell image
+  ## ref: https://hub.docker.com/r/bitnami/bitnami-shell/tags/
+  ## @param volumePermissions.image.registry Bitnami Shell image registry
+  ## @param volumePermissions.image.repository Bitnami Shell image repository
+  ## @param volumePermissions.image.tag Bitnami Shell image tag (immutable tags are recommended)
+  ## @param volumePermissions.image.pullPolicy Bitnami Shell image pull policy
+  ## @param volumePermissions.image.pullSecrets Bitnami Shell image pull secrets
+  ##
+  image:
+    registry: docker.io
+    repository: bitnami/bitnami-shell
+    tag: 10-debian-10-r429
+    pullPolicy: IfNotPresent
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ## e.g:
+    ## pullSecrets:
+    ##   - myRegistryKeySecretName
+    ##
+    pullSecrets: []
+  ## Init container's resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param volumePermissions.resources.limits The resources limits for the init container
+  ## @param volumePermissions.resources.requests The requested resources for the init container
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Init container Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
+  ## @param volumePermissions.containerSecurityContext.runAsUser Set init container's Security Context runAsUser
+  ## NOTE: when runAsUser is set to special value "auto", init container will try to chown the
+  ##   data folder to auto-determined user&group, using commands: `id -u`:`id -G | cut -d" " -f2`
+  ##   "auto" is especially useful for OpenShift which has scc with dynamic user ids (and 0 is not allowed)
+  ##
+  containerSecurityContext:
+    runAsUser: 0
+
+## @section Other Parameters
+##
+
+## Service account for Loki to use
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
+##
+serviceAccount:
+  ## @param serviceAccount.create Enable creation of ServiceAccount for Loki pods
+  ##
+  create: false
+  ## @param serviceAccount.name The name of the ServiceAccount to use
+  ## If not set and create is true, a name is generated using the common.names.fullname template
+  ##
+  name: ""
+  ## @param serviceAccount.automountServiceAccountToken Allows auto mount of ServiceAccountToken on the serviceAccount created
+  ## Can be set to false if pods using this serviceAccount do not need to use K8s API
+  ##
+  automountServiceAccountToken: true
+  ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount
+  ##
+  annotations: {}
+
+## @section Metrics Parameters
+## Prometheus Exporter / Metrics
+##
+metrics:
+  ## @param metrics.enabled Enable metrics
+  ##
+  enabled: false
+  ## Prometheus Operator ServiceMonitor configuration
+  ##
+  serviceMonitor:
+    ## @param metrics.serviceMonitor.enabled Create ServiceMonitor Resource for scraping metrics using Prometheus Operator
+    ##
+    enabled: false
+    ## @param metrics.serviceMonitor.namespace Namespace for the ServiceMonitor Resource (defaults to the Release Namespace)
+    ##
+    namespace: ""
+    ## @param metrics.serviceMonitor.interval Interval at which metrics should be scraped.
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
+    ##
+    interval: ""
+    ## @param metrics.serviceMonitor.scrapeTimeout Timeout after which the scrape is ended
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
+    ##
+    scrapeTimeout: ""
+    ## @param metrics.serviceMonitor.labels Additional labels that can be used so ServiceMonitor will be discovered by Prometheus
+    ##
+    labels: {}
+    ## @param metrics.serviceMonitor.selector Prometheus instance selector labels
+    ## ref: https://github.com/bitnami/charts/tree/master/bitnami/prometheus-operator#prometheus-configuration
+    ##
+    selector: {}
+    ## @param metrics.serviceMonitor.relabelings RelabelConfigs to apply to samples before scraping
+    ##
+    relabelings: []
+    ## @param metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion
+    ##
+    metricRelabelings: []
+    ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint
+    ##
+    honorLabels: false
+    ## @param metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in prometheus.
+    ##
+    jobLabel: ""
+
+## @section External Memcached (Chunks) Parameters
+##
+externalMemcachedChunks:
+  ## @param externalMemcachedChunks.host Host of a running external memcached instance
+  ##
+  host: ""
+  ## @param externalMemcachedChunks.port Port of a running external memcached instance
+  ##
+  port: 11211
+
+## @section Memcached Sub-chart Parameters (Chunks)
+## Memcached sub-chart (Chunks)
+##
+memcachedchunks:
+  ## @param memcachedchunks.enabled Deploy memcached sub-chart
+  ##
+  enabled: true
+  ## @param memcachedchunks.nameOverride override the subchart name
+  ##
+  nameOverride: ""
+  ## @param memcachedchunks.architecture Memcached architecture
+  ##
+  architecture: high-availability
+  ## @param memcachedchunks.service.ports.memcached Memcached service port
+  ##
+  service:
+    ports:
+      memcached: 11211
+
+## @section External Memcached (Frontend) Parameters
+##
+externalMemcachedFrontend:
+  ## @param externalMemcachedFrontend.host Host of a running external memcached instance
+  ##
+  host: ""
+  ## @param externalMemcachedFrontend.port Port of a running external memcached instance
+  ##
+  port: 11211
+
+## @section Memcached Sub-chart Parameters (Frontend)
+## Memcached sub-chart (Frontend)
+##
+memcachedfrontend:
+  ## @param memcachedfrontend.enabled Deploy memcached sub-chart
+  ##
+  enabled: true
+  ## @param memcachedfrontend.architecture Memcached architecture
+  ##
+  architecture: high-availability
+  ## @param memcachedfrontend.nameOverride override the subchart name
+  ##
+  nameOverride: ""
+  ## @param memcachedfrontend.service.ports.memcached Memcached service port
+  ##
+  service:
+    ports:
+      memcached: 11211
+
+## @section External Memcached (Index-Queries) Parameters
+##
+externalMemcachedIndexQueries:
+  ## @param externalMemcachedIndexQueries.host Host of a running external memcached instance
+  ##
+  host: ""
+  ## @param externalMemcachedIndexQueries.port Port of a running external memcached instance
+  ##
+  port: 11211
+
+## @section Memcached Sub-chart Parameters (Index-Queries)
+## Memcached sub-chart (Index-Queries)
+##
+memcachedindexqueries:
+  ## @param memcachedindexqueries.enabled Deploy memcached sub-chart
+  ##
+  enabled: true
+  ## @param memcachedindexqueries.architecture Memcached architecture
+  ##
+  architecture: high-availability
+  ## @param memcachedindexqueries.nameOverride override the subchart name
+  ##
+  nameOverride: ""
+  ## @param memcachedindexqueries.service.ports.memcached Memcached service port
+  ##
+  service:
+    ports:
+      memcached: 11211
+
+## @section External Memcached (IndexWrites) Parameters
+##
+externalMemcachedIndexWrites:
+  ## @param externalMemcachedIndexWrites.host Host of a running external memcached instance
+  ##
+  host: ""
+  ## @param externalMemcachedIndexWrites.port Port of a running external memcached instance
+  ##
+  port: 11211
+
+## @section Memcached Sub-chart Parameters (Index-Writes)
+## Memcached sub-chart (Index-Writes)
+##
+memcachedindexwrites:
+  ## @param memcachedindexwrites.enabled Deploy memcached sub-chart
+  ##
+  enabled: false
+  ## @param memcachedindexwrites.architecture Memcached architecture
+  ##
+  architecture: high-availability
+  ## @param memcachedindexwrites.nameOverride override the subchart name
+  ##
+  nameOverride: ""
+  ## @param memcachedindexwrites.service.ports.memcached Memcached service port
+  ##
+  service:
+    ports:
+      memcached: 11211