Helm Chart for Apache Druid

August 14, 2024 ยท View on GitHub

Quick Start

Apache Druid Helm Chart can be used to deploy a Druid cluster on Kubernetes with following commands:

# Add repository
$ helm repo add druid-helm https://asdf2014.github.io/druid-helm/

# Install chart
$ helm install my-druid druid-helm/druid --version 31.0.5

Install Local Chart

In addition to the above method, also you can install this local Druid Helm Chart.

First, you need update the dependencies:

$ cd charts/druid/
$ helm dependency update .

To install the Druid Chart into your Kubernetes cluster:

$ helm install druid . --namespace dev --create-namespace

After installation succeeds, you can get a status of Chart:

$ helm status druid -n dev 

If you want to delete your Chart, use this command:

$ helm uninstall druid -n dev

Helm Chart Configuration

The following table lists the configurable parameters of the Druid Helm Chart and their default values.

Common

ParameterDescriptionDefault
image.repositorycontainer image nameapache/druid
image.tagcontainer image tag31.0.0
image.pullPolicycontainer pull policyIfNotPresent
image.pullSecretsimage pull secrets for private repository[]
configMap.enabledenable druid configuration as configmaptrue
configVarsdruid configuration variables for all components``
gCloudStorage.enabledlook for secret to set google cloud credentialsfalse
gCloudStorage.secretNamesecretName to be mounted as google cloud credentialsfalse
rbac.createCreate roles and roleBindings for service Accountstrue

Router

ParameterDescriptionDefault
router.enabledenable routertrue
router.namerouter component namerouter
router.replicaCountrouter node replicas (deployment)1
router.portport of router component8888
router.serviceTypeservice type for serviceClusterIP
router.serviceAccount.createCreate a service account for router servicetrue
router.serviceAccount.nameService account nameDerived from the name of service
router.serviceAccount.annotationsAnnotations applied to created service account{}
router.serviceAccount.labelsLabels applied to created service account{}
router.serviceAccount.automountServiceAccountTokenAutomount API credentials for the Service Accounttrue
router.resourcesrouter node resources requests & limits{}
router.podAnnotationsrouter Deployment annotations{}
router.nodeSelectornode labels for router pod assignment{}
router.tolerationsrouter tolerations[]
router.configrouter private config such as JAVA_OPTS
router.affinityrouter affinity policy{}
router.ingress.enabledenable ingressfalse
router.ingress.hostshosts for the router api[ "chart-example.local" ]
router.ingress.pathpath of the router api/
router.ingress.annotationsannotations for the router api ingress{}
router.ingress.tlsTLS configuration for the ingress[]

Broker

ParameterDescriptionDefault
broker.enabledenable brokertrue
broker.namebroker component namebroker
broker.replicaCountbroker node replicas (deployment)1
broker.portport of broker component8082
broker.serviceAccount.createCreate a service account for broker servicetrue
broker.serviceAccount.nameService account nameDerived from the name of service
broker.serviceAccount.annotationsAnnotations applied to created service account{}
broker.serviceAccount.labelsLabels applied to created service account{}
broker.serviceAccount.automountServiceAccountTokenAutomount API credentials for the Service Accounttrue
broker.serviceTypeservice type for serviceClusterIP
broker.resourcesbroker node resources requests & limits{}
broker.podAnnotationsbroker deployment annotations{}
broker.nodeSelectorNode labels for broker pod assignment{}
broker.tolerationsbroker tolerations[]
broker.configbroker private config such as JAVA_OPTS
broker.affinitybroker affinity policy{}
broker.ingress.enabledenable ingressfalse
broker.ingress.hostshosts for the broker api[ "chart-example.local" ]
broker.ingress.pathpath of the broker api/
broker.ingress.annotationsannotations for the broker api ingress{}
broker.ingress.tlsTLS configuration for the ingress[]

Overlord

