diff --git a/stable/redash/.helmignore b/stable/redash/.helmignore new file mode 100644 index 000000000000..f0c131944441 --- /dev/null +++ b/stable/redash/.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 diff --git a/stable/redash/Chart.yaml b/stable/redash/Chart.yaml new file mode 100644 index 000000000000..af1dc21e5d56 --- /dev/null +++ b/stable/redash/Chart.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +name: redash +version: 1.0.0 +appVersion: 6.0.0.b8537 +description: Redash is an open source tool built for teams to query, visualize and collaborate. +keywords: +- redash +- analytics +- vizualisation +home: https://redash.io/ +sources: +- https://github.com/getredash/redash +icon: https://redash.io/assets/images/elements/redash-logo.svg +maintainers: +- name: grugnog + email: owen.barton@civicactions.com +engine: gotpl diff --git a/stable/redash/README.md b/stable/redash/README.md new file mode 100644 index 000000000000..0fc4328e21d8 --- /dev/null +++ b/stable/redash/README.md @@ -0,0 +1,114 @@ +# Redash + +[Redash](http://redash.io/) is an open source tool built for teams to query, visualize and collaborate. Redash is quick to setup and works with any data source you might need so you can query from anywhere in no time. + +## TL;DR + +```bash +$ helm install stable/redash +``` + +## Introduction + +This chart bootstraps a [Redash](https://github.com/getredash/redash) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +## Prerequisites + +- At least 3 GB of RAM available on your cluster +- Kubernetes 1.9+ with Beta APIs enabled +- PV provisioner support in the underlying infrastructure + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```bash +$ helm install --name my-release stable/redash +``` + +The command deploys Redash on the Kubernetes cluster in the default configuration. The [configuration](#configuration) 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: + +```bash +$ helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +## Configuration + +The following table lists the configurable parameters of the Redash chart and their default values. + +| Parameter | Description | Default | +|----------------------------------------|-------------------------------------------------------|--------------------| +| `image.repository` | Redash Image name | `redash/redash` | +| `image.tag` | Redash Image tag | `{VERSION}` | +| `image.pullPolicy` | Image pull policy | `IfNotPresent` | +| `image.pullSecrets` | Specify docker-ragistry secret names as an array | `nil` | +| `cookieSecret` | Secret used for cookie session management | Randomly generated | +| `env` | Environment variables from [Redash settings](https://redash.io/help-onpremise/setup/settings-environment-variables.html) and [example Docker Compose](https://github.com/getredash/redash/blob/master/docker-compose.production.yml). Variables applied to both server and worker containers. | `PYTHONUNBUFFERED: 0`
`REDASH_LOG_LEVEL: "INFO"` | +| `server.name` | Name used for Redash server deployment | `redash` | +| `server.httpPort` | Redash server container http port | `5000` | +| `server.env` | Environment variables from [Redash settings](https://redash.io/help-onpremise/setup/settings-environment-variables.html) and [example Docker Compose](https://github.com/getredash/redash/blob/master/docker-compose.production.yml). Variables applied to only server containers. | `REDASH_WEB_WORKERS: 4` | +| `server.replicaCount` | Number of Redash server replicas to start | `1` | +| `server.resources` | Server CPU/Memory resource requests/limits | Memory `2GB` | +| `server.nodeSelector` | Node labels for server pod assignment | `{}` | +| `server.tolerations` | List of node taints to tolerate for server pod | `[]` | +| `server.affinity` | Affinity settings for server pod assignment | `{}` | +| `service.type` | Kubernetes Service type | `ClusterIP` | +| `service.port` | Service external port | `80` | +| `ingress.enabled` | Enable ingress controller resource | `false` | +| `ingress.annotations` | Ingress annotations configuration | `nil` | +| `ingress.path` | Ingress resource path | `nil` | +| `ingress.hosts` | Ingress resource hostnames | `nil` | +| `ingress.tls` | Ingress TLS configuration | `nil` | +| `adhocWorker.name` | Name used for Redash ad-hoc worker deployment | `worker-adhoc` | +| `adhocWorker.env` | Environment variables from [Redash settings](https://redash.io/help-onpremise/setup/settings-environment-variables.html) and [example Docker Compose](https://github.com/getredash/redash/blob/master/docker-compose.production.yml). Variables applied to only ad-hoc worker containers. Default worker count will run 2 worker threads per-replica. | `QUEUES: "queries,celery"`
`WORKERS_COUNT: 2` | +| `adhocWorker.replicaCount` | Number of Redash adhoc worker replicas to start | `1` | +| `adhocWorker.resources` | Ad-hoc worker CPU/Memory resource requests/limits | `nil` | +| `adhocWorker.nodeSelector` | Node labels for adhocWorker pod assignment | `{}` | +| `adhocWorker.tolerations` | List of node taints to tolerate for adhocWorker pod | `[]` | +| `adhocWorker.affinity` | Affinity settings for adhocWorker pod assignment | `{}` | +| `scheduledWorker.name` | Name used for Redash scheduled worker deployment | `worker-scheduled` | +| `scheduledWorker.env` | Environment variables from [Redash settings](https://redash.io/help-onpremise/setup/settings-environment-variables.html) and [example Docker Compose](https://github.com/getredash/redash/blob/master/docker-compose.production.yml). Variables applied to only scheduled worker containers. Default worker count will run 2 worker threads per-replica. | `QUEUES: "scheduled_queries"`
`WORKERS_COUNT: 2` | +| `scheduledWorker.replicaCount` | Number of Redash scheduled worker replicas to start | `1` | +| `scheduledWorker.resources` | Scheduled worker CPU/Memory resource requests/limits | `nil` | +| `scheduledWorker.nodeSelector` | Node labels for scheduledWorker pod assignment | `{}` | +| `scheduledWorker.tolerations` | List of node taints to tolerate for scheduledWorker pod | `[]` | +| `scheduledWorker.affinity` | Affinity settings for scheduledWorker pod assignment | `{}` | +| `externalPostgreSQL` | Connection string for external PostgreSQL server, if disabling the PostgreSQL chart | `nil` | +| `postgresql.enabled` | Whether to use the PostgreSQL chart | `true` | +| `postgresql.name` | Name used for PostgreSQL deployment | `postgresql` | +| `postgresql.imageTag` | PostgreSQL image version | `9.5.6-alpine` | +| `postgresql.postgresqlUsername` | PostgreSQL User to create | `redash` | +| `postgresql.postgresqlPassword` | PostgreSQL Password for the new user | random 10 character long alphanumeric string | +| `postgresql.postgresqlDatabase` | PostgreSQL Database to create | `redash` | +| `postgresql.persistence.enabled` | Use a PVC to persist PostgreSQL data | `true` | +| `postgresql.persistence.size` | PVC Storage Request size for PostgreSQL volume | `10Gi` | +| `postgresql.persistence.accessMode` | Use PostgreSQL volume as ReadOnly or ReadWrite | `ReadWriteOnce` | +| `postgresql.persistence.storageClass` | Storage Class for PostgreSQL backing PVC | `nil`
(uses alpha storage class annotation) | +| `postgresql.persistence.existingClaim` | Provide an existing PostgreSQL PersistentVolumeClaim | `nil` | +| `redis.name` | Name used for Redis deployment | `redis` | +| `redis.redisPassword` | Redis Password to use | random 10 character long alphanumeric string | + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```bash +$ helm install --name my-release \ + --set cookieSecret=verysecret \ + stable/redash +``` + +The above command sets the Redash cookie secret to `verysecret`. + +Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, + +```bash +$ helm install --name my-release -f values.yaml stable/redash +``` +> **Tip**: You can use the default [values.yaml](values.yaml) \ No newline at end of file diff --git a/stable/redash/requirements.lock b/stable/redash/requirements.lock new file mode 100644 index 000000000000..08f9a30e83e0 --- /dev/null +++ b/stable/redash/requirements.lock @@ -0,0 +1,9 @@ +dependencies: +- name: redis + repository: https://kubernetes-charts.storage.googleapis.com/ + version: 5.3.0 +- name: postgresql + repository: https://kubernetes-charts.storage.googleapis.com/ + version: 3.9.3 +digest: sha256:5e955a05a1eb5e3330f86b0a7bbe7b76c8b4eb829edbde39aad40f464363bbf6 +generated: 2019-01-23T16:23:07.055667082-08:00 diff --git a/stable/redash/requirements.yaml b/stable/redash/requirements.yaml new file mode 100644 index 000000000000..fa5b42aab6d2 --- /dev/null +++ b/stable/redash/requirements.yaml @@ -0,0 +1,8 @@ +dependencies: +- name: redis + version: "^5.0.0" + repository: "https://kubernetes-charts.storage.googleapis.com/" +- name: postgresql + version: "^3.0.0" + repository: "https://kubernetes-charts.storage.googleapis.com/" + condition: postgresql.enabled \ No newline at end of file diff --git a/stable/redash/templates/NOTES.txt b/stable/redash/templates/NOTES.txt new file mode 100644 index 000000000000..255dd024e7f1 --- /dev/null +++ b/stable/redash/templates/NOTES.txt @@ -0,0 +1,19 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range .Values.ingress.hosts }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "redash.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.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 svc -w {{ include "redash.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "redash.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "redash.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl port-forward $POD_NAME 8080:{{ .Values.server.httpPort }} +{{- end }} diff --git a/stable/redash/templates/_helpers.tpl b/stable/redash/templates/_helpers.tpl new file mode 100644 index 000000000000..74f2443430bf --- /dev/null +++ b/stable/redash/templates/_helpers.tpl @@ -0,0 +1,61 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "redash.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "redash.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 43 chars because some Kubernetes name fields are limited to 64 (by the DNS naming spec), +and we use this as a base for component names (which can add up to 20 chars). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "redash.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 43 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 43 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 43 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified adhocWorker name. +*/}} +{{- define "redash.adhocWorker.fullname" -}} +{{- template "redash.fullname" . -}}-adhocworker +{{- end -}} + +{{/* +Create a default fully qualified scheduledworker name. +*/}} +{{- define "redash.scheduledWorker.fullname" -}} +{{- template "redash.fullname" . -}}-scheduledworker +{{- end -}} + +{{/* +Create a default fully qualified postgresql name. +*/}} +{{- define "redash.postgresql.fullname" -}} +{{- printf "%s-%s" .Release.Name "postgresql" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified redis name. +*/}} +{{- define "redash.redis.fullname" -}} +{{- printf "%s-%s" .Release.Name "redis-master" | trunc 63 | trimSuffix "-" -}} +{{- end -}} \ No newline at end of file diff --git a/stable/redash/templates/adhocworker-deployment.yaml b/stable/redash/templates/adhocworker-deployment.yaml new file mode 100644 index 000000000000..b2bb7911d140 --- /dev/null +++ b/stable/redash/templates/adhocworker-deployment.yaml @@ -0,0 +1,94 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "redash.adhocWorker.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: adhocworker + helm.sh/chart: {{ include "redash.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + replicas: {{ .Values.adhocWorker.replicaCount }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: adhocworker + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: adhocworker + app.kubernetes.io/instance: {{ .Release.Name }} + spec: + containers: + - name: {{ include "redash.name" . }}-adhocworker + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["/bin/sh"] + args: ["-c", ". /config/dynamicenv.sh && /app/bin/docker-entrypoint scheduler"] + volumeMounts: + - name: config + mountPath: /config + env: + - name: REDASH_DATABASE_URL + {{- if not .Values.postgresql.enabled }} + value: {{ default "" .Values.externalPostgreSQL | quote }} + {{- end }} + - name: REDASH_DATABASE_USER + value: "{{ .Values.postgresql.postgresqlUsername }}" + - name: REDASH_DATABASE_PASSWORD + {{- if .Values.postgresql.enabled }} + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-postgresql + key: postgresql-password + {{- end }} + - name: REDASH_DATABASE_HOSTNAME + value: {{ include "redash.postgresql.fullname" . }} + - name: REDASH_DATABASE_PORT + value: "{{ .Values.postgresql.service.port }}" + - name: REDASH_DATABASE_DB + value: "{{ .Values.postgresql.postgresqlDatabase }}" + - name: REDASH_REDIS_PASSWORD + valueFrom: + secretKeyRef: + {{- if .Values.redis.existingSecret }} + name: {{ .Values.redis.existingSecret }} + {{- else }} + name: {{ .Release.Name }}-redis + {{- end }} + key: redis-password + - name: REDASH_REDIS_HOSTNAME + value: {{ include "redash.redis.fullname" . }} + - name: REDASH_REDIS_PORT + value: "{{ .Values.redis.master.port }}" + - name: REDASH_REDIS_DB + value: "{{ .Values.redis.databaseNumber }}" + {{- range $key, $value := .Values.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- range $key, $value := .Values.adhocWorker.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + resources: +{{ toYaml .Values.adhocWorker.resources | indent 12 }} + volumes: + - name: config + configMap: + name: {{ include "redash.fullname" . }} + {{- if .Values.adhocWorker.nodeSelector }} + nodeSelector: +{{ toYaml .Values.adhocWorker.nodeSelector | indent 8 }} + {{- end }} + {{- with .Values.adhocWorker.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.adhocWorker.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/stable/redash/templates/configmap.yaml b/stable/redash/templates/configmap.yaml new file mode 100644 index 000000000000..95969089ca14 --- /dev/null +++ b/stable/redash/templates/configmap.yaml @@ -0,0 +1,73 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "redash.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + helm.sh/chart: {{ include "redash.chart" . }} + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" +data: + createdb.sh: | + #!/usr/bin/env bash + # Check PostgreSQL is up and create the database on first run. + + # Status command timeout + STATUS_TIMEOUT=10 + # Create tables command timeout + CREATE_TIMEOUT=60 + # Time to wait between attempts + RETRY_WAIT=10 + # Max number of attempts + MAX_ATTEMPTS=10 + + # Load connection variables + . /config/dynamicenv.sh + # Initialize attempt counter + ATTEMPTS=0 + while (($ATTEMPTS < $MAX_ATTEMPTS)); do + echo "Starting attempt ${ATTEMPTS} of ${MAX_ATTEMPTS}" + ATTEMPTS=$((ATTEMPTS+1)) + STATUS=$(timeout $STATUS_TIMEOUT /app/manage.py status 2>&1) + RETCODE=$? + echo "Return code: ${RETCODE}" + echo "Status: ${STATUS}" + case "$RETCODE" in + 0) + echo "Tables already created." + exit 0 + ;; + 124) + echo "Status command timed out after ${STATUS_TIMEOUT} seconds." + ;; + esac + case "$STATUS" in + *sqlalchemy.exc.OperationalError*) + echo "Database not yet functional, waiting." + ;; + *sqlalchemy.exc.ProgrammingError*) + echo "Database tables not ready, creating tables now." + timeout $CREATE_TIMEOUT /app/manage.py database create_tables + echo "Tables created, final status:" + timeout $STATUS_TIMEOUT /app/manage.py status + exit 0 + ;; + esac + echo "Waiting ${RETRY_WAIT} seconds before retrying." + sleep 10 + done + echo "Reached ${MAX_ATTEMPTS} attempts, giving up." + exit 1 + dynamicenv.sh: | + # Build connection URLs from environment variables. + # NOTES: + # This script should be sourced, not run directly. + # All variables are expected to be set by the caller. + if [ -z "$REDASH_DATABASE_URL" ]; then + export REDASH_DATABASE_URL=postgresql://${REDASH_DATABASE_USER}:${REDASH_DATABASE_PASSWORD}@${REDASH_DATABASE_HOSTNAME}:${REDASH_DATABASE_PORT}/${REDASH_DATABASE_DB} + echo "Using Database: postgresql://${REDASH_DATABASE_USER}:******@${REDASH_DATABASE_HOSTNAME}:${REDASH_DATABASE_PORT}/${REDASH_DATABASE_DB}" + else + echo "Using external database" + fi + export REDASH_REDIS_URL=redis://:${REDASH_REDIS_PASSWORD}@${REDASH_REDIS_HOSTNAME}:${REDASH_REDIS_PORT}/${REDASH_REDIS_DB} + echo "Using Redis: redis://:******@${REDASH_REDIS_HOSTNAME}:${REDASH_REDIS_PORT}/${REDASH_REDIS_DB}" \ No newline at end of file diff --git a/stable/redash/templates/ingress.yaml b/stable/redash/templates/ingress.yaml new file mode 100644 index 000000000000..f651977de75f --- /dev/null +++ b/stable/redash/templates/ingress.yaml @@ -0,0 +1,38 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "redash.fullname" . -}} +{{- $ingressPath := .Values.ingress.path -}} +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + helm.sh/chart: {{ include "redash.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- with .Values.ingress.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +spec: +{{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ . }} + http: + paths: + - path: {{ $ingressPath }} + backend: + serviceName: {{ $fullName }} + servicePort: http + {{- end }} +{{- end }} diff --git a/stable/redash/templates/scheduledworker-deployment.yaml b/stable/redash/templates/scheduledworker-deployment.yaml new file mode 100644 index 000000000000..3c9b72a410aa --- /dev/null +++ b/stable/redash/templates/scheduledworker-deployment.yaml @@ -0,0 +1,94 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "redash.scheduledWorker.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: scheduledworker + helm.sh/chart: {{ include "redash.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + replicas: {{ .Values.scheduledWorker.replicaCount }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: scheduledworker + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: scheduledworker + app.kubernetes.io/instance: {{ .Release.Name }} + spec: + containers: + - name: {{ include "redash.name" . }}-scheduledworker + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["/bin/sh"] + args: ["-c", ". /config/dynamicenv.sh && /app/bin/docker-entrypoint scheduler"] + volumeMounts: + - name: config + mountPath: /config + env: + - name: REDASH_DATABASE_URL + {{- if not .Values.postgresql.enabled }} + value: {{ default "" .Values.externalPostgreSQL | quote }} + {{- end }} + - name: REDASH_DATABASE_USER + value: "{{ .Values.postgresql.postgresqlUsername }}" + - name: REDASH_DATABASE_PASSWORD + {{- if .Values.postgresql.enabled }} + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-postgresql + key: postgresql-password + {{- end }} + - name: REDASH_DATABASE_HOSTNAME + value: {{ include "redash.postgresql.fullname" . }} + - name: REDASH_DATABASE_PORT + value: "{{ .Values.postgresql.service.port }}" + - name: REDASH_DATABASE_DB + value: "{{ .Values.postgresql.postgresqlDatabase }}" + - name: REDASH_REDIS_PASSWORD + valueFrom: + secretKeyRef: + {{- if .Values.redis.existingSecret }} + name: {{ .Values.redis.existingSecret }} + {{- else }} + name: {{ .Release.Name }}-redis + {{- end }} + key: redis-password + - name: REDASH_REDIS_HOSTNAME + value: {{ include "redash.redis.fullname" . }} + - name: REDASH_REDIS_PORT + value: "{{ .Values.redis.master.port }}" + - name: REDASH_REDIS_DB + value: "{{ .Values.redis.databaseNumber }}" + {{- range $key, $value := .Values.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- range $key, $value := .Values.scheduledWorker.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + resources: +{{ toYaml .Values.scheduledWorker.resources | indent 12 }} + volumes: + - name: config + configMap: + name: {{ include "redash.fullname" . }} + {{- if .Values.scheduledWorker.nodeSelector }} + nodeSelector: +{{ toYaml .Values.scheduledWorker.nodeSelector | indent 8 }} + {{- end }} + {{- with .Values.scheduledWorker.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.scheduledWorker.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/stable/redash/templates/secrets.yaml b/stable/redash/templates/secrets.yaml new file mode 100644 index 000000000000..97a252fbf6db --- /dev/null +++ b/stable/redash/templates/secrets.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "redash.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + helm.sh/chart: {{ include "redash.chart" . }} + app.kubernetes.io/instance: "{{ .Release.Name }}" + app.kubernetes.io/managed-by: "{{ .Release.Service }}" +type: Opaque +data: + {{ if .Values.server.cookieSecret }} + cookieSecret: {{ default "" .Values.server.cookieSecret | b64enc | quote }} + {{ else }} + cookieSecret: {{ randAlphaNum 50 | b64enc | quote }} + {{ end }} \ No newline at end of file diff --git a/stable/redash/templates/server-deployment.yaml b/stable/redash/templates/server-deployment.yaml new file mode 100644 index 000000000000..a40faed201df --- /dev/null +++ b/stable/redash/templates/server-deployment.yaml @@ -0,0 +1,175 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "redash.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: server + helm.sh/chart: {{ include "redash.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + replicas: {{ .Values.server.replicaCount }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: server + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: server + app.kubernetes.io/instance: {{ .Release.Name }} + spec: + initContainers: + - name: {{ include "redash.name" . }}-server-createdb + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["bash", "/config/createdb.sh"] + volumeMounts: + - name: config + mountPath: /config + env: + - name: REDASH_COOKIE_SECRET + valueFrom: + secretKeyRef: + name: {{ include "redash.fullname" . }} + key: cookieSecret + - name: REDASH_DATABASE_URL + {{- if not .Values.postgresql.enabled }} + value: {{ default "" .Values.externalPostgreSQL | quote }} + {{- end }} + - name: REDASH_DATABASE_USER + value: "{{ .Values.postgresql.postgresqlUsername }}" + - name: REDASH_DATABASE_PASSWORD + {{- if .Values.postgresql.enabled }} + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-postgresql + key: postgresql-password + {{- end }} + - name: REDASH_DATABASE_HOSTNAME + value: {{ include "redash.postgresql.fullname" . }} + - name: REDASH_DATABASE_PORT + value: "{{ .Values.postgresql.service.port }}" + - name: REDASH_DATABASE_DB + value: "{{ .Values.postgresql.postgresqlDatabase }}" + - name: REDASH_REDIS_PASSWORD + valueFrom: + secretKeyRef: + {{- if .Values.redis.existingSecret }} + name: {{ .Values.redis.existingSecret }} + {{- else }} + name: {{ .Release.Name }}-redis + {{- end }} + key: redis-password + - name: REDASH_REDIS_HOSTNAME + value: {{ include "redash.redis.fullname" . }} + - name: REDASH_REDIS_PORT + value: "{{ .Values.redis.master.port }}" + - name: REDASH_REDIS_DB + value: "{{ .Values.redis.databaseNumber }}" + {{- range $key, $value := .Values.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- range $key, $value := .Values.server.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + containers: + - name: {{ include "redash.name" . }}-server + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["/bin/sh"] + args: ["-c", ". /config/dynamicenv.sh && /app/bin/docker-entrypoint server"] + volumeMounts: + - name: config + mountPath: /config + env: + - name: REDASH_COOKIE_SECRET + valueFrom: + secretKeyRef: + name: {{ include "redash.fullname" . }} + key: cookieSecret + - name: REDASH_DATABASE_URL + {{- if not .Values.postgresql.enabled }} + value: {{ default "" .Values.externalPostgreSQL | quote }} + {{- end }} + - name: REDASH_DATABASE_USER + value: "{{ .Values.postgresql.postgresqlUsername }}" + - name: REDASH_DATABASE_PASSWORD + {{- if .Values.postgresql.enabled }} + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-postgresql + key: postgresql-password + {{- end }} + - name: REDASH_DATABASE_HOSTNAME + value: {{ include "redash.postgresql.fullname" . }} + - name: REDASH_DATABASE_PORT + value: "{{ .Values.postgresql.service.port }}" + - name: REDASH_DATABASE_DB + value: "{{ .Values.postgresql.postgresqlDatabase }}" + - name: REDASH_REDIS_PASSWORD + valueFrom: + secretKeyRef: + {{- if .Values.redis.existingSecret }} + name: {{ .Values.redis.existingSecret }} + {{- else }} + name: {{ .Release.Name }}-redis + {{- end }} + key: redis-password + - name: REDASH_REDIS_HOSTNAME + value: {{ include "redash.redis.fullname" . }} + - name: REDASH_REDIS_PORT + value: "{{ .Values.redis.master.port }}" + - name: REDASH_REDIS_DB + value: "{{ .Values.redis.databaseNumber }}" + {{- range $key, $value := .Values.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- range $key, $value := .Values.server.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + ports: + - containerPort: {{ .Values.server.httpPort }} + livenessProbe: + exec: + command: ["/bin/sh", "-c", ". /config/dynamicenv.sh && /app/manage.py status"] + # Redash can take a while to come up initially, so we delay checks. + initialDelaySeconds: 90 + timeoutSeconds: 1 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 10 + readinessProbe: + httpGet: + path: /static/images/redash_icon_small.png + port: {{ .Values.server.httpPort }} + initialDelaySeconds: 10 + timeoutSeconds: 1 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 3 + resources: +{{ toYaml .Values.server.resources | indent 12 }} + volumes: + - name: config + configMap: + name: {{ include "redash.fullname" . }} + {{- with .Values.server.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.server.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.server.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} \ No newline at end of file diff --git a/stable/redash/templates/service.yaml b/stable/redash/templates/service.yaml new file mode 100644 index 000000000000..9b452849ffd1 --- /dev/null +++ b/stable/redash/templates/service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "redash.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "redash.name" . }} + helm.sh/chart: {{ include "redash.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: {{ .Values.server.httpPort }} + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "redash.name" . }} + app.kubernetes.io/component: server + app.kubernetes.io/instance: {{ .Release.Name }} \ No newline at end of file diff --git a/stable/redash/values.yaml b/stable/redash/values.yaml new file mode 100644 index 000000000000..9ae4a02cce83 --- /dev/null +++ b/stable/redash/values.yaml @@ -0,0 +1,200 @@ +## Default values for Redash. +## This is a YAML-formatted file. + +## Image used for server and worker pods +## +image: + repository: redash/redash + tag: 6.0.0.b8537 + pullPolicy: IfNotPresent + +## Override the name of the chart +## +nameOverride: "" + +## Redash global envrionment variables - applied to both server and worker containers +## Add any environment variables from https://redash.io/help-onpremise/setup/settings-environment-variables.html +## +env: + PYTHONUNBUFFERED: 0 + REDASH_LOG_LEVEL: "INFO" + +## Configuration for Redash web server +## +server: + ## Server container port (only useful if you are using a customized image) + httpPort: 5000 + + ## Secure value for session cookie secret - if not set a random value will be generated + # cookieSecret: + + ## Redash server specific envrionment variables + ## Add any environment variables from https://redash.io/help-onpremise/setup/settings-environment-variables.html + ## + env: + REDASH_WEB_WORKERS: 4 + + replicaCount: 1 + + ## Server resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: + # limits: + # cpu: 100m + # memory: 128Mi + requests: + # cpu: 100m + memory: 2Gi + + ## Node labels for server pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + ## Tolerations for server pod assignment + ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + + ## Affinity for server pod assignment + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## + affinity: {} + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + path: / + hosts: + - chart-example.local + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +## Configuration for Redash ad-hoc workers +## +adhocWorker: + ## Ad-hoc worker specific environment variables + ## Add any environment variables from https://redash.io/help-onpremise/setup/settings-environment-variables.html + ## + env: + QUEUES: "queries,celery" + WORKERS_COUNT: 2 + + replicaCount: 1 + + ## Ad-hoc worker resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + + ## Node labels for ad-hoc worker pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + ## Tolerations for ad-hoc worker pod assignment + ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + + ## Affinity for ad-hoc worker pod assignment + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## + affinity: {} + +## Configuration for Redash scheduled workers +## +scheduledWorker: + ## Scheduled worker specific environment variables + ## Add any environment variables from https://redash.io/help-onpremise/setup/settings-environment-variables.html + ## + env: + QUEUES: "scheduled_queries" + WORKERS_COUNT: 2 + + replicaCount: 1 + + ## Scheduled worker resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + + ## Node labels for scheduled worker pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + ## Tolerations for scheduled worker pod assignment + ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + + ## Affinity for scheduled worker pod assignment + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## + affinity: {} + +## +## External PostgreSQL configuration +## To use an external PostgreSQL instead of the automatically deployed +## postgresql chart: set postgresql.enabled to false then uncomment and +## configure the externalPostgreSQL connection URL. +## +# externalPostgreSQL: postgresql://user:pass@host:5432/database + +## Configuration values for the postgresql dependency +## This PostgreSQL instance is used for all Redash state storage +## ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md +## +postgresql: + ## Whether to deploy a PostgreSQL server to satisfy the applications database requirements. + ## To use an external PostgreSQL set this to false and configure the externalPostgreSQL parameter. + enabled: true + image: + ## Bitnami supported version closest to the one specified in Redash docker-compose.yml + ## + tag: "9.6.11-debian-9-r66" + postgresqlUsername: redash + ## If the password is not specified, a random password will be generated + ## + # postgresqlPassword: + postgresqlDatabase: redash + service: + type: ClusterIP + port: 5432 + externalIPs: [] + persistence: + enabled: true + ## If defined, storageClassName: + ## 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: "" + accessMode: ReadWriteOnce + size: 10Gi + # existingClaim: "" + +## Configuration values for the redis dependency +## This Redis instance is used for caching and temporary storage +## ref: https://github.com/kubernetes/charts/blob/master/stable/redis/README.md +## +redis: + ## If the password is not specified, a random password will be generated + ## + # password: + databaseNumber: 0 + master: + port: 6379 + cluster: + enabled: false