ParameterDescriptionDefault
overlord.enabledenable overlordtrue
overlord.nameoverlord component nameoverlord
overlord.replicaCountoverlord node replicas (deployment)1
overlord.portport of overlord component8081
overlord.serviceTypeservice type for serviceClusterIP
overlord.serviceAccount.createCreate a service account for overlord servicetrue
overlord.serviceAccount.nameService account nameDerived from the name of service
overlord.serviceAccount.annotationsAnnotations applied to created service account{}
overlord.serviceAccount.labelsLabels applied to created service account{}
overlord.serviceAccount.automountServiceAccountTokenAutomount API credentials for the Service Accounttrue
overlord.resourcesoverlord node resources requests & limits{}
overlord.podAnnotationsoverlord Deployment annotations{}
overlord.nodeSelectornode labels for overlord pod assignment{}
overlord.tolerationsoverlord tolerations[]
overlord.configoverlord private config such as JAVA_OPTS
overlord.affinityoverlord affinity policy{}
overlord.ingress.enabledenable ingressfalse
overlord.ingress.hostshosts for the overlord api[ "chart-example.local" ]
overlord.ingress.pathpath of the overlord api/
overlord.ingress.annotationsannotations for the overlord api ingress{}
overlord.ingress.tlsTLS configuration for the ingress[]

Coordinator

ParameterDescriptionDefault
coordinator.enabledenable coordinatortrue
coordinator.namecoordinator component namecoordinator
coordinator.replicaCountcoordinator node replicas (deployment)1
coordinator.portport of coordinator component8081
coordinator.serviceTypeservice type for serviceClusterIP
coordinator.serviceAccount.createCreate a service account for coordinator servicetrue
coordinator.serviceAccount.nameService account nameDerived from the name of service
coordinator.serviceAccount.annotationsAnnotations applied to created service account{}
coordinator.serviceAccount.labelsLabels applied to created service account{}
coordinator.serviceAccount.automountServiceAccountTokenAutomount API credentials for the Service Accounttrue
coordinator.resourcescoordinator node resources requests & limits{}
coordinator.podAnnotationscoordinator Deployment annotations{}
coordinator.nodeSelectornode labels for coordinator pod assignment{}
coordinator.tolerationscoordinator tolerations[]
coordinator.configcoordinator private config such as JAVA_OPTS
coordinator.affinitycoordinator affinity policy{}
coordinator.ingress.enabledenable ingressfalse
coordinator.ingress.hostshosts for the coordinator api[ "chart-example.local" ]
coordinator.ingress.pathpath of the coordinator api/
coordinator.ingress.annotationsannotations for the coordinator api ingress{}
coordinator.ingress.tlsTLS configuration for the ingress[]

MiddleManager

ParameterDescriptionDefault
middleManager.enabledenable middleManagertrue
middleManager.namemiddleManager component namemiddleManager
middleManager.replicaCountmiddleManager node replicas (statefulset)1
middleManager.portport of middleManager component8091
middleManager.serviceTypeservice type for serviceClusterIP
middleManager.serviceAccount.createCreate a service account for middleManager servicetrue
middleManager.serviceAccount.nameService account name``
middleManager.serviceAccount.annotationsAnnotations applied to created service account{}
middleManager.serviceAccount.labelsLabels applied to created service account{}
middleManager.serviceAccount.automountServiceAccountTokenAutomount API credentials for the Service Accounttrue
middleManager.resourcesmiddleManager node resources requests & limits{}
middleManager.podAnnotationsmiddleManager Deployment annotations{}
middleManager.nodeSelectorNode labels for middleManager pod assignment{}
middleManager.securityContextcustom security context for middleManager containers{ fsGroup: 1000 }
middleManager.tolerationsmiddleManager tolerations[]
middleManager.configmiddleManager private config such as JAVA_OPTS
middleManager.persistence.enabledmiddleManager persistent enabled/disabledtrue
middleManager.persistence.sizemiddleManager persistent volume size4Gi
middleManager.persistence.storageClassmiddleManager persistent volume Classnil
middleManager.persistence.accessModemiddleManager persistent Access ModeReadWriteOnce
middleManager.antiAffinitymiddleManager anti-affinity policysoft
middleManager.nodeAffinitymiddleManager node affinity policy{}
middleManager.autoscaling.enabledenable horizontal pod autoscalingfalse
middleManager.autoscaling.minReplicasmiddleManager autoscaling min replicas2
middleManager.autoscaling.maxReplicasmiddleManager autoscaling max replicas5
middleManager.autoscaling.metricsmiddleManager autoscaling metrics[]
middleManager.ingress.enabledenable ingressfalse
middleManager.ingress.hostshosts for the middleManager api[ "chart-example.local" ]
middleManager.ingress.pathpath of the middleManager api/
middleManager.ingress.annotationsannotations for the middleManager api ingress{}
middleManager.ingress.tlsTLS configuration for the ingress[]

Historical

ParameterDescriptionDefault
historical.enabledenable historicaltrue
historical.namehistorical component namehistorical
historical.replicaCounthistorical node replicas (statefulset)1
historical.portport of historical component8083
historical.serviceTypeservice type for serviceClusterIP
historical.serviceAccount.createCreate a service account for historical servicetrue
historical.serviceAccount.nameService account nameDerived from the name of service
historical.serviceAccount.annotationsAnnotations applied to created service account{}
historical.serviceAccount.labelsLabels applied to created service account{}
historical.serviceAccount.automountServiceAccountTokenAutomount API credentials for the Service Accounttrue
historical.resourceshistorical node resources requests & limits{}
historical.livenessProbeInitialDelaySecondshistorical node liveness probe initial delay in seconds60
historical.readinessProbeInitialDelaySecondshistorical node readiness probe initial delay in seconds60
historical.podAnnotationshistorical Deployment annotations{}
historical.nodeSelectornode labels for historical pod assignment{}
historical.securityContextcustom security context for historical containers{ fsGroup: 1000 }
historical.tolerationshistorical tolerations[]
historical.confighistorical node private config such as JAVA_OPTS
historical.persistence.enabledhistorical persistent enabled/disabledtrue
historical.persistence.sizehistorical persistent volume size4Gi
historical.persistence.storageClasshistorical persistent volume Classnil
historical.persistence.accessModehistorical persistent Access ModeReadWriteOnce
historical.antiAffinityhistorical anti-affinity policysoft
historical.nodeAffinityhistorical node affinity policy{}
historical.ingress.enabledenable ingressfalse
historical.ingress.hostshosts for the historical api[ "chart-example.local" ]
historical.ingress.pathpath of the historical api/
historical.ingress.annotationsannotations for the historical api ingress{}
historical.ingress.tlsTLS configuration for the ingress[]

PostgreSQL

ParameterDescriptionDefault
postgresql.enabledenable PostgreSQLtrue
postgresql.auth.usernamePostgreSQL usernamedruid
postgresql.auth.passwordPostgreSQL passworddruid
postgresql.auth.databasePostgreSQL databasedruid
postgresql.service.portPostgreSQL service port5432

Prometheus

ParameterDescriptionDefault
prometheus.enabledSupport scraping from prometheusfalse
prometheus.portexpose prometheus port9090
prometheus.annotationpods annotation to notify prometheus scraping{prometheus.io/scrape: "true", prometheus.io/port: "9090"}

Full and up-to-date documentation can be found in the comments of the values.yaml file.

Druid Configuration

Druid configuration can be changed by using environment variables from Docker image.

See the Druid Docker entry point for more information.

Ingress

The Chart provides ingress configuration to allow customization the installation by adapting the values.yaml depending on your setup. Please read the comments in the values.yaml file for more details on how to configure your reverse proxy or load balancer.

Persistence

MiddleManagers and Historicals use StatefulSet. Persistence has been enabled by default.

Thanks