diff --git a/helm-releases/pai-0.3.0.tgz b/helm-releases/pai-0.3.0.tgz new file mode 100644 index 000000000..67d6bc9b9 Binary files /dev/null and b/helm-releases/pai-0.3.0.tgz differ diff --git a/helm/Chart.lock b/helm/Chart.lock deleted file mode 100644 index 10b0b8ce1..000000000 --- a/helm/Chart.lock +++ /dev/null @@ -1,9 +0,0 @@ -dependencies: -- name: vector - repository: https://helm.vector.dev - version: 0.20.1 -- name: fluent-bit - repository: https://fluent.github.io/helm-charts - version: 0.25.0 -digest: sha256:5657989e00b94e31ddcb44d0c925f8d30849c46851879a27708b50cd1af6ee33 -generated: "2023-04-24T18:46:09.186176+05:30" diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 296b7c1cf..7b55783e7 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: parseable description: Helm chart for Parseable OSS version. Columnar data lake platform - purpose built for observability type: application -version: 2.8.2 +version: 4.0.0 appVersion: "v2.8.0" icon: "https://raw.githubusercontent.com/parseablehq/.github/main/images/logo.svg" @@ -10,14 +10,3 @@ maintainers: - name: Parseable Team email: hi@parseable.com url: https://parseable.com - -dependencies: -- name: vector - version: 0.20.1 - repository: https://helm.vector.dev - condition: vector.enabled -- name: fluent-bit - version: 0.48.0 - repository: https://fluent.github.io/helm-charts - condition: fluent-bit.enabled - \ No newline at end of file diff --git a/helm/README.md b/helm/README.md index e74171073..ed8f490c6 100644 --- a/helm/README.md +++ b/helm/README.md @@ -1,3 +1,94 @@ # Parseable Helm Chart -Refer the Parseable Helm Chart [documentation ↗︎](https://www.parseable.io/docs/installation/kubernetes-helm) +`values.yaml` holds the defaults. Layer an overlay from `overlays/` with `-f` to +pick a topology / store, and stack `overlays/enterprise.yaml` for Enterprise. + +``` +overlays/ + standalone.yaml single all-in-one pod (local-store) + aws.yaml distributed on S3 + gcp.yaml distributed on GCS + azure.yaml distributed on Azure Blob + enterprise.yaml adds prism; layer on top of a store overlay +``` + +## Standalone (single pod, local-store) + +```sh +kubectl create namespace parseable + +kubectl -n parseable create secret generic parseable-env-secret \ + --from-literal=addr=0.0.0.0:8000 \ + --from-literal=username=admin \ + --from-literal=password=admin + +helm install parseable ./ -n parseable -f overlays/standalone.yaml +``` + +## Distributed (querier + ingestors) + +Create the namespace, then the object-store secret for your cloud (below). + +```sh +kubectl create namespace parseable +``` + +### AWS (S3) + +```sh +kubectl -n parseable create secret generic parseable-env-secret \ + --from-literal=addr=0.0.0.0:8000 \ + --from-literal=username=admin --from-literal=password=admin \ + --from-literal=s3.url= \ + --from-literal=s3.access.key= --from-literal=s3.secret.key= \ + --from-literal=s3.bucket= --from-literal=s3.region= + +helm install parseable ./ -n parseable -f overlays/aws.yaml +``` + +### GCP (GCS) + +```sh +kubectl -n parseable create secret generic parseable-env-secret \ + --from-literal=addr=0.0.0.0:8000 \ + --from-literal=username=admin --from-literal=password=admin \ + --from-literal=gcs.url= --from-literal=gcs.bucket= + +kubectl -n parseable create secret generic parseable-gcs-key \ + --from-file=key.json= + +helm install parseable ./ -n parseable -f overlays/gcp.yaml +``` + +### Azure (Blob) + +```sh +kubectl -n parseable create secret generic parseable-env-secret \ + --from-literal=addr=0.0.0.0:8000 \ + --from-literal=username=admin --from-literal=password=admin \ + --from-literal=azr.access_key= --from-literal=azr.account= \ + --from-literal=azr.container= \ + --from-literal=azr.url=https://.blob.core.windows.net + +helm install parseable ./ -n parseable -f overlays/azure.yaml +``` + +## Enterprise (adds prism) + +Stack `overlays/enterprise.yaml` on top of a store overlay, and create the license secret. + +```sh +kubectl -n parseable create secret generic parseable-license \ + --from-file=parseable_license.json=/parseable_license.json \ + --from-file=parseable_license.sig=/parseable_license.sig + +helm install parseable ./ -n parseable \ + -f overlays/aws.yaml -f overlays/enterprise.yaml +``` + +## Upgrade / Uninstall + +```sh +helm upgrade parseable ./ -n parseable -f overlays/aws.yaml +helm uninstall parseable -n parseable +``` diff --git a/helm/charts/fluent-bit-0.48.1.tgz b/helm/charts/fluent-bit-0.48.1.tgz deleted file mode 100644 index cd471f645..000000000 Binary files a/helm/charts/fluent-bit-0.48.1.tgz and /dev/null differ diff --git a/helm/charts/vector-0.20.1.tgz b/helm/charts/vector-0.20.1.tgz deleted file mode 100644 index 349a449b9..000000000 Binary files a/helm/charts/vector-0.20.1.tgz and /dev/null differ diff --git a/helm/overlays/aws.yaml b/helm/overlays/aws.yaml new file mode 100644 index 000000000..5ca3780b0 --- /dev/null +++ b/helm/overlays/aws.yaml @@ -0,0 +1,19 @@ +# Parseable on AWS (S3), distributed mode. +parseable: + deploymentMode: distributed + store: + type: s3-store + secretName: parseable-env-secret + + distributed: + ingestor: + replicas: 3 + persistence: + staging: + storageClass: gp3 + size: 5Gi + querier: + persistence: + hotTier: + storageClass: gp3 + size: 100Gi diff --git a/helm/overlays/azure.yaml b/helm/overlays/azure.yaml new file mode 100644 index 000000000..592e325db --- /dev/null +++ b/helm/overlays/azure.yaml @@ -0,0 +1,19 @@ +# Parseable on Azure (Blob), distributed mode. +parseable: + deploymentMode: distributed + store: + type: blob-store + secretName: parseable-env-secret + + distributed: + ingestor: + replicas: 3 + persistence: + staging: + storageClass: managed-csi + size: 5Gi + querier: + persistence: + hotTier: + storageClass: managed-csi + size: 100Gi diff --git a/helm/overlays/enterprise.yaml b/helm/overlays/enterprise.yaml new file mode 100644 index 000000000..d17e5e4f9 --- /dev/null +++ b/helm/overlays/enterprise.yaml @@ -0,0 +1,13 @@ +# Parseable Enterprise (adds the prism coordinator). +# Layer this on top of a store overlay, e.g.: +# helm install parseable ./ -n parseable -f overlays/aws.yaml -f overlays/enterprise.yaml +# Requires a license secret (parseable-license) with keys +# parseable_license.json and parseable_license.sig. +parseable: + deploymentMode: distributed + enterprise: + enabled: true + image: + repository: quay.io/parseablehq/parseable-enterprise + tag: "" # defaults to .Chart.AppVersion + pullPolicy: IfNotPresent diff --git a/helm/overlays/gcp.yaml b/helm/overlays/gcp.yaml new file mode 100644 index 000000000..a4b93aad9 --- /dev/null +++ b/helm/overlays/gcp.yaml @@ -0,0 +1,23 @@ +# Parseable on GCP (GCS), distributed mode. +parseable: + deploymentMode: distributed + store: + type: gcs-store + secretName: parseable-env-secret + gcsCredentials: + secretName: parseable-gcs-key + secretKey: key.json + mountPath: /var/secrets/google + + distributed: + ingestor: + replicas: 3 + persistence: + staging: + storageClass: standard-rwo + size: 5Gi + querier: + persistence: + hotTier: + storageClass: standard-rwo + size: 100Gi diff --git a/helm/overlays/standalone.yaml b/helm/overlays/standalone.yaml new file mode 100644 index 000000000..0f2e7d317 --- /dev/null +++ b/helm/overlays/standalone.yaml @@ -0,0 +1,21 @@ +# Parseable standalone: a single all-in-one pod on local-store. +# Simplest way to run Parseable; does not scale horizontally (OSS only). +parseable: + deploymentMode: standalone + store: + type: local-store + + standalone: + unified: + persistence: + # local-store keeps ingested data on this volume, so persist it + data: + enabled: true + storageClass: "" + accessMode: ReadWriteOnce + size: 10Gi + staging: + enabled: true + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl index 67be278c9..991a4634c 100644 --- a/helm/templates/_helpers.tpl +++ b/helm/templates/_helpers.tpl @@ -7,8 +7,6 @@ Expand the name of the chart. {{/* Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. */}} {{- define "parseable.fullname" -}} {{- if .Values.parseable.fullnameOverride }} @@ -24,76 +22,27 @@ If release name contains chart name it will be used as a full name. {{- end }} {{/* -Create chart name and version as used by the chart label. +Chart name and version, for the helm.sh/chart label. */}} {{- define "parseable.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} {{- end }} {{/* -Common labels +Metadata labels attached to every object (no component/selector labels). */}} {{- define "parseable.labels" -}} helm.sh/chart: {{ include "parseable.chart" . }} -{{ include "parseable.labelsSelector" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Ingestor Labels -*/}} -{{- define "parseable.ingestorLabels" -}} -helm.sh/chart: {{ include "parseable.chart" . }} -{{ include "parseable.ingestorLabelsSelector" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} +app.kubernetes.io/name: {{ include "parseable.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Querier Labels -*/}} -{{- define "parseable.querierLabels" -}} -helm.sh/chart: {{ include "parseable.chart" . }} -{{ include "parseable.querierLabelsSelector" . }} {{- if .Chart.AppVersion }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} {{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "parseable.labelsSelector" -}} -app.kubernetes.io/name: {{ include "parseable.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Ingestor Labels Selector for ingestor statefulset -*/}} -{{- define "parseable.ingestorLabelsSelector" -}} -app.kubernetes.io/name: {{ include "parseable.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.parseable.com/type: ingestor -{{- end }} - -{{/* -Querier Labels Selector for querier deployment -*/}} -{{- define "parseable.querierLabelsSelector" -}} -app.kubernetes.io/name: {{ include "parseable.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.parseable.com/type: querier {{- end }} {{/* -Create the name of the service account to use +Name of the service account to use. */}} {{- define "parseable.serviceAccountName" -}} {{- if .Values.parseable.serviceAccount.create }} diff --git a/helm/templates/_helpers_config_logstream.txt b/helm/templates/_helpers_config_logstream.txt deleted file mode 100644 index 8e979d53c..000000000 --- a/helm/templates/_helpers_config_logstream.txt +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -set -e ; # Have script exit in the event of a failed command. -IFS=$' \t\r\n' - -createStream() { - STREAM=$1 - echo; - echo \"Creating the log stream $STREAM\"; - - {{ if .Values.parseable.highAvailability.enabled }} - response=$(curl -sS --header 'Content-Type: application/json' -u "$P_USERNAME":"$P_PASSWORD" -w 'HTTPSTATUS:%{http_code}' --location --request PUT "http://{{ include "parseable.fullname" . }}-querier-service.{{ .Release.Namespace }}:{{ $.Values.parseable.service.port }}/api/v1/logstream/$STREAM"); - {{ else }} - response=$(curl -sS --header 'Content-Type: application/json' -u "$P_USERNAME":"$P_PASSWORD" -w 'HTTPSTATUS:%{http_code}' --location --request PUT "http://{{ include "parseable.fullname" . }}.{{ .Release.Namespace }}:{{ $.Values.parseable.service.port }}/api/v1/logstream/$STREAM"); - {{ end }} - - HTTP_BODY=$(echo $response | sed -e 's/HTTPSTATUS\:.*//g') - HTTP_STATUS=$(echo $response | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') - - echo \"API response:\" - echo \"HTTP status code: $HTTP_STATUS\" - echo \"HTTP response message: $HTTP_BODY\" -} - -setRetention() { - STREAM=$1 - ACTION=$2 - DURATION=$3 - - echo; - echo \"Setting the retention for $STREAM\"; - - {{ if .Values.parseable.highAvailability.enabled }} - response=$(curl -sS --header 'Content-Type: application/json' -u "$P_USERNAME":"$P_PASSWORD" -w 'HTTPSTATUS:%{http_code}' --location --request PUT "http://{{ include "parseable.fullname" . }}-querier-service.{{ .Release.Namespace }}:{{ $.Values.parseable.service.port }}/api/v1/logstream/$STREAM/retention" --data "[{\"description\":\"$ACTION logs after $DURATION\",\"action\":\"$ACTION\",\"duration\":\"$DURATION\"}]"); - {{ else }} - response=$(curl -sS --header 'Content-Type: application/json' -u "$P_USERNAME":"$P_PASSWORD" -w 'HTTPSTATUS:%{http_code}' --location --request PUT "http://{{ include "parseable.fullname" . }}.{{ .Release.Namespace }}:{{ $.Values.parseable.service.port }}/api/v1/logstream/$STREAM/retention" --data "[{\"description\":\"$ACTION logs after $DURATION\",\"action\":\"$ACTION\",\"duration\":\"$DURATION\"}]"); - {{ end }} - - HTTP_BODY=$(echo $response | sed -e 's/HTTPSTATUS\:.*//g') - HTTP_STATUS=$(echo $response | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') - - echo \"API response:\" - echo \"HTTP status code: $HTTP_STATUS\" - echo \"HTTP response message: $HTTP_BODY\" -} - -{{ if .Values.parseable.logstream }} -# Create the logstream -{{- range .Values.parseable.logstream }} -createStream {{.name}} -setRetention {{.name}} {{.retention.action}} {{.retention.duration}} -{{- end }} -{{- end }} diff --git a/helm/templates/create-datasets-job.yaml b/helm/templates/create-datasets-job.yaml new file mode 100644 index 000000000..23cfa7371 --- /dev/null +++ b/helm/templates/create-datasets-job.yaml @@ -0,0 +1,66 @@ +{{- if .Values.parseable.datasets }} +{{- $p := .Values.parseable }} +{{- $fullname := include "parseable.fullname" . }} +{{- $target := ternary (printf "%s-standalone-service" $fullname) (printf "%s-querier-service" $fullname) (eq $p.deploymentMode "standalone") }} +{{- $url := printf "http://%s.%s" $target .Release.Namespace }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ $fullname }}-datasets + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} +data: + create-datasets.sh: |- + #!/bin/sh + set -eu + base="{{ $url }}" + {{- range $ds := $p.datasets }} + echo "Creating dataset {{ $ds.name }}..." + curl -sf -X PUT -u "$P_USERNAME:$P_PASSWORD" "$base/api/v1/logstream/{{ $ds.name }}" + {{- if $ds.retention }} + curl -sf -X PUT -u "$P_USERNAME:$P_PASSWORD" -H "Content-Type: application/json" \ + -d '[{"description":"created by helm","action":"{{ $ds.retention.action }}","duration":"{{ $ds.retention.duration }}"}]' \ + "$base/api/v1/logstream/{{ $ds.name }}/retention" + {{- end }} + {{- end }} + echo "Done." +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ $fullname }}-datasets + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded +spec: + backoffLimit: 10 + template: + metadata: + labels: + {{- include "parseable.labels" . | nindent 8 }} + spec: + restartPolicy: OnFailure + securityContext: + {{- toYaml $p.podSecurityContext | nindent 8 }} + volumes: + - name: script + configMap: + name: {{ $fullname }}-datasets + defaultMode: 0755 + containers: + - name: create-datasets + image: curlimages/curl:latest + command: [ "/bin/sh", "/scripts/create-datasets.sh" ] + env: + - name: P_USERNAME + valueFrom: { secretKeyRef: { name: {{ $p.store.secretName }}, key: username } } + - name: P_PASSWORD + valueFrom: { secretKeyRef: { name: {{ $p.store.secretName }}, key: password } } + volumeMounts: + - name: script + mountPath: /scripts +{{- end }} diff --git a/helm/templates/data-pvc.yaml b/helm/templates/data-pvc.yaml deleted file mode 100644 index 2df8e05f9..000000000 --- a/helm/templates/data-pvc.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.parseable.persistence.data.enabled }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "parseable.fullname" . }}-data-pvc - labels: - {{- include "parseable.labels" . | nindent 4 }} -spec: - accessModes: - - {{ .Values.parseable.persistence.data.accessMode | quote }} - resources: - requests: - storage: {{ .Values.parseable.persistence.data.size | quote }} - {{- if .Values.parseable.persistence.data.storageClass }} - storageClassName: "{{ .Values.parseable.persistence.data.storageClass }}" - {{- else }} - storageClassName: "" - {{- end }} -{{- end }} diff --git a/helm/templates/ingestor-service.yaml b/helm/templates/ingestor-service.yaml deleted file mode 100644 index ba3350744..000000000 --- a/helm/templates/ingestor-service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if eq .Values.parseable.highAvailability.enabled true }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "parseable.fullname" . }}-ingestor-service - namespace: {{ .Release.Namespace }} - labels: - {{- include "parseable.labelsSelector" . | nindent 4 }} -spec: - type: {{ $.Values.parseable.highAvailability.ingestor.service.type }} - ports: - - port: {{ $.Values.parseable.highAvailability.ingestor.service.port }} - targetPort: {{ .Values.parseable.highAvailability.ingestor.port }} - protocol: TCP - selector: - {{- include "parseable.ingestorLabelsSelector" . | nindent 4 }} -{{- end }} diff --git a/helm/templates/ingestor-statefulset.yaml b/helm/templates/ingestor-statefulset.yaml deleted file mode 100644 index 73185cd2b..000000000 --- a/helm/templates/ingestor-statefulset.yaml +++ /dev/null @@ -1,191 +0,0 @@ -{{- if eq .Values.parseable.highAvailability.enabled true }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "parseable.fullname" . }}-ingestor-headless - namespace: {{ .Release.Namespace }} -spec: - ports: - - port: 8000 - name: "parseable-port" - clusterIP: None - selector: - {{- include "parseable.ingestorLabelsSelector" . | nindent 4 }} ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "parseable.fullname" . }}-ingestor - namespace: {{ .Release.Namespace }} - labels: - {{- with .Values.parseable.highAvailability.ingestor.extraLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "parseable.ingestorLabelsSelector" . | nindent 6 }} - serviceName: {{ include "parseable.fullname" . }}-ingestor-headless - replicas: {{ .Values.parseable.highAvailability.ingestor.count }} - minReadySeconds: 2 - template: - metadata: - labels: - {{- .Values.parseable.highAvailability.ingestor.labels | toYaml | nindent 8 }} - {{- include "parseable.ingestorLabelsSelector" . | nindent 8 }} - spec: - {{- with .Values.parseable.highAvailability.ingestor.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - initContainers: - - name: wait-for-query-service - image: curlimages/curl:latest # Lightweight image with curl - command: - - /bin/sh - - -c - - | - echo "Waiting for query service readiness at /api/v1/readiness..." - for i in $(seq 1 60); do - if curl -sf http://{{ include "parseable.fullname" . }}-querier-service.{{ .Release.Namespace }}/api/v1/readiness; then - echo "Query service is ready!" - exit 0 - fi - echo "Query service is not ready yet. Retrying in 2 seconds..." - sleep 2 - done - echo "Query service did not become ready in time. Exiting." - exit 1 - terminationGracePeriodSeconds: 10 - serviceAccountName: {{ include "parseable.serviceAccountName" . }} - {{- with .Values.parseable.highAvailability.ingestor.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.parseable.highAvailability.ingestor.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - volumes: - - name: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - secret: - secretName: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - {{- end }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.parseable.securityContext | nindent 10 }} - image: {{ .Values.parseable.image.repository }}:{{ .Values.parseable.image.tag | default .Chart.AppVersion }} - imagePullPolicy: {{ .Values.parseable.image.pullPolicy }} - args: - - /usr/bin/parseable - - {{ .Values.parseable.store | quote }} - - --ingestor-endpoint=$(HOSTNAME).{{ include "parseable.fullname" . }}-ingestor-headless.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.parseable.highAvailability.ingestor.port }} - env: - - name: HOSTNAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: metadata.name - {{- range $key, $value := .Values.parseable.highAvailability.ingestor.env }} - - name: {{ $key }} - value: {{ tpl $value $ | quote }} - {{- end }} - - {{- if .Values.parseable.auditLogging.enabled }} - - name: P_AUDIT_LOGGER - value: {{ .Values.parseable.auditLogging.p_server | quote }} - - name: P_AUDIT_USERNAME - value: {{ .Values.parseable.auditLogging.p_username | quote }} - - name: P_AUDIT_PASSWORD - value: {{ .Values.parseable.auditLogging.p_password | quote }} - {{- end }} - - {{- if and .Values.parseable.s3ModeSecret .Values.parseable.s3ModeSecret.enabled }} - {{- range $secret := .Values.parseable.s3ModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: {{ .Values.parseable.gcsModeSecret.auth.mount_path }}/{{ .Values.parseable.gcsModeSecret.auth.secret_key }} - {{- range $secret := .Values.parseable.gcsModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - {{- if and .Values.parseable.blobModeSecret .Values.parseable.blobModeSecret.enabled }} - {{- range $secret := .Values.parseable.blobModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - - name: P_MODE - value: "ingest" - - {{- if .Values.parseable.kafkaConnector.enabled }} - {{- range $key, $value := .Values.parseable.kafkaConnector.env }} - - name: {{ $key }} - value: {{ tpl $value $ | quote }} - {{- end }} - {{- end }} - - ports: - - containerPort: {{ .Values.parseable.highAvailability.ingestor.port }} - {{- with .Values.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 10 }} - {{- end }} - resources: - {{- toYaml .Values.parseable.highAvailability.ingestor.resources | nindent 10 }} - {{- if or .Values.parseable.persistence.ingestor.enabled (and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled) }} - volumeMounts: - {{- if .Values.parseable.persistence.ingestor.enabled }} - - mountPath: "/parseable/staging" - name: stage-volume - {{- end }} - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - - mountPath: {{ .Values.parseable.gcsModeSecret.auth.mount_path }} - name: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - readOnly: true - {{- end }} - {{- end }} - {{- if .Values.parseable.persistence.ingestor.enabled }} - volumeClaimTemplates: - - metadata: - name: stage-volume - spec: - accessModes: - - {{ .Values.parseable.persistence.ingestor.accessMode | quote }} - storageClassName: {{ .Values.parseable.persistence.ingestor.storageClass | quote }} - resources: - requests: - storage: {{ .Values.parseable.persistence.ingestor.size | quote }} - {{- end }} -{{- end }} diff --git a/helm/templates/ingestor.yaml b/helm/templates/ingestor.yaml new file mode 100644 index 000000000..8cc98bff3 --- /dev/null +++ b/helm/templates/ingestor.yaml @@ -0,0 +1,257 @@ +{{- if eq .Values.parseable.deploymentMode "distributed" }} +{{- $p := .Values.parseable }} +{{- $ent := $p.enterprise }} +{{- $node := $p.distributed.ingestor }} +{{- $store := $p.store }} +{{- $secret := $store.secretName }} +{{- $gcs := eq $store.type "gcs-store" }} +{{- $image := $ent.enabled | ternary (printf "%s:%s" $ent.image.repository ($ent.image.tag | default .Chart.AppVersion)) (printf "%s:%s" $p.image.repository ($p.image.tag | default .Chart.AppVersion)) }} +{{- $pullPolicy := $ent.enabled | ternary $ent.image.pullPolicy $p.image.pullPolicy }} +{{- $pullSecrets := $ent.enabled | ternary $ent.imagePullSecrets $p.imagePullSecrets }} +{{- $binary := $ent.enabled | ternary "parseable-enterprise" "/usr/bin/parseable" }} +{{- $waitFor := $ent.enabled | ternary "prism" "querier" }} +{{- $fullname := include "parseable.fullname" . }} +apiVersion: v1 +kind: Service +metadata: + name: {{ $fullname }}-ingestor-headless + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: ingestor +spec: + clusterIP: None + ports: + - port: 8000 + name: parseable-port + selector: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: ingestor +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $fullname }}-ingestor-service + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: ingestor +spec: + type: {{ $node.service.type }} + ports: + - port: {{ $node.service.port }} + targetPort: 8000 + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: ingestor +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $fullname }}-ingestor + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: ingestor +spec: + serviceName: {{ $fullname }}-ingestor-headless + replicas: {{ $node.replicas }} + minReadySeconds: 2 + selector: + matchLabels: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: ingestor + template: + metadata: + {{- with $node.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- with $node.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: ingestor + spec: + {{- with $pullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "parseable.serviceAccountName" . }} + terminationGracePeriodSeconds: {{ $node.terminationGracePeriodSeconds }} + {{- if not $ent.enabled }} + # OSS runs as non-root; the Enterprise image runs as its default user (root), + # which it needs for its bundled ML (panorama) cache directories. + securityContext: + {{- toYaml $p.podSecurityContext | nindent 8 }} + {{- end }} + {{- with $node.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + # ingestors register against the {{ $waitFor }}, so wait for it to be ready first + initContainers: + - name: wait-for-{{ $waitFor }} + image: curlimages/curl:latest + command: + - /bin/sh + - -c + - | + echo "Waiting for {{ $waitFor }} at /api/v1/readiness..." + for i in $(seq 1 60); do + if curl -sf http://{{ $fullname }}-{{ $waitFor }}-service.{{ .Release.Namespace }}/api/v1/readiness; then + echo "{{ $waitFor }} is ready!"; exit 0 + fi + echo "Not ready yet, retrying in 2s..."; sleep 2 + done + echo "{{ $waitFor }} did not become ready in time."; exit 1 + volumes: + {{- if not $node.persistence.staging.enabled }} + - name: stage-volume + emptyDir: {} + {{- end }} + {{- if $gcs }} + - name: gcs-credentials + secret: + secretName: {{ $store.gcsCredentials.secretName }} + {{- end }} + {{- if $ent.enabled }} + - name: license + secret: + secretName: {{ $ent.license.secretName }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml $p.securityContext | nindent 12 }} + image: "{{ $image }}" + imagePullPolicy: {{ $pullPolicy }} + args: [ {{ $binary | quote }}, {{ $store.type | quote }} ] + env: + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: P_MODE + value: "ingest" + - name: P_STAGING_DIR + value: "/parseable/staging" + - name: P_INGESTOR_ENDPOINT + value: "$(HOSTNAME).{{ $fullname }}-ingestor-headless.{{ .Release.Namespace }}.svc.cluster.local:8000" + {{- if $p.clusterSecret.enabled }} + - name: P_CLUSTER_SECRET + valueFrom: + secretKeyRef: + name: {{ $p.clusterSecret.secretName }} + key: {{ $p.clusterSecret.secretKey }} + {{- end }} + {{- range $key, $value := $node.env }} + - name: {{ $key }} + value: {{ tpl (toString $value) $ | quote }} + {{- end }} + # object store credentials + admin user from the store secret + - name: P_ADDR + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: addr } } + - name: P_USERNAME + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: username } } + - name: P_PASSWORD + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: password } } + {{- if eq $store.type "s3-store" }} + - name: P_S3_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.url } } + - name: P_S3_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.access.key } } + - name: P_S3_SECRET_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.secret.key } } + - name: P_S3_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.bucket } } + - name: P_S3_REGION + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.region } } + {{- else if eq $store.type "blob-store" }} + - name: P_AZR_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.access_key } } + - name: P_AZR_ACCOUNT + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.account } } + - name: P_AZR_CONTAINER + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.container } } + - name: P_AZR_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.url } } + {{- else if eq $store.type "gcs-store" }} + - name: P_GCS_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.url } } + - name: P_GCS_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.bucket } } + - name: GOOGLE_APPLICATION_CREDENTIALS + value: "{{ $store.gcsCredentials.mountPath }}/{{ $store.gcsCredentials.secretKey }}" + {{- end }} + {{- if $ent.enabled }} + - name: P_LICENSE_DATA_FILE_PATH + value: "{{ $ent.license.mountPath }}/{{ $ent.license.dataKey }}" + - name: P_LICENSE_SIGNATURE_FILE_PATH + value: "{{ $ent.license.mountPath }}/{{ $ent.license.signatureKey }}" + {{- if $ent.auditLogging.enabled }} + - name: P_AUDIT_LOGGER + value: {{ $ent.auditLogging.server | quote }} + - name: P_AUDIT_USERNAME + value: {{ $ent.auditLogging.username | quote }} + {{- if $ent.auditLogging.existingSecret.name }} + - name: P_AUDIT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ $ent.auditLogging.existingSecret.name }} + key: {{ $ent.auditLogging.existingSecret.key }} + {{- else }} + - name: P_AUDIT_PASSWORD + value: {{ $ent.auditLogging.password | quote }} + {{- end }} + {{- end }} + {{- end }} + ports: + - containerPort: 8000 + {{- with $node.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml $node.resources | nindent 12 }} + volumeMounts: + - name: stage-volume + mountPath: "/parseable/staging" + {{- if $gcs }} + - name: gcs-credentials + mountPath: {{ $store.gcsCredentials.mountPath }} + readOnly: true + {{- end }} + {{- if $ent.enabled }} + - name: license + mountPath: {{ $ent.license.mountPath }} + readOnly: true + {{- end }} + {{- if $node.persistence.staging.enabled }} + volumeClaimTemplates: + - metadata: + name: stage-volume + spec: + accessModes: + - {{ $node.persistence.staging.accessMode | quote }} + storageClassName: {{ $node.persistence.staging.storageClass | quote }} + resources: + requests: + storage: {{ $node.persistence.staging.size | quote }} + {{- end }} +{{- end }} diff --git a/helm/templates/logstream-configmap.yaml b/helm/templates/logstream-configmap.yaml deleted file mode 100644 index c3cda479b..000000000 --- a/helm/templates/logstream-configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if not (empty .Values.parseable.logstream) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "parseable.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "parseable.labels" . | nindent 4 }} -data: - config-logstream: |- - {{- include (print $.Template.BasePath "/_helpers_config_logstream.txt") . | nindent 4 }} -{{- end }} diff --git a/helm/templates/logstream-job.yaml b/helm/templates/logstream-job.yaml deleted file mode 100644 index 5f77aeedd..000000000 --- a/helm/templates/logstream-job.yaml +++ /dev/null @@ -1,65 +0,0 @@ -{{- if not (empty .Values.parseable.logstream) }} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ include "parseable.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "parseable.labels" . | nindent 4 }} -spec: - template: - metadata: - {{- with .Values.parseable.podAnnotations }} - annotations: - "helm.sh/hook": post-install,post-upgrade - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "parseable.labelsSelector" . | nindent 8 }} - spec: - restartPolicy: OnFailure - securityContext: - {{- toYaml .Values.parseable.podSecurityContext | nindent 8 }} - volumes: - - name: parseable-init - projected: - sources: - - configMap: - name: {{ include "parseable.fullname" . }} - containers: - - name: config-logstream - volumeMounts: - - name: parseable-init - mountPath: /config - securityContext: - {{- toYaml .Values.parseable.securityContext | nindent 12 }} - env: - {{- if .Values.parseable.local }} - {{- range $secret := .Values.parseable.localModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- else}} - {{- range $secret := .Values.parseable.s3ModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - image: curlimages/curl:8.00.0 - command: [ "/bin/sh", "/config/config-logstream" ] - backoffLimit: 20 -{{- end}} diff --git a/helm/templates/prism.yaml b/helm/templates/prism.yaml new file mode 100644 index 000000000..4c9bde759 --- /dev/null +++ b/helm/templates/prism.yaml @@ -0,0 +1,225 @@ +{{- if and (eq .Values.parseable.deploymentMode "distributed") .Values.parseable.enterprise.enabled }} +{{- $p := .Values.parseable }} +{{- $ent := $p.enterprise }} +{{- $node := $p.distributed.prism }} +{{- $store := $p.store }} +{{- $secret := $store.secretName }} +{{- $gcs := eq $store.type "gcs-store" }} +{{- $image := printf "%s:%s" $ent.image.repository ($ent.image.tag | default .Chart.AppVersion) }} +{{- $fullname := include "parseable.fullname" . }} +apiVersion: v1 +kind: Service +metadata: + name: {{ $fullname }}-prism-headless + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: prism +spec: + clusterIP: None + ports: + - port: 8000 + name: parseable-port + selector: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: prism +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $fullname }}-prism-service + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: prism +spec: + type: {{ $node.service.type }} + ports: + - port: {{ $node.service.port }} + targetPort: 8000 + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: prism +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $fullname }}-prism + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: prism +spec: + serviceName: {{ $fullname }}-prism-headless + replicas: {{ $node.replicas }} + minReadySeconds: 2 + selector: + matchLabels: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: prism + template: + metadata: + {{- with $node.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- with $node.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: prism + spec: + {{- with $ent.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "parseable.serviceAccountName" . }} + terminationGracePeriodSeconds: {{ $node.terminationGracePeriodSeconds }} + # prism runs the Enterprise image as its default user (root), which it needs + # for its bundled ML (panorama) cache directories. + {{- with $node.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + {{- if not $node.persistence.enabled }} + - name: stage-volume + emptyDir: {} + {{- end }} + {{- if $gcs }} + - name: gcs-credentials + secret: + secretName: {{ $store.gcsCredentials.secretName }} + {{- end }} + - name: license + secret: + secretName: {{ $ent.license.secretName }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml $p.securityContext | nindent 12 }} + image: "{{ $image }}" + imagePullPolicy: {{ $ent.image.pullPolicy }} + args: [ "parseable-enterprise", {{ $store.type | quote }} ] + env: + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: P_MODE + value: "prism" + - name: P_STAGING_DIR + value: "/parseable/staging" + {{- if $p.clusterSecret.enabled }} + - name: P_CLUSTER_SECRET + valueFrom: + secretKeyRef: + name: {{ $p.clusterSecret.secretName }} + key: {{ $p.clusterSecret.secretKey }} + {{- end }} + {{- range $key, $value := $node.env }} + - name: {{ $key }} + value: {{ tpl (toString $value) $ | quote }} + {{- end }} + # object store credentials + admin user from the store secret + - name: P_ADDR + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: addr } } + - name: P_USERNAME + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: username } } + - name: P_PASSWORD + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: password } } + {{- if eq $store.type "s3-store" }} + - name: P_S3_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.url } } + - name: P_S3_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.access.key } } + - name: P_S3_SECRET_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.secret.key } } + - name: P_S3_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.bucket } } + - name: P_S3_REGION + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.region } } + {{- else if eq $store.type "blob-store" }} + - name: P_AZR_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.access_key } } + - name: P_AZR_ACCOUNT + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.account } } + - name: P_AZR_CONTAINER + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.container } } + - name: P_AZR_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.url } } + {{- else if eq $store.type "gcs-store" }} + - name: P_GCS_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.url } } + - name: P_GCS_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.bucket } } + - name: GOOGLE_APPLICATION_CREDENTIALS + value: "{{ $store.gcsCredentials.mountPath }}/{{ $store.gcsCredentials.secretKey }}" + {{- end }} + - name: P_LICENSE_DATA_FILE_PATH + value: "{{ $ent.license.mountPath }}/{{ $ent.license.dataKey }}" + - name: P_LICENSE_SIGNATURE_FILE_PATH + value: "{{ $ent.license.mountPath }}/{{ $ent.license.signatureKey }}" + {{- if $ent.auditLogging.enabled }} + - name: P_AUDIT_LOGGER + value: {{ $ent.auditLogging.server | quote }} + - name: P_AUDIT_USERNAME + value: {{ $ent.auditLogging.username | quote }} + {{- if $ent.auditLogging.existingSecret.name }} + - name: P_AUDIT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ $ent.auditLogging.existingSecret.name }} + key: {{ $ent.auditLogging.existingSecret.key }} + {{- else }} + - name: P_AUDIT_PASSWORD + value: {{ $ent.auditLogging.password | quote }} + {{- end }} + {{- end }} + ports: + - containerPort: 8000 + {{- with $node.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml $node.resources | nindent 12 }} + volumeMounts: + - name: stage-volume + mountPath: "/parseable/staging" + {{- if $gcs }} + - name: gcs-credentials + mountPath: {{ $store.gcsCredentials.mountPath }} + readOnly: true + {{- end }} + - name: license + mountPath: {{ $ent.license.mountPath }} + readOnly: true + {{- if $node.persistence.enabled }} + volumeClaimTemplates: + - metadata: + name: stage-volume + spec: + accessModes: + - {{ $node.persistence.accessMode | quote }} + storageClassName: {{ $node.persistence.storageClass | quote }} + resources: + requests: + storage: {{ $node.persistence.size | quote }} + {{- end }} +{{- end }} diff --git a/helm/templates/querier-service.yaml b/helm/templates/querier-service.yaml deleted file mode 100644 index 4f06760d0..000000000 --- a/helm/templates/querier-service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if eq .Values.parseable.highAvailability.enabled true }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "parseable.fullname" . }}-querier-service - namespace: {{ .Release.Namespace }} - labels: - {{- include "parseable.labelsSelector" . | nindent 4 }} -spec: - type: {{ $.Values.parseable.service.type }} - ports: - - port: {{ $.Values.parseable.service.port }} - targetPort: 8000 - protocol: TCP - selector: - {{- include "parseable.querierLabelsSelector" . | nindent 4 }} -{{- end }} diff --git a/helm/templates/querier-statefulset.yaml b/helm/templates/querier-statefulset.yaml deleted file mode 100644 index de1f28298..000000000 --- a/helm/templates/querier-statefulset.yaml +++ /dev/null @@ -1,212 +0,0 @@ -{{- if .Values.parseable.highAvailability.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "parseable.fullname" . }}-querier-headless - namespace: {{ .Release.Namespace }} -spec: - ports: - - port: 8000 - name: "parseable-port" - clusterIP: None - selector: - {{- include "parseable.querierLabelsSelector" . | nindent 4 }} ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "parseable.fullname" . }}-querier - namespace: {{ .Release.Namespace }} - labels: - {{- include "parseable.querierLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - {{- include "parseable.querierLabelsSelector" . | nindent 6 }} - serviceName: {{ include "parseable.fullname" . }}-querier-headless - ## TODO: this will change as we scale queriers - replicas: 1 - minReadySeconds: 2 - template: - metadata: - {{- with .Values.parseable.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- .Values.parseable.podLabels | toYaml | nindent 8 }} - {{- include "parseable.querierLabelsSelector" . | nindent 8 }} - spec: - terminationGracePeriodSeconds: 10 - serviceAccountName: {{ include "parseable.serviceAccountName" . }} - {{- with .Values.parseable.toleration }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.parseable.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - volumes: - - name: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - secret: - secretName: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - - name: stage-volume - emptyDir: {} - {{- else }} - volumes: - - name: stage-volume - emptyDir: {} - {{- end }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.parseable.securityContext | nindent 10 }} - image: {{ .Values.parseable.image.repository }}:{{ .Values.parseable.image.tag | default .Chart.AppVersion }} - imagePullPolicy: {{ .Values.parseable.image.pullPolicy }} - args: - - "/usr/bin/parseable" - - {{ .Values.parseable.store | quote }} - env: - - name: HOSTNAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: metadata.name - - name: P_MODE - value: "query" - {{- if .Values.parseable.persistence.querier.enabled }} - - name: P_HOT_TIER_DIR - value: "/parseable/hot-tier" - - name: P_MAX_DISK_USAGE_PERCENT - value: "95.0" - {{- end }} - {{- range $key, $value := .Values.parseable.env }} - - name: {{ $key }} - value: {{ tpl $value $ | quote }} - {{- end }} - - {{- if .Values.parseable.auditLogging.enabled }} - - name: P_AUDIT_LOGGER - value: {{ .Values.parseable.auditLogging.p_server | quote }} - - name: P_AUDIT_USERNAME - value: {{ .Values.parseable.auditLogging.p_username | quote }} - - name: P_AUDIT_PASSWORD - value: {{ .Values.parseable.auditLogging.p_password | quote }} - {{- end }} - - {{- if and .Values.parseable.s3ModeSecret .Values.parseable.s3ModeSecret.enabled }} - {{- range $secret := .Values.parseable.s3ModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: {{ .Values.parseable.gcsModeSecret.auth.mount_path }}/{{ .Values.parseable.gcsModeSecret.auth.secret_key }} - {{- range $secret := .Values.parseable.gcsModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - {{- if and .Values.parseable.blobModeSecret .Values.parseable.blobModeSecret.enabled }} - {{- range $secret := .Values.parseable.blobModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - ports: - - containerPort: 8000 - {{- with .Values.parseable.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 10 }} - {{- end }} - resources: - {{- toYaml .Values.parseable.resources | nindent 10 }} - volumeMounts: - - mountPath: "/parseable/staging" - name: stage-volume - {{- if .Values.parseable.persistence.querier.enabled }} - - mountPath: "/parseable/hot-tier" - name: hot-tier-volume - {{- end }} - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - - mountPath: {{ .Values.parseable.gcsModeSecret.auth.mount_path }} - name: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - readOnly: true - {{- end }} - {{- if .Values.parseable.sidecar.enabled }} - - name: {{ .Chart.Name }}-sidecar - securityContext: - {{- toYaml .Values.parseable.securityContext | nindent 10 }} - image: {{ .Values.parseable.sidecar.image.repository }}:{{ .Values.parseable.sidecar.image.tag }} - imagePullPolicy: {{ .Values.parseable.sidecar.image.pullPolicy }} - command: {{ .Values.parseable.sidecar.command }} - args: {{ .Values.parseable.sidecar.args }} - env: - {{- range $key, $value := .Values.parseable.sidecar.env }} - - name: {{ $key }} - value: {{ tpl $value $ | quote }} - {{- end }} - ports: - - containerPort: {{ .Values.parseable.sidecar.ports }} - resources: - {{- toYaml .Values.parseable.sidecar.resources | nindent 10 }} - volumeMounts: - {{- .Values.parseable.sidecar.volumeMounts | toYaml | nindent 10 }} - {{- end }} - {{- if .Values.parseable.persistence.querier.enabled }} - volumeClaimTemplates: - - metadata: - name: hot-tier-volume - spec: - accessModes: - - {{ .Values.parseable.persistence.querier.accessMode | quote }} - storageClassName: {{ .Values.parseable.persistence.querier.storageClass | quote }} - resources: - requests: - storage: {{ .Values.parseable.persistence.querier.size | quote }} - - metadata: - name: stage-volume - spec: - accessModes: - - {{ .Values.parseable.persistence.querier.accessMode | quote }} - storageClassName: {{ .Values.parseable.persistence.querier.storageClass | quote }} - resources: - requests: - storage: 5Gi - {{- if .Values.parseable.sidecar.enabled }} - {{- .Values.parseable.sidecar.volumeClaimTemplates | toYaml | nindent 2 }} - {{- end }} - {{- else }} - {{- if .Values.parseable.sidecar.enabled }} - volumeClaimTemplates: - {{- .Values.parseable.sidecar.volumeClaimTemplates | toYaml | nindent 2 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/templates/querier.yaml b/helm/templates/querier.yaml new file mode 100644 index 000000000..b25370321 --- /dev/null +++ b/helm/templates/querier.yaml @@ -0,0 +1,267 @@ +{{- if eq .Values.parseable.deploymentMode "distributed" }} +{{- $p := .Values.parseable }} +{{- $ent := $p.enterprise }} +{{- $node := $p.distributed.querier }} +{{- $store := $p.store }} +{{- $secret := $store.secretName }} +{{- $gcs := eq $store.type "gcs-store" }} +{{- $hotTier := $node.persistence.hotTier }} +{{- $image := $ent.enabled | ternary (printf "%s:%s" $ent.image.repository ($ent.image.tag | default .Chart.AppVersion)) (printf "%s:%s" $p.image.repository ($p.image.tag | default .Chart.AppVersion)) }} +{{- $pullPolicy := $ent.enabled | ternary $ent.image.pullPolicy $p.image.pullPolicy }} +{{- $pullSecrets := $ent.enabled | ternary $ent.imagePullSecrets $p.imagePullSecrets }} +{{- $binary := $ent.enabled | ternary "parseable-enterprise" "/usr/bin/parseable" }} +{{- $fullname := include "parseable.fullname" . }} +apiVersion: v1 +kind: Service +metadata: + name: {{ $fullname }}-querier-headless + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: querier +spec: + clusterIP: None + ports: + - port: 8000 + name: parseable-port + selector: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: querier +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $fullname }}-querier-service + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: querier +spec: + type: {{ $node.service.type }} + ports: + - port: {{ $node.service.port }} + targetPort: 8000 + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: querier +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $fullname }}-querier + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: querier +spec: + serviceName: {{ $fullname }}-querier-headless + replicas: {{ $node.replicas }} + minReadySeconds: 2 + selector: + matchLabels: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: querier + template: + metadata: + {{- with $node.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- with $node.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: querier + spec: + {{- with $pullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "parseable.serviceAccountName" . }} + terminationGracePeriodSeconds: {{ $node.terminationGracePeriodSeconds }} + {{- if not $ent.enabled }} + # OSS runs as non-root; the Enterprise image runs as its default user (root), + # which it needs for its bundled ML (panorama) cache directories. + securityContext: + {{- toYaml $p.podSecurityContext | nindent 8 }} + {{- end }} + {{- with $node.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if $ent.enabled }} + # Enterprise: the querier registers with prism, so wait for it first + initContainers: + - name: wait-for-prism + image: curlimages/curl:latest + command: + - /bin/sh + - -c + - | + echo "Waiting for prism at /api/v1/readiness..." + for i in $(seq 1 60); do + if curl -sf http://{{ $fullname }}-prism-service.{{ .Release.Namespace }}/api/v1/readiness; then + echo "Prism is ready!"; exit 0 + fi + echo "Not ready yet, retrying in 2s..."; sleep 2 + done + echo "Prism did not become ready in time."; exit 1 + {{- end }} + volumes: + - name: stage-volume + emptyDir: {} + {{- if not $hotTier.enabled }} + - name: hot-tier-volume + emptyDir: {} + {{- end }} + {{- if $gcs }} + - name: gcs-credentials + secret: + secretName: {{ $store.gcsCredentials.secretName }} + {{- end }} + {{- if $ent.enabled }} + - name: license + secret: + secretName: {{ $ent.license.secretName }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml $p.securityContext | nindent 12 }} + image: "{{ $image }}" + imagePullPolicy: {{ $pullPolicy }} + args: [ {{ $binary | quote }}, {{ $store.type | quote }} ] + env: + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: P_MODE + value: "query" + - name: P_STAGING_DIR + value: "/parseable/staging" + - name: P_HOT_TIER_DIR + value: "/parseable/hot-tier" + - name: P_MAX_DISK_USAGE_PERCENT + value: "95.0" + - name: P_QUERIER_ENDPOINT + value: "$(HOSTNAME).{{ $fullname }}-querier-headless.{{ .Release.Namespace }}.svc.cluster.local:8000" + {{- if $p.clusterSecret.enabled }} + - name: P_CLUSTER_SECRET + valueFrom: + secretKeyRef: + name: {{ $p.clusterSecret.secretName }} + key: {{ $p.clusterSecret.secretKey }} + {{- end }} + {{- range $key, $value := $node.env }} + - name: {{ $key }} + value: {{ tpl (toString $value) $ | quote }} + {{- end }} + # object store credentials + admin user from the store secret + - name: P_ADDR + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: addr } } + - name: P_USERNAME + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: username } } + - name: P_PASSWORD + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: password } } + {{- if eq $store.type "s3-store" }} + - name: P_S3_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.url } } + - name: P_S3_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.access.key } } + - name: P_S3_SECRET_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.secret.key } } + - name: P_S3_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.bucket } } + - name: P_S3_REGION + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.region } } + {{- else if eq $store.type "blob-store" }} + - name: P_AZR_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.access_key } } + - name: P_AZR_ACCOUNT + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.account } } + - name: P_AZR_CONTAINER + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.container } } + - name: P_AZR_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.url } } + {{- else if eq $store.type "gcs-store" }} + - name: P_GCS_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.url } } + - name: P_GCS_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.bucket } } + - name: GOOGLE_APPLICATION_CREDENTIALS + value: "{{ $store.gcsCredentials.mountPath }}/{{ $store.gcsCredentials.secretKey }}" + {{- end }} + {{- if $ent.enabled }} + - name: P_LICENSE_DATA_FILE_PATH + value: "{{ $ent.license.mountPath }}/{{ $ent.license.dataKey }}" + - name: P_LICENSE_SIGNATURE_FILE_PATH + value: "{{ $ent.license.mountPath }}/{{ $ent.license.signatureKey }}" + {{- if $ent.auditLogging.enabled }} + - name: P_AUDIT_LOGGER + value: {{ $ent.auditLogging.server | quote }} + - name: P_AUDIT_USERNAME + value: {{ $ent.auditLogging.username | quote }} + {{- if $ent.auditLogging.existingSecret.name }} + - name: P_AUDIT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ $ent.auditLogging.existingSecret.name }} + key: {{ $ent.auditLogging.existingSecret.key }} + {{- else }} + - name: P_AUDIT_PASSWORD + value: {{ $ent.auditLogging.password | quote }} + {{- end }} + {{- end }} + {{- end }} + ports: + - containerPort: 8000 + {{- with $node.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml $node.resources | nindent 12 }} + volumeMounts: + - name: stage-volume + mountPath: "/parseable/staging" + - name: hot-tier-volume + mountPath: "/parseable/hot-tier" + {{- if $gcs }} + - name: gcs-credentials + mountPath: {{ $store.gcsCredentials.mountPath }} + readOnly: true + {{- end }} + {{- if $ent.enabled }} + - name: license + mountPath: {{ $ent.license.mountPath }} + readOnly: true + {{- end }} + {{- if $hotTier.enabled }} + volumeClaimTemplates: + - metadata: + name: hot-tier-volume + spec: + accessModes: + - {{ $hotTier.accessMode | quote }} + storageClassName: {{ $hotTier.storageClass | quote }} + resources: + requests: + storage: {{ $hotTier.size | quote }} + {{- end }} +{{- end }} diff --git a/helm/templates/service-monitor.yaml b/helm/templates/service-monitor.yaml deleted file mode 100644 index 0750ab4ec..000000000 --- a/helm/templates/service-monitor.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- if .Values.parseable.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "parseable.fullname" . }} - namespace: {{ default .Release.Namespace .Values.parseable.metrics.serviceMonitor.namespace | quote }} - labels: - {{- with .Values.parseable.metrics.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- include "parseable.labels" . | nindent 4 }} -spec: - {{ if .Values.parseable.metrics.serviceMonitor.spec.jobLabel }} - jobLabel: {{ .Values.parseable.metrics.serviceMonitor.spec.jobLabel | quote }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.targetLabels }} - targetLabels: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.targetLabels | nindent 4 }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.podTargetLabels }} - podTargetLabels: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.podTargetLabels | nindent 4 }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.endpoints }} - endpoints: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.endpoints | nindent 4 }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.selector }} - selector: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.selector | nindent 4 }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.namespaceSelector }} - namespaceSelector: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.namespaceSelector | nindent 4 }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.sampleLimit }} - sampleLimit: {{ .Values.parseable.metrics.serviceMonitor.spec.sampleLimit }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.scrapeProtocols }} - scrapeProtocols: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.scrapeProtocols | nindent 4 }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.targetLimit }} - targetLimit: {{ .Values.parseable.metrics.serviceMonitor.spec.targetLimit }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.labelLimit }} - labelLimit: {{ .Values.parseable.metrics.serviceMonitor.spec.labelLimit }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.labelNameLengthLimit }} - labelNameLengthLimit: {{ .Values.parseable.metrics.serviceMonitor.spec.labelNameLengthLimit }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.labelValueLengthLimit }} - labelValueLengthLimit: {{ .Values.parseable.metrics.serviceMonitor.spec.labelValueLengthLimit }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.keepDroppedTargets }} - keepDroppedTargets: {{ .Values.parseable.metrics.serviceMonitor.spec.keepDroppedTargets }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.attachMetadata }} - attachMetadata: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.attachMetadata | nindent 4 }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.scrapeClass }} - scrapeClass: {{ .Values.parseable.metrics.serviceMonitor.spec.scrapeClass | quote }} - {{- end }} - {{ if .Values.parseable.metrics.serviceMonitor.spec.bodySizeLimit }} - bodySizeLimit: - {{- toYaml .Values.parseable.metrics.serviceMonitor.spec.bodySizeLimit | nindent 4 }} - {{- end }} -{{- end }} diff --git a/helm/templates/serviceaccount.yaml b/helm/templates/serviceaccount.yaml index 608e6a4cf..4e3c767aa 100644 --- a/helm/templates/serviceaccount.yaml +++ b/helm/templates/serviceaccount.yaml @@ -1,11 +1,12 @@ -{{- if $.Values.parseable.serviceAccount.create -}} +{{- if .Values.parseable.serviceAccount.create -}} apiVersion: v1 kind: ServiceAccount metadata: name: {{ include "parseable.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} labels: {{- include "parseable.labels" . | nindent 4 }} - {{- with $.Values.parseable.serviceAccount.annotations }} + {{- with .Values.parseable.serviceAccount.annotations }} annotations: {{- toYaml . | nindent 4 }} {{- end }} diff --git a/helm/templates/servicemonitor.yaml b/helm/templates/servicemonitor.yaml new file mode 100644 index 000000000..e31d4c3a2 --- /dev/null +++ b/helm/templates/servicemonitor.yaml @@ -0,0 +1,38 @@ +{{- if .Values.parseable.metrics.serviceMonitor.enabled }} +{{- $p := .Values.parseable }} +{{- $sm := $p.metrics.serviceMonitor }} +{{- $fullname := include "parseable.fullname" . }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ $fullname }} + namespace: {{ default .Release.Namespace $sm.namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + {{- with $sm.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + endpoints: + - port: {{ $sm.port }} + path: {{ $sm.path }} + interval: {{ $sm.interval }} + {{- with $sm.scrapeTimeout }} + scrapeTimeout: {{ . }} + {{- end }} + {{- with $sm.relabelings }} + relabelings: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $sm.metricRelabelings }} + metricRelabelings: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} diff --git a/helm/templates/stage-pvc.yaml b/helm/templates/stage-pvc.yaml deleted file mode 100644 index 7940af5a4..000000000 --- a/helm/templates/stage-pvc.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.parseable.persistence.staging.enabled }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "parseable.fullname" . }}-staging-pvc - labels: - {{- include "parseable.labels" . | nindent 4 }} -spec: - accessModes: - - {{ .Values.parseable.persistence.staging.accessMode | quote }} - resources: - requests: - storage: {{ .Values.parseable.persistence.staging.size | quote }} - {{- if .Values.parseable.persistence.staging.storageClass }} - storageClassName: "{{ .Values.parseable.persistence.staging.storageClass }}" - {{- else }} - storageClassName: "" - {{- end }} -{{- end }} diff --git a/helm/templates/standalone-deployment.yaml b/helm/templates/standalone-deployment.yaml deleted file mode 100644 index e009094c1..000000000 --- a/helm/templates/standalone-deployment.yaml +++ /dev/null @@ -1,176 +0,0 @@ -{{- if eq .Values.parseable.highAvailability.enabled false }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "parseable.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "parseable.labels" . | nindent 4 }} -spec: - replicas: 1 - selector: - matchLabels: - {{- include "parseable.labelsSelector" . | nindent 6 }} - template: - metadata: - {{- with .Values.parseable.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- .Values.parseable.podLabels | toYaml | nindent 8 }} - {{- include "parseable.labelsSelector" . | nindent 8 }} - spec: - {{- with .Values.parseable.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "parseable.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.parseable.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.parseable.securityContext | nindent 12 }} - image: "{{ .Values.parseable.image.repository }}:{{ .Values.parseable.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.parseable.image.pullPolicy }} - # Uncomment to debug - # command: [ "/bin/sh", "-c", "sleep 1000000" ] - args: [ "/usr/bin/parseable", {{ .Values.parseable.store | quote }}] - env: - - name: HOSTNAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: metadata.name - {{- range $key, $value := .Values.parseable.env }} - - name: {{ $key }} - value: {{ tpl $value $ | quote }} - {{- end }} - {{- if and .Values.parseable.localModeSecret .Values.parseable.localModeSecret.enabled }} - {{- range $secret := .Values.parseable.localModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - {{- if .Values.parseable.auditLogging.enabled }} - - name: P_AUDIT_LOGGER - value: {{ .Values.parseable.auditLogging.p_server | quote }} - - name: P_AUDIT_USERNAME - value: {{ .Values.parseable.auditLogging.p_username | quote }} - - name: P_AUDIT_PASSWORD - value: {{ .Values.parseable.auditLogging.p_password | quote }} - {{- end }} - - {{- if .Values.parseable.kafkaConnector.enabled }} - {{- range $key, $value := .Values.parseable.kafkaConnector.env }} - - name: {{ $key }} - value: {{ tpl $value $ | quote }} - {{- end }} - {{- end }} - - {{- if and .Values.parseable.s3ModeSecret .Values.parseable.s3ModeSecret.enabled }} - {{- range $secret := .Values.parseable.s3ModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: {{ .Values.parseable.gcsModeSecret.auth.mount_path }} - {{- range $secret := .Values.parseable.gcsModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - {{- if and .Values.parseable.blobModeSecret .Values.parseable.blobModeSecret.enabled }} - {{- range $secret := .Values.parseable.blobModeSecret.secrets }} - {{- range $key := $secret.keys }} - {{- $envPrefix := $secret.prefix | default "" | upper }} - {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} - - name: {{ $envPrefix }}{{ $envKey }} - valueFrom: - secretKeyRef: - name: {{ $secret.name }} - key: {{ $key }} - {{- end }} - {{- end }} - {{- end }} - - ports: - - containerPort: 8000 - {{- with .Values.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.parseable.resources | nindent 12 }} - volumeMounts: - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - - mountPath: {{ .Values.parseable.gcsModeSecret.auth.mount_path }} - name: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - readOnly: true - {{- end }} - - mountPath: "/parseable/data" - name: data-volume - - mountPath: "/parseable/staging" - name: stage-volume - volumes: - {{- if and .Values.parseable.gcsModeSecret .Values.parseable.gcsModeSecret.enabled }} - - name: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - secret: - secretName: {{ .Values.parseable.gcsModeSecret.auth.secret_name }} - {{- end }} - {{- if .Values.parseable.persistence.staging.enabled }} - - name: stage-volume - persistentVolumeClaim: - claimName: {{ include "parseable.fullname" . }}-staging-pvc - {{- else }} - - name: stage-volume - emptyDir: {} - {{- end }} - {{- if .Values.parseable.persistence.data.enabled }} - - name: data-volume - persistentVolumeClaim: - claimName: {{ include "parseable.fullname" . }}-data-pvc - {{- else }} - - name: data-volume - emptyDir: {} - {{- end }} - {{- with .Values.parseable.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.parseable.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.parseable.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} -{{- end }} diff --git a/helm/templates/standalone-service.yaml b/helm/templates/standalone-service.yaml deleted file mode 100644 index 08ed2943d..000000000 --- a/helm/templates/standalone-service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if eq .Values.parseable.highAvailability.enabled false }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "parseable.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "parseable.labelsSelector" . | nindent 4 }} -spec: - type: {{ $.Values.parseable.service.type }} - ports: - - port: {{ $.Values.parseable.service.port }} - targetPort: 8000 - protocol: TCP - selector: - {{- include "parseable.labelsSelector" . | nindent 4 }} -{{- end }} diff --git a/helm/templates/standalone.yaml b/helm/templates/standalone.yaml new file mode 100644 index 000000000..051447626 --- /dev/null +++ b/helm/templates/standalone.yaml @@ -0,0 +1,212 @@ +{{- if eq .Values.parseable.deploymentMode "standalone" }} +{{- if .Values.parseable.enterprise.enabled }} +{{- fail "enterprise.enabled requires deploymentMode: distributed (standalone runs P_MODE=all, which Enterprise does not support)" }} +{{- end }} +{{- $p := .Values.parseable }} +{{- $node := $p.standalone.unified }} +{{- $store := $p.store }} +{{- $secret := $store.secretName }} +{{- $gcs := and (eq $store.type "gcs-store") $store.gcsCredentials }} +{{- $image := printf "%s:%s" $p.image.repository ($p.image.tag | default .Chart.AppVersion) }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "parseable.fullname" . }}-standalone + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} + app.parseable.com/type: standalone +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: standalone + template: + metadata: + {{- with $node.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- with $node.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: standalone + spec: + {{- with $p.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "parseable.serviceAccountName" . }} + terminationGracePeriodSeconds: {{ $node.terminationGracePeriodSeconds }} + securityContext: + {{- toYaml $p.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml $p.securityContext | nindent 12 }} + image: "{{ $image }}" + imagePullPolicy: {{ $p.image.pullPolicy }} + args: [ "/usr/bin/parseable", {{ $store.type | quote }} ] + env: + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: P_MODE + value: "all" + - name: P_STAGING_DIR + value: "/parseable/staging" + {{- if eq $store.type "local-store" }} + - name: P_FS_DIR + value: "/parseable/data" + {{- end }} + {{- range $key, $value := $node.env }} + - name: {{ $key }} + value: {{ tpl (toString $value) $ | quote }} + {{- end }} + # object store credentials + admin user from the store secret + - name: P_ADDR + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: addr } } + - name: P_USERNAME + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: username } } + - name: P_PASSWORD + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: password } } + {{- if eq $store.type "s3-store" }} + - name: P_S3_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.url } } + - name: P_S3_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.access.key } } + - name: P_S3_SECRET_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.secret.key } } + - name: P_S3_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.bucket } } + - name: P_S3_REGION + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: s3.region } } + {{- else if eq $store.type "blob-store" }} + - name: P_AZR_ACCESS_KEY + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.access_key } } + - name: P_AZR_ACCOUNT + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.account } } + - name: P_AZR_CONTAINER + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.container } } + - name: P_AZR_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: azr.url } } + {{- else if eq $store.type "gcs-store" }} + - name: P_GCS_URL + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.url } } + - name: P_GCS_BUCKET + valueFrom: { secretKeyRef: { name: {{ $secret }}, key: gcs.bucket } } + - name: GOOGLE_APPLICATION_CREDENTIALS + value: "{{ $store.gcsCredentials.mountPath }}/{{ $store.gcsCredentials.secretKey }}" + {{- end }} + ports: + - containerPort: 8000 + {{- with $node.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml $node.resources | nindent 12 }} + volumeMounts: + - name: stage-volume + mountPath: "/parseable/staging" + - name: data-volume + mountPath: "/parseable/data" + {{- if $gcs }} + - name: gcs-credentials + mountPath: {{ $store.gcsCredentials.mountPath }} + readOnly: true + {{- end }} + volumes: + {{- if $node.persistence.staging.enabled }} + - name: stage-volume + persistentVolumeClaim: + claimName: {{ include "parseable.fullname" . }}-standalone-staging + {{- else }} + - name: stage-volume + emptyDir: {} + {{- end }} + {{- if $node.persistence.data.enabled }} + - name: data-volume + persistentVolumeClaim: + claimName: {{ include "parseable.fullname" . }}-standalone-data + {{- else }} + - name: data-volume + emptyDir: {} + {{- end }} + {{- if $gcs }} + - name: gcs-credentials + secret: + secretName: {{ $store.gcsCredentials.secretName }} + {{- end }} + {{- with $node.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $node.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- if $node.persistence.staging.enabled }} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "parseable.fullname" . }}-standalone-staging + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} +spec: + accessModes: + - {{ $node.persistence.staging.accessMode | quote }} + storageClassName: {{ $node.persistence.staging.storageClass | quote }} + resources: + requests: + storage: {{ $node.persistence.staging.size | quote }} +{{- end }} +{{- if $node.persistence.data.enabled }} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "parseable.fullname" . }}-standalone-data + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} +spec: + accessModes: + - {{ $node.persistence.data.accessMode | quote }} + storageClassName: {{ $node.persistence.data.storageClass | quote }} + resources: + requests: + storage: {{ $node.persistence.data.size | quote }} +{{- end }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ include "parseable.fullname" . }}-standalone-service + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} +spec: + type: {{ $node.service.type }} + ports: + - port: {{ $node.service.port }} + targetPort: 8000 + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "parseable.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.parseable.com/type: standalone +{{- end }} diff --git a/helm/values.yaml b/helm/values.yaml index 7448d93a1..a94423250 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -1,44 +1,268 @@ +## Parseable Helm chart +## Single chart for both OSS and Enterprise editions of Parseable. OSS and +## Enterprise ship as separate images (see `image` vs `enterprise.image` +## below); which one gets used is controlled by `enterprise.enabled`, not by +## the node type. +## +## Node types map 1:1 to Parseable's P_MODE values and are grouped by mode: +## standalone.unified -> P_MODE=all (OSS only, single all-in-one pod) +## distributed.ingestor -> P_MODE=ingest (OSS + Enterprise) +## distributed.querier -> P_MODE=query (OSS + Enterprise) +## distributed.prism -> P_MODE=prism (Enterprise only, cluster coordinator) +## +## Each node section is self-contained: its own replicas, env, resources, +## persistence, service and scheduling. There are no shared "common" blocks - +## what you see in a section is everything that applies to that node type. +## +## Docs: https://www.parseable.com/docs/installation/kubernetes-helm + parseable: + nameOverride: "" + fullnameOverride: "" + + ## deploymentMode: standalone | distributed + ## standalone - a single all-in-one pod (the `standalone.unified` section). + ## Simplest way to run Parseable, does not scale horizontally. + ## OSS only. + ## distributed - separate ingestor + querier pods (the `distributed.ingestor` + ## / `distributed.querier` sections), plus `distributed.prism` + ## when `enterprise.enabled` is true. Required for Enterprise. + deploymentMode: standalone + + ## OSS image, used by every node type unless enterprise.enabled is true + ## (see enterprise.image below, which takes over in that case). image: repository: quay.io/parseablehq/parseable - tag: "v2.8.0" - pullPolicy: Always - ## object store can be local-store, s3-store, blob-store or gcs-store. - store: local-store - ## Set to true if you want to deploy Parseable in a HA mode (multiple ingestors + hot tier) - ## Please note that highAvailability is not supported in local mode - highAvailability: - enabled: true - ingestor: - affinity: {} - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchLabels: - # app: parseable - # component: ingestor - # topologyKey: kubernetes.io/hostname - port: 8000 - extraLabels: + tag: "" # defaults to .Chart.AppVersion + pullPolicy: IfNotPresent + ## Names of imagePullSecrets for pulling the image above, e.g. from a private registry. + imagePullSecrets: [] + + ## ----------------------------------------------------------------------- + ## Object store + ## ----------------------------------------------------------------------- + store: + ## One of: local-store, s3-store, blob-store, gcs-store. + ## local-store keeps data on the pod's own volumes and only works with + ## deploymentMode: standalone - it is not valid for distributed deployments. + type: local-store + + ## Name of a pre-existing Kubernetes Secret holding the connection details + ## for the selected store type, plus the Parseable admin credentials. + ## The chart never creates or reads plaintext secrets from values.yaml. + ## + ## Create it with kubectl, using the keys expected for your store type: + ## + ## local-store: + ## kubectl create secret generic parseable-env-secret \ + ## --from-literal=addr=0.0.0.0:8000 \ + ## --from-literal=username=admin \ + ## --from-literal=password=admin + ## + ## s3-store (adds): + ## --from-literal=s3.url= \ + ## --from-literal=s3.access.key= \ + ## --from-literal=s3.secret.key= \ + ## --from-literal=s3.bucket= \ + ## --from-literal=s3.region= + ## + ## blob-store (adds): + ## --from-literal=azr.access_key= \ + ## --from-literal=azr.account= \ + ## --from-literal=azr.container= \ + ## --from-literal=azr.url= + ## + ## gcs-store (adds): + ## --from-literal=gcs.url= \ + ## --from-literal=gcs.bucket= \ + ## and a service-account key file, see `store.gcsCredentials` below. + secretName: parseable-env-secret + + ## Only used when store.type is gcs-store. Points at a Secret containing + ## the GCS service-account JSON key, which is mounted into every pod. + ## kubectl create secret generic parseable-gcs-key \ + ## --from-file=key.json= + gcsCredentials: + secretName: parseable-gcs-key + secretKey: key.json + mountPath: /var/secrets/google + + ## Optional shared secret to authenticate intra-cluster requests between + ## nodes. When enabled, P_CLUSTER_SECRET is injected into every distributed + ## node from this secret; leave disabled to authenticate with admin + ## credentials only. Not used in standalone mode. + ## kubectl create secret generic parseable-cluster-secret \ + ## --from-literal=cluster-secret=<16-char-alphanumeric-string> + clusterSecret: + enabled: false + secretName: parseable-cluster-secret + secretKey: cluster-secret + + ## ----------------------------------------------------------------------- + ## Enterprise edition + ## ----------------------------------------------------------------------- + ## Flip `enabled: true` to run Parseable Enterprise instead of OSS. Requires + ## deploymentMode: distributed. Unlocks the `distributed.prism` node type, + ## plus license validation and audit logging. + enterprise: + enabled: false + + ## Enterprise runs a different image than OSS. Used by every node type + ## instead of the top-level `image` above whenever enabled is true. + image: + repository: quay.io/parseablehq/parseable-enterprise + tag: "" # defaults to .Chart.AppVersion + pullPolicy: IfNotPresent + imagePullSecrets: [] + + ## License is validated at startup; the server refuses to start without one. + ## Mounted read-only at `license.mountPath` on every node; the Enterprise + ## binary reads the license files from that directory. + ## kubectl create secret generic parseable-license \ + ## --from-file=parseable_license.json=resources/parseable_license.json \ + ## --from-file=parseable_license.sig=resources/parseable_license.sig + license: + secretName: parseable-license + mountPath: /tmp/license + dataKey: parseable_license.json + signatureKey: parseable_license.sig + + ## Ships an audit trail of API activity to another Parseable instance/stream. + ## Applied to every node type (ingestor/querier/prism). + auditLogging: + enabled: false + server: "http://parseable-querier-service.parseable.svc.cluster.local" + username: admin + password: admin + ## Reference to a Secret key holding the password instead of the + ## plaintext `password` field above. + existingSecret: + name: "" + key: "" + + ## ----------------------------------------------------------------------- + ## Shared identity / security (applies to every node type's pod) + ## ----------------------------------------------------------------------- + serviceAccount: + create: true + name: "parseable" + annotations: {} + + securityContext: + allowPrivilegeEscalation: false + + ## Pod-level security context. Applied to OSS pods only; Enterprise pods run + ## as the image's default user (root), which its bundled ML feature needs. + podSecurityContext: + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 + fsGroupChangePolicy: "Always" + + ## ========================================================================= + ## Node types + ## ========================================================================= + + ## --- standalone --- (deploymentMode: standalone, OSS only) --------------- + standalone: + ## Single pod running every function (ingest + query + storage). + unified: + env: + RUST_LOG: warn + P_CHECK_UPDATE: "false" + resources: + limits: + cpu: 500m + memory: 4Gi + requests: + cpu: 250m + memory: 1Gi + service: + type: ClusterIP + port: 80 + persistence: + ## Data directory - only needed when store.type is local-store. + data: + enabled: false + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi + staging: + enabled: true + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "80" + prometheus.io/path: "/api/v1/metrics" + podLabels: app: parseable - podAnnotations: {} + component: standalone nodeSelector: {} tolerations: [] - labels: - app: parseable - component: ingestor - count: 3 + affinity: {} + terminationGracePeriodSeconds: 30 + readinessProbe: + httpGet: + path: /api/v1/readiness + port: 8000 + + ## --- distributed --- (deploymentMode: distributed) ---------------------- + distributed: + ## ingestor (OSS + Enterprise) - receives and stages incoming events. + ingestor: + replicas: 3 env: RUST_LOG: warn - ## Use this endpoint to send events to ingestors - ## Console (UI) is available on the other service (that points to the query pod) + P_CHECK_UPDATE: "false" + # General Kafka Configuration + # P_KAFKA_BOOTSTRAP_SERVERS: "my-kafka.kafka.svc.cluster.local:9092" # Comma-separated list of Kafka bootstrap servers + # P_KAFKA_PARTITION_LISTENER_CONCURRENCY: "2" # Number of parallel threads for Kafka partition listeners + # P_KAFKA_CONSUMER_TOPICS: "test-log-stream-0,test-log-stream-1" + # P_KAFKA_CLIENT_ID: "parseable-connect" # Client ID for Kafka connection + # P_CONNECTOR_BAD_DATA_POLICY: "fail" # Default Policy for handling bad data + # See https://www.parseable.com/docs for the full list of Kafka consumer/security options. + resources: + limits: + cpu: 500m + memory: 4Gi + requests: + cpu: 250m + memory: 1Gi service: type: ClusterIP port: 80 + ## Local disk for staging incoming events before they are sent to the object store. + persistence: + staging: + enabled: true + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "80" + prometheus.io/path: "/api/v1/metrics" + podLabels: + app: parseable + component: ingestor + nodeSelector: {} + tolerations: [] + affinity: {} + terminationGracePeriodSeconds: 30 readinessProbe: httpGet: path: /api/v1/readiness port: 8000 + + ## querier (OSS + Enterprise) - serves queries and the console. OSS supports + ## a single querier; Enterprise can run multiple queriers behind prism. + querier: + replicas: 1 + env: + RUST_LOG: warn + P_CHECK_UPDATE: "false" resources: limits: cpu: 500m @@ -46,521 +270,90 @@ parseable: requests: cpu: 250m memory: 1Gi + service: + type: ClusterIP + port: 80 + ## Local disk used as the hot-tier query cache, mounted at /parseable/hot-tier. + ## Required for Enterprise query nodes; recommended for OSS performance. + persistence: + hotTier: + enabled: true + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "80" + prometheus.io/path: "/api/v1/metrics" + podLabels: + app: parseable + component: querier + nodeSelector: {} + tolerations: [] + affinity: {} + terminationGracePeriodSeconds: 30 + readinessProbe: + httpGet: + path: /api/v1/readiness + port: 8000 + + ## prism (Enterprise only) - cluster coordinator, fronts the querier fleet. + ## Deployed automatically whenever enterprise.enabled is true. + prism: + replicas: 1 + env: + RUST_LOG: warn + P_CHECK_UPDATE: "false" + resources: + limits: + cpu: "1" + memory: 2Gi + requests: + cpu: 500m + memory: 1Gi + service: + type: ClusterIP + port: 80 + ## Local disk for Prism's own state. Optional. + persistence: + enabled: false + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "80" + prometheus.io/path: "/api/v1/metrics" + podLabels: + app: parseable + component: prism + nodeSelector: {} + tolerations: [] + affinity: {} + terminationGracePeriodSeconds: 30 + readinessProbe: + httpGet: + path: /api/v1/readiness + port: 8000 - ## Add environment variables to the Parseable Deployment - env: - RUST_LOG: warn - ## Enable to create a log stream and then add retention configuration - ## for that log stream - # logstream: - # - name: "vectordemo" - # retention: - # action: "delete" - # duration: "30d" - # - name: "fluentbitdemo" - # retention: - # action: "delete" - # duration: "30d" - ## enable persistence using PVC for the Data and Staging directories - ## Note that Data directory is needed only for local mode - persistence: - staging: - enabled: true - storageClass: "" - accessMode: ReadWriteOnce - size: 5Gi - ingestor: - enabled: false - storageClass: "" - accessMode: ReadWriteOnce - size: 5Gi - data: - enabled: false - storageClass: "" - accessMode: ReadWriteOnce - size: 5Gi - ## enabling the disk on querier adds the hot-tier. - ## local-store is not supported on hot-tier. - querier: - enabled: false - storageClass: "" - accessMode: ReadWriteOnce - size: 100Gi - ## comment out the secrets depending upon deployment option - ## localModeSecret if store is set to local - ## blobModeSecret if store is set to blob-store - ## s3ModeSecret if store is set to s3-store - localModeSecret: - enabled: false - secrets: - - name: parseable-env-secret - prefix: P_ - keys: - - addr - - username - - password - - staging.dir - - fs.dir - blobModeSecret: - enabled: false - secrets: - - name: parseable-env-secret - prefix: P_ - keys: - - addr - - username - - password - - azr.access_key - - azr.account - - azr.container - - azr.url - s3ModeSecret: - enabled: false - secrets: - - name: parseable-env-secret - prefix: P_ - keys: - - addr - - username - - password - - staging.dir - - fs.dir - - s3.url - - s3.access.key - - s3.secret.key - - s3.bucket - - s3.region - gcsModeSecret: - enabled: true - auth: - secret_name: parseable-env-secret - secret_key: key.json - mount_path: /var/secrets/google - secrets: - - name: parseable-env-secret - prefix: P_ - keys: - - addr - - username - - password - - staging.dir - - fs.dir - - gcs.url - - gcs.bucket - serviceAccount: - create: true - name: "parseable" - annotations: {} - nodeSelector: {} - service: - type: ClusterIP - port: 80 - readinessProbe: - httpGet: - path: /api/v1/readiness - port: 8000 - tolerations: [] - affinity: {} - resources: - limits: - cpu: 500m - memory: 4Gi - requests: - cpu: 250m - memory: 1Gi - ## works only when highAvailability is enabled - ## Set it to true if you want to deploy Parseable - ## Query node with a sidecar - sidecar: - enabled: false - image: - repository: busybox - tag: latest - pullPolicy: IfNotPresent - command: [] - args: [] - env: - RUST_LOG: warn - ports: 8000 - volumeMounts: - - name: test-volume - mountPath: /parseable/test - volumeClaimTemplates: - - metadata: - name: test-volume - spec: - accessModes: ["ReadWriteOnce"] - resources: - requests: - storage: 1Gi - resources: - limits: - cpu: 500m - memory: 4Gi - requests: - cpu: 250m - memory: 1Gi - securityContext: - allowPrivilegeEscalation: false - podAnnotations: - prometheus.io/scrape: "true" - prometheus.io/port: "80" - prometheus.io/path: "/api/v1/metrics" - podSecurityContext: - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - fsGroupChangePolicy: "Always" - nameOverride: "" - fullnameOverride: "" - podLabels: - app: parseable - component: query - ## Use this section to create ServiceMonitor object for - ## this Parseable deployment. Read more on ServiceMonitor + ## Create datasets and set their retention on install/upgrade. + ## datasets is a list of objects, each with a name and retention policy. Example: + ## - name: "sample-dataset" + ## retention: + ## action: "delete" + ## duration: "30d" + datasets: [] + + ## ServiceMonitor for this Parseable deployment. Read more on ServiceMonitor ## here: https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.ServiceMonitor metrics: serviceMonitor: enabled: false labels: {} namespace: "" - spec: - jobLabel: "" - targetLabels: [] - podTargetLabels: [] - endpoints: [] - selector: {} - namespaceSelector: {} - sampleLimit: 0 - scrapeProtocols: [] - targetLimit: 0 - labelLimit: 0 - labelNameLengthLimit: 0 - labelValueLengthLimit: 0 - keepDroppedTargets: 0 - attachMetadata: {} - scrapeClass: "" - bodySizeLimit: {} - kafkaConnector: - enabled: false - env: - # General Kafka Configuration - P_KAFKA_BOOTSTRAP_SERVERS: "my-kafka.kafka.svc.cluster.local:9092" # Comma-separated list of Kafka bootstrap servers - P_KAFKA_PARTITION_LISTENER_CONCURRENCY: "2" # Number of parallel threads for Kafka partition listeners - P_KAFKA_CONSUMER_TOPICS: "test-log-stream-0,test-log-stream-1" - # P_KAFKA_CLIENT_ID: "parseable-connect" # Client ID for Kafka connection - # P_CONNECTOR_BAD_DATA_POLICY: "fail" # Default Policy for handling bad data - - # Consumer Configurations. These config are Default Parseable KafkaConnector configs. Change only if necessary. - # P_KAFKA_CONSUMER_GROUP_ID: "parseable-connect-cg" - # P_KAFKA_CONSUMER_BUFFER_SIZE: "10000" - # P_KAFKA_CONSUMER_BUFFER_TIMEOUT: "10000ms" - # P_KAFKA_CONSUMER_SESSION_TIMEOUT: "60000" - # P_KAFKA_CONSUMER_HEARTBEAT_INTERVAL: "3000" - # P_KAFKA_CONSUMER_PARTITION_STRATEGY: "roundrobin,range" - # P_KAFKA_CONSUMER_MAX_POLL_INTERVAL: "300000" - # P_KAFKA_CONSUMER_ENABLE_AUTO_OFFSET_STORE: "true" - # P_KAFKA_CONSUMER_AUTO_OFFSET_RESET: "earliest" - # P_KAFKA_CONSUMER_FETCH_MIN_BYTES: "1" - # P_KAFKA_CONSUMER_FETCH_MAX_BYTES: "52428800" - # P_KAFKA_CONSUMER_FETCH_MAX_WAIT: "500" - # P_KAFKA_CONSUMER_MAX_PARTITION_FETCH_BYTES: "1048576" - # P_KAFKA_CONSUMER_QUEUED_MIN_MESSAGES: "100000" - # P_KAFKA_CONSUMER_QUEUED_MAX_MESSAGES_KBYTES: "65536" - # P_KAFKA_CONSUMER_ENABLE_PARTITION_EOF: "false" - # P_KAFKA_CONSUMER_CHECK_CRCS: "false" - # P_KAFKA_CONSUMER_ISOLATION_LEVEL: "read_committed" - # P_KAFKA_CONSUMER_FETCH_MESSAGE_MAX_BYTES: "1048576" - # P_KAFKA_CONSUMER_STATS_INTERVAL: "10000" - - # Security Configuration Options - By Default PLAINTEXT - - # Option 1: SSL Encryption Only - # P_KAFKA_SECURITY_PROTOCOL: "SSL" - # P_KAFKA_SSL_CA_LOCATION: "/etc/ssl/certs/ca-certificates.crt" - # P_KAFKA_SSL_CERTIFICATE_LOCATION: "/etc/ssl/certs/client-cert.pem" - # P_KAFKA_SSL_KEY_LOCATION: "/etc/ssl/private/client-key.pem" - # P_KAFKA_SSL_KEY_PASSWORD: "my-key-password" # Optional: only if key is password protected - - # Option 2: SASL Authentication with SSL Encryption - # P_KAFKA_SECURITY_PROTOCOL: "SASL_SSL" - # P_KAFKA_SSL_CA_LOCATION: "/etc/ssl/certs/ca-certificates.crt" - # P_KAFKA_SASL_MECHANISM: "SCRAM-SHA-512" # Can also be PLAIN, SCRAM-SHA-256, or GSSAPI - # P_KAFKA_SASL_USERNAME: "kafka-user" - # P_KAFKA_SASL_PASSWORD: "kafka-password" - - # Option 3: SASL Authentication without Encryption - # P_KAFKA_SECURITY_PROTOCOL: "SASL_PLAINTEXT" - # P_KAFKA_SASL_MECHANISM: "PLAIN" # Can also be SCRAM-SHA-256, SCRAM-SHA-512, or GSSAPI - # P_KAFKA_SASL_USERNAME: "kafka-user" - # P_KAFKA_SASL_PASSWORD: "kafka-password" - - # Option 4: OAuth Bearer Token Authentication (Not supported yet) - # P_KAFKA_SECURITY_PROTOCOL: "SASL_SSL" - # P_KAFKA_SASL_MECHANISM: "OAUTHBEARER" - # P_KAFKA_OAUTH_TOKEN_ENDPOINT: "https://oauth.example.com/token" - # P_KAFKA_OAUTH_CLIENT_ID: "kafka-client" - # P_KAFKA_OAUTH_CLIENT_SECRET: "client-secret" - # P_KAFKA_OAUTH_SCOPE: "kafka-access" # Optional: only if required by OAuth provider - -## Default values for Vector -# See Vector helm documentation to learn more: -# https://vector.dev/docs/setup/installation/package-managers/helm/ -vector: - enabled: false - role: "Agent" - rollWorkload: true - image: - repository: timberio/vector - pullPolicy: IfNotPresent - pullSecrets: [] - tag: "" - sha: "" - replicas: 1 - podManagementPolicy: OrderedReady - podDisruptionBudget: - enabled: false - minAvailable: 1 - maxUnavailable: - rbac: - create: true - serviceAccount: - create: true - annotations: {} - name: - automountToken: true - podLabels: - vector.dev/exclude: "true" - args: - - --config-dir - - "/etc/vector/" - terminationGracePeriodSeconds: 60 - service: - enabled: true - type: "ClusterIP" - annotations: {} - topologyKeys: [] - ports: [] - externalTrafficPolicy: "" - loadBalancerIP: "" - ipFamilyPolicy: "" - ipFamilies: [] - serviceHeadless: - enabled: true - dnsPolicy: ClusterFirst - customConfig: - data_dir: /vector-data-dir - api: - enabled: true - address: 127.0.0.1:8686 - playground: false - sources: - kubernetes_logs: - type: kubernetes_logs - sinks: - parseable: - type: http - method: post - batch: - max_bytes: 10485760 - max_events: 1000 - timeout_secs: 10 - compression: gzip - inputs: - - kubernetes_logs - encoding: - codec: json - uri: "http://parseable.parseable.svc.cluster.local/api/v1/ingest" - auth: - strategy: basic - user: admin - password: admin - request: - headers: - X-P-Stream: vectordemo - healthcheck: - enabled: true - path: "http://parseable.parseable.svc.cluster.local/api/v1/liveness" - port: 80 - -# Default values for fluent-bit. -# See fluent-bit helm documentation to learn more: -# https://github.com/fluent/helm-charts/tree/main/charts/fluent-bit -fluent-bit: - enabled: false - kind: DaemonSet - serverHost: parseable-ingestor-service.parseable.svc.cluster.local - serverUsername: admin - serverPassword: admin - serverStream: $NAMESPACE - excludeNamespaces: kube-system, default - replicaCount: 1 - image: - repository: parseable/fluent-bit - tag: "v2" - pullPolicy: Always - testFramework: - enabled: true - image: - repository: busybox - pullPolicy: Always - tag: latest - serviceAccount: - create: true - annotations: {} - name: - rbac: - create: true - nodeAccess: false - eventsAccess: true - dnsPolicy: ClusterFirst - service: - type: ClusterIP - port: 2020 - loadBalancerClass: - loadBalancerSourceRanges: [] - labels: {} - livenessProbe: - httpGet: - path: / - port: http - readinessProbe: - httpGet: - path: /api/v1/health + interval: 30s + scrapeTimeout: "" + path: /api/v1/metrics port: http - flush: 1 - metricsPort: 2020 - ## https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file - config: - service: | - [SERVICE] - Daemon Off - Flush {{ .Values.flush }} - Log_Level {{ .Values.logLevel }} - Parsers_File parsers.conf - Parsers_File custom_parsers.conf - HTTP_Server On - HTTP_Listen 0.0.0.0 - HTTP_Port {{ .Values.metricsPort }} - Health_Check On - - ## https://docs.fluentbit.io/manual/pipeline/inputs - inputs: | - [INPUT] - Name tail - Path /var/log/containers/*.log - multiline.parser docker, cri - Tag kube.* - Mem_Buf_Limit 5MB - Skip_Long_Lines On - - # [INPUT] - # Name tail - # Path /var/log/containers/{NGINX_POD_NAME}-*.log - # Parser nginx_access - # Tag kube.* - # Mem_Buf_Limit 5MB - # Skip_Long_Lines On - - # [INPUT] - # Name tail - # Path /var/log/containers/{NGINX_POD_NAME}-*.log - # Parser nginx_error - # Tag kube.* - # Mem_Buf_Limit 5MB - # Skip_Long_Lines On - - [INPUT] - name kubernetes_events - tag k8s_events - - [INPUT] - Name systemd - Tag host.* - Systemd_Filter _SYSTEMD_UNIT=kubelet.service - Read_From_Tail On - - ## https://docs.fluentbit.io/manual/pipeline/filters - filters: | - [FILTER] - Name kubernetes - Match kube.* - Merge_Log On - Keep_Log Off - K8S-Logging.Parser On - K8S-Logging.Exclude On - - ## https://docs.fluentbit.io/manual/pipeline/outputs - outputs: | - [OUTPUT] - Name parseable - Match kube.* - Server_Host {{ .Values.serverHost }} - Username {{ .Values.serverUsername }} - Password {{ .Values.serverPassword }} - Server_Port 80 - Stream {{ .Values.serverStream }} - Exclude_Namespaces {{ .Values.excludeNamespaces }} - - [OUTPUT] - Name parseable - Match k8s_events - Server_Host {{ .Values.serverHost }} - Server_Port 80 - Username {{ .Values.serverUsername }} - Password {{ .Values.serverPassword }} - Stream k8s-events - - upstream: {} - - customParsers: | - [PARSER] - Name docker_no_time - Format json - Time_Keep Off - Time_Key time - Time_Format %Y-%m-%dT%H:%M:%S.%L - - # [PARSER] - # Name nginx_error - # Format regex - # Regex ^(?\S+Z) stderr F (?\S+ \S+) \[(?\S+)\] (?\d+#\d+): \*(?\d+) (?.*?) client: (?\S+), server: (?\S+), request: "(?\S+) (?\S+) HTTP/\S+", upstream: "(?[^"]+)", host: "(?\S+)"$ - # Time_Key timestamp - # Time_Format %Y/%m/%d %H:%M:%S - - # [PARSER] - # Name nginx_access - # Format regex - # Regex (?[^ ]*) - (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^\"]*?)(?: +\S*)?)?" (?[^ ]*) (?[^ ]*) "(?[^\"]*)" "(?[^\"]*)" (?[^ ]*) (?[^ ]*) \[(?[^ ]*)\] \[(?[^ ]*)\] (?[^,]*),?(?:[^,]*),?(?:[^ ]*) (?[^,]*),?(?:[^,]*),?(?:[^ ]*) (?[^,]*),?(?:[^,]*),?(?:[^ ]*) (?[^,]*),?(?:[^,]*),?(?:[^ ]*) (?[^ ]*) - # Time_Key timestamp - # Time_Format %d/%b/%Y:%H:%M:%S %z - - # The config volume is mounted by default, either to the existingConfigMap value, or the default of "fluent-bit.fullname" - volumeMounts: - - name: config - mountPath: /fluent-bit/etc/fluent-bit.conf - subPath: fluent-bit.conf - - name: config - mountPath: /fluent-bit/etc/custom_parsers.conf - subPath: custom_parsers.conf - daemonSetVolumes: - - name: varlog - hostPath: - path: /var/log - - name: varlibdockercontainers - hostPath: - path: /var/lib/docker/containers - - name: etcmachineid - hostPath: - path: /etc/machine-id - type: File - daemonSetVolumeMounts: - - name: varlog - mountPath: /var/log - - name: varlibdockercontainers - mountPath: /var/lib/docker/containers - readOnly: true - - name: etcmachineid - mountPath: /etc/machine-id - readOnly: true - logLevel: info + relabelings: [] + metricRelabelings: [] diff --git a/index.yaml b/index.yaml index fa5bccbcd..606186886 100644 --- a/index.yaml +++ b/index.yaml @@ -1,9 +1,27 @@ apiVersion: v1 entries: pai: + - apiVersion: v2 + appVersion: 0.3.0 + created: "2026-06-19T11:48:21.375199+05:30" + description: Parseable Auto Instrumentation (PAI) operator for Kubernetes + digest: 460cffa045fb2cb72b1b43bb25b42d332c441e04ec90800a0155c8ebabcbc7b9 + home: https://github.com/parseablehq/pai + keywords: + - observability + - opentelemetry + - auto-instrumentation + - parseable + maintainers: + - name: Parseable + name: pai + type: application + urls: + - https://charts.parseable.com/helm-releases/pai-0.3.0.tgz + version: 0.3.0 - apiVersion: v2 appVersion: 0.2.0 - created: "2026-06-08T13:03:45.109378+08:00" + created: "2026-06-19T11:48:21.374828+05:30" description: Parseable Auto Instrumentation (PAI) operator for Kubernetes digest: fd04518e8fc9e25d3fa876971a38b4c65005a207ba9440ae8ce981cd070646d9 home: https://github.com/parseablehq/pai @@ -21,7 +39,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.1.0 - created: "2026-06-08T13:03:45.109233+08:00" + created: "2026-06-19T11:48:21.374461+05:30" description: Parseable Auto Instrumentation (PAI) operator for Kubernetes digest: 9443e75bef96a424fd5063ddd02cee18e6050207d73e505f66be467287c9f7f7 home: https://github.com/parseablehq/pai @@ -40,7 +58,7 @@ entries: parseable: - apiVersion: v2 appVersion: v2.8.0 - created: "2026-06-08T13:03:45.221758+08:00" + created: "2026-06-19T11:48:21.512833+05:30" dependencies: - condition: vector.enabled name: vector @@ -65,7 +83,7 @@ entries: version: 2.8.2 - apiVersion: v2 appVersion: v2.8.1 - created: "2026-06-08T13:03:45.22012+08:00" + created: "2026-06-19T11:48:21.511079+05:30" dependencies: - condition: vector.enabled name: vector @@ -90,7 +108,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: v2.8.0 - created: "2026-06-08T13:03:45.218159+08:00" + created: "2026-06-19T11:48:21.50904+05:30" dependencies: - condition: vector.enabled name: vector @@ -115,7 +133,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: v2.7.2 - created: "2026-06-08T13:03:45.216492+08:00" + created: "2026-06-19T11:48:21.507255+05:30" dependencies: - condition: vector.enabled name: vector @@ -140,7 +158,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: v2.7.1 - created: "2026-06-08T13:03:45.21479+08:00" + created: "2026-06-19T11:48:21.505179+05:30" dependencies: - condition: vector.enabled name: vector @@ -165,7 +183,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: v2.6.6 - created: "2026-06-08T13:03:45.212753+08:00" + created: "2026-06-19T11:48:21.503388+05:30" dependencies: - condition: vector.enabled name: vector @@ -190,7 +208,7 @@ entries: version: 2.6.6 - apiVersion: v2 appVersion: v2.6.5 - created: "2026-06-08T13:03:45.211094+08:00" + created: "2026-06-19T11:48:21.501361+05:30" dependencies: - condition: vector.enabled name: vector @@ -215,7 +233,7 @@ entries: version: 2.6.5 - apiVersion: v2 appVersion: v2.5.13 - created: "2026-06-08T13:03:45.200212+08:00" + created: "2026-06-19T11:48:21.488594+05:30" dependencies: - condition: vector.enabled name: vector @@ -240,7 +258,7 @@ entries: version: 2.5.13 - apiVersion: v2 appVersion: v2.5.7 - created: "2026-06-08T13:03:45.20911+08:00" + created: "2026-06-19T11:48:21.499335+05:30" dependencies: - condition: vector.enabled name: vector @@ -265,7 +283,7 @@ entries: version: 2.5.7 - apiVersion: v2 appVersion: v2.5.6 - created: "2026-06-08T13:03:45.207505+08:00" + created: "2026-06-19T11:48:21.497237+05:30" dependencies: - condition: vector.enabled name: vector @@ -290,7 +308,7 @@ entries: version: 2.5.6 - apiVersion: v2 appVersion: v2.5.5 - created: "2026-06-08T13:03:45.205892+08:00" + created: "2026-06-19T11:48:21.494746+05:30" dependencies: - condition: vector.enabled name: vector @@ -315,7 +333,7 @@ entries: version: 2.5.5 - apiVersion: v2 appVersion: v2.5.4 - created: "2026-06-08T13:03:45.203943+08:00" + created: "2026-06-19T11:48:21.49258+05:30" dependencies: - condition: vector.enabled name: vector @@ -339,7 +357,7 @@ entries: version: 2.5.4 - apiVersion: v2 appVersion: v2.5.3 - created: "2026-06-08T13:03:45.20227+08:00" + created: "2026-06-19T11:48:21.490769+05:30" dependencies: - condition: vector.enabled name: vector @@ -363,7 +381,7 @@ entries: version: 2.5.3 - apiVersion: v2 appVersion: v2.4.0 - created: "2026-06-08T13:03:45.198621+08:00" + created: "2026-06-19T11:48:21.486787+05:30" dependencies: - condition: vector.enabled name: vector @@ -387,7 +405,7 @@ entries: version: 2.4.0 - apiVersion: v2 appVersion: v2.3.3 - created: "2026-06-08T13:03:45.196995+08:00" + created: "2026-06-19T11:48:21.484571+05:30" dependencies: - condition: vector.enabled name: vector @@ -411,7 +429,7 @@ entries: version: 2.3.3 - apiVersion: v2 appVersion: v2.3.2 - created: "2026-06-08T13:03:45.195026+08:00" + created: "2026-06-19T11:48:21.482537+05:30" dependencies: - condition: vector.enabled name: vector @@ -435,7 +453,7 @@ entries: version: 2.3.2 - apiVersion: v2 appVersion: v2.3.1 - created: "2026-06-08T13:03:45.19334+08:00" + created: "2026-06-19T11:48:21.480253+05:30" dependencies: - condition: vector.enabled name: vector @@ -459,7 +477,7 @@ entries: version: 2.3.1 - apiVersion: v2 appVersion: v2.3.0 - created: "2026-06-08T13:03:45.191377+08:00" + created: "2026-06-19T11:48:21.478091+05:30" dependencies: - condition: vector.enabled name: vector @@ -483,7 +501,7 @@ entries: version: 2.3.0 - apiVersion: v2 appVersion: v2.1.0 - created: "2026-06-08T13:03:45.18972+08:00" + created: "2026-06-19T11:48:21.476236+05:30" dependencies: - condition: vector.enabled name: vector @@ -507,7 +525,7 @@ entries: version: 2.1.0 - apiVersion: v2 appVersion: v1.7.5 - created: "2026-06-08T13:03:45.187602+08:00" + created: "2026-06-19T11:48:21.474011+05:30" dependencies: - condition: vector.enabled name: vector @@ -531,7 +549,7 @@ entries: version: 2.0.0 - apiVersion: v2 appVersion: v1.7.5 - created: "2026-06-08T13:03:45.185956+08:00" + created: "2026-06-19T11:48:21.472217+05:30" dependencies: - condition: vector.enabled name: vector @@ -555,7 +573,7 @@ entries: version: 1.7.5 - apiVersion: v2 appVersion: v1.7.3 - created: "2026-06-08T13:03:45.184297+08:00" + created: "2026-06-19T11:48:21.470148+05:30" dependencies: - condition: vector.enabled name: vector @@ -579,7 +597,7 @@ entries: version: 1.7.3 - apiVersion: v2 appVersion: v1.7.2 - created: "2026-06-08T13:03:45.182331+08:00" + created: "2026-06-19T11:48:21.468299+05:30" dependencies: - condition: vector.enabled name: vector @@ -603,7 +621,7 @@ entries: version: 1.7.2 - apiVersion: v2 appVersion: v1.7.1 - created: "2026-06-08T13:03:45.18069+08:00" + created: "2026-06-19T11:48:21.466107+05:30" dependencies: - condition: vector.enabled name: vector @@ -627,7 +645,7 @@ entries: version: 1.7.1 - apiVersion: v2 appVersion: v1.7.0 - created: "2026-06-08T13:03:45.178724+08:00" + created: "2026-06-19T11:48:21.464215+05:30" dependencies: - condition: vector.enabled name: vector @@ -650,7 +668,7 @@ entries: version: 1.7.0 - apiVersion: v2 appVersion: v1.6.3 - created: "2026-06-08T13:03:45.17705+08:00" + created: "2026-06-19T11:48:21.462175+05:30" dependencies: - condition: vector.enabled name: vector @@ -673,7 +691,7 @@ entries: version: 1.6.8 - apiVersion: v2 appVersion: v1.6.3 - created: "2026-06-08T13:03:45.175007+08:00" + created: "2026-06-19T11:48:21.460061+05:30" dependencies: - condition: vector.enabled name: vector @@ -696,7 +714,7 @@ entries: version: 1.6.7 - apiVersion: v2 appVersion: v1.6.3 - created: "2026-06-08T13:03:45.173404+08:00" + created: "2026-06-19T11:48:21.458277+05:30" dependencies: - condition: vector.enabled name: vector @@ -719,7 +737,7 @@ entries: version: 1.6.6 - apiVersion: v2 appVersion: v1.6.3 - created: "2026-06-08T13:03:45.171846+08:00" + created: "2026-06-19T11:48:21.456157+05:30" dependencies: - condition: vector.enabled name: vector @@ -742,7 +760,7 @@ entries: version: 1.6.5 - apiVersion: v2 appVersion: v1.6.3 - created: "2026-06-08T13:03:45.169949+08:00" + created: "2026-06-19T11:48:21.454182+05:30" dependencies: - condition: vector.enabled name: vector @@ -765,7 +783,7 @@ entries: version: 1.6.4 - apiVersion: v2 appVersion: v1.6.3 - created: "2026-06-08T13:03:45.168407+08:00" + created: "2026-06-19T11:48:21.452047+05:30" dependencies: - condition: vector.enabled name: vector @@ -788,7 +806,7 @@ entries: version: 1.6.3 - apiVersion: v2 appVersion: v1.6.2 - created: "2026-06-08T13:03:45.166634+08:00" + created: "2026-06-19T11:48:21.450305+05:30" dependencies: - condition: vector.enabled name: vector @@ -811,7 +829,7 @@ entries: version: 1.6.2 - apiVersion: v2 appVersion: v1.6.1 - created: "2026-06-08T13:03:45.165135+08:00" + created: "2026-06-19T11:48:21.448043+05:30" dependencies: - condition: vector.enabled name: vector @@ -834,7 +852,7 @@ entries: version: 1.6.1 - apiVersion: v2 appVersion: v1.6.0 - created: "2026-06-08T13:03:45.163611+08:00" + created: "2026-06-19T11:48:21.446311+05:30" dependencies: - condition: vector.enabled name: vector @@ -857,7 +875,7 @@ entries: version: 1.6.0 - apiVersion: v2 appVersion: v1.5.5 - created: "2026-06-08T13:03:45.161756+08:00" + created: "2026-06-19T11:48:21.444435+05:30" dependencies: - condition: vector.enabled name: vector @@ -880,7 +898,7 @@ entries: version: 1.5.5 - apiVersion: v2 appVersion: v1.5.4 - created: "2026-06-08T13:03:45.160224+08:00" + created: "2026-06-19T11:48:21.442029+05:30" dependencies: - condition: vector.enabled name: vector @@ -903,7 +921,7 @@ entries: version: 1.5.4 - apiVersion: v2 appVersion: v1.5.3 - created: "2026-06-08T13:03:45.158678+08:00" + created: "2026-06-19T11:48:21.440213+05:30" dependencies: - condition: vector.enabled name: vector @@ -926,7 +944,7 @@ entries: version: 1.5.3 - apiVersion: v2 appVersion: v1.5.2 - created: "2026-06-08T13:03:45.156791+08:00" + created: "2026-06-19T11:48:21.437951+05:30" dependencies: - condition: vector.enabled name: vector @@ -949,7 +967,7 @@ entries: version: 1.5.2 - apiVersion: v2 appVersion: v1.5.1 - created: "2026-06-08T13:03:45.155314+08:00" + created: "2026-06-19T11:48:21.436049+05:30" dependencies: - condition: vector.enabled name: vector @@ -972,7 +990,7 @@ entries: version: 1.5.1 - apiVersion: v2 appVersion: v1.5.0 - created: "2026-06-08T13:03:45.153649+08:00" + created: "2026-06-19T11:48:21.433762+05:30" dependencies: - condition: vector.enabled name: vector @@ -995,7 +1013,7 @@ entries: version: 1.5.0 - apiVersion: v2 appVersion: v1.4.0 - created: "2026-06-08T13:03:45.151903+08:00" + created: "2026-06-19T11:48:21.431466+05:30" dependencies: - condition: vector.enabled name: vector @@ -1018,7 +1036,7 @@ entries: version: 1.4.1 - apiVersion: v2 appVersion: v1.4.0 - created: "2026-06-08T13:03:45.150445+08:00" + created: "2026-06-19T11:48:21.429431+05:30" dependencies: - condition: vector.enabled name: vector @@ -1041,7 +1059,7 @@ entries: version: 1.4.0 - apiVersion: v2 appVersion: v1.3.0 - created: "2026-06-08T13:03:45.148661+08:00" + created: "2026-06-19T11:48:21.427108+05:30" dependencies: - condition: vector.enabled name: vector @@ -1064,7 +1082,7 @@ entries: version: 1.3.1 - apiVersion: v2 appVersion: v1.3.0 - created: "2026-06-08T13:03:45.14726+08:00" + created: "2026-06-19T11:48:21.425267+05:30" dependencies: - condition: vector.enabled name: vector @@ -1087,7 +1105,7 @@ entries: version: 1.3.0 - apiVersion: v2 appVersion: v1.2.0 - created: "2026-06-08T13:03:45.145808+08:00" + created: "2026-06-19T11:48:21.42339+05:30" dependencies: - condition: vector.enabled name: vector @@ -1110,7 +1128,7 @@ entries: version: 1.2.0 - apiVersion: v2 appVersion: v1.1.0 - created: "2026-06-08T13:03:45.14406+08:00" + created: "2026-06-19T11:48:21.421015+05:30" dependencies: - condition: vector.enabled name: vector @@ -1133,7 +1151,7 @@ entries: version: 1.1.0 - apiVersion: v2 appVersion: v1.0.0 - created: "2026-06-08T13:03:45.142627+08:00" + created: "2026-06-19T11:48:21.419145+05:30" dependencies: - condition: vector.enabled name: vector @@ -1156,7 +1174,7 @@ entries: version: 1.0.0 - apiVersion: v2 appVersion: v0.9.0 - created: "2026-06-08T13:03:45.141059+08:00" + created: "2026-06-19T11:48:21.4165+05:30" dependencies: - condition: vector.enabled name: vector @@ -1179,7 +1197,7 @@ entries: version: 0.9.0 - apiVersion: v2 appVersion: v0.8.1 - created: "2026-06-08T13:03:45.139568+08:00" + created: "2026-06-19T11:48:21.41472+05:30" dependencies: - condition: vector.enabled name: vector @@ -1202,7 +1220,7 @@ entries: version: 0.8.1 - apiVersion: v2 appVersion: v0.8.0 - created: "2026-06-08T13:03:45.138147+08:00" + created: "2026-06-19T11:48:21.412304+05:30" dependencies: - condition: vector.enabled name: vector @@ -1225,7 +1243,7 @@ entries: version: 0.8.0 - apiVersion: v2 appVersion: v0.7.3 - created: "2026-06-08T13:03:45.136413+08:00" + created: "2026-06-19T11:48:21.410632+05:30" dependencies: - condition: vector.enabled name: vector @@ -1248,7 +1266,7 @@ entries: version: 0.7.3 - apiVersion: v2 appVersion: v0.7.2 - created: "2026-06-08T13:03:45.135012+08:00" + created: "2026-06-19T11:48:21.408752+05:30" dependencies: - condition: vector.enabled name: vector @@ -1271,7 +1289,7 @@ entries: version: 0.7.2 - apiVersion: v2 appVersion: v0.7.1 - created: "2026-06-08T13:03:45.133544+08:00" + created: "2026-06-19T11:48:21.406709+05:30" dependencies: - condition: vector.enabled name: vector @@ -1294,7 +1312,7 @@ entries: version: 0.7.1 - apiVersion: v2 appVersion: v0.7.0 - created: "2026-06-08T13:03:45.13154+08:00" + created: "2026-06-19T11:48:21.404786+05:30" dependencies: - condition: vector.enabled name: vector @@ -1317,7 +1335,7 @@ entries: version: 0.7.0 - apiVersion: v2 appVersion: v0.6.2 - created: "2026-06-08T13:03:45.130069+08:00" + created: "2026-06-19T11:48:21.402644+05:30" dependencies: - condition: vector.enabled name: vector @@ -1340,7 +1358,7 @@ entries: version: 0.6.2 - apiVersion: v2 appVersion: v0.6.1 - created: "2026-06-08T13:03:45.128581+08:00" + created: "2026-06-19T11:48:21.400977+05:30" dependencies: - condition: vector.enabled name: vector @@ -1363,7 +1381,7 @@ entries: version: 0.6.1 - apiVersion: v2 appVersion: v0.6.0 - created: "2026-06-08T13:03:45.126687+08:00" + created: "2026-06-19T11:48:21.39899+05:30" dependencies: - condition: vector.enabled name: vector @@ -1386,7 +1404,7 @@ entries: version: 0.6.0 - apiVersion: v2 appVersion: v0.5.1 - created: "2026-06-08T13:03:45.125232+08:00" + created: "2026-06-19T11:48:21.396969+05:30" dependencies: - condition: vector.enabled name: vector @@ -1409,7 +1427,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: v0.5.0 - created: "2026-06-08T13:03:45.123443+08:00" + created: "2026-06-19T11:48:21.395114+05:30" dependencies: - condition: vector.enabled name: vector @@ -1432,7 +1450,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: v0.4.4 - created: "2026-06-08T13:03:45.122052+08:00" + created: "2026-06-19T11:48:21.392657+05:30" dependencies: - condition: vector.enabled name: vector @@ -1455,7 +1473,7 @@ entries: version: 0.4.5 - apiVersion: v2 appVersion: v0.4.3 - created: "2026-06-08T13:03:45.120645+08:00" + created: "2026-06-19T11:48:21.390547+05:30" dependencies: - condition: vector.enabled name: vector @@ -1478,7 +1496,7 @@ entries: version: 0.4.4 - apiVersion: v2 appVersion: v0.4.2 - created: "2026-06-08T13:03:45.11885+08:00" + created: "2026-06-19T11:48:21.388264+05:30" dependencies: - condition: vector.enabled name: vector @@ -1501,7 +1519,7 @@ entries: version: 0.4.3 - apiVersion: v2 appVersion: v0.4.1 - created: "2026-06-08T13:03:45.117488+08:00" + created: "2026-06-19T11:48:21.386295+05:30" dependencies: - condition: vector.enabled name: vector @@ -1524,7 +1542,7 @@ entries: version: 0.4.2 - apiVersion: v2 appVersion: v0.4.0 - created: "2026-06-08T13:03:45.116037+08:00" + created: "2026-06-19T11:48:21.384226+05:30" dependencies: - condition: vector.enabled name: vector @@ -1547,7 +1565,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: v0.4.0 - created: "2026-06-08T13:03:45.113982+08:00" + created: "2026-06-19T11:48:21.38243+05:30" dependencies: - condition: vector.enabled name: vector @@ -1570,7 +1588,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: v0.3.1 - created: "2026-06-08T13:03:45.112619+08:00" + created: "2026-06-19T11:48:21.380635+05:30" dependencies: - condition: vector.enabled name: vector @@ -1593,7 +1611,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: v0.3.0 - created: "2026-06-08T13:03:45.111179+08:00" + created: "2026-06-19T11:48:21.378137+05:30" description: Helm chart for Parseable Server digest: ff30739229b727dc637f62fd4481c886a6080ce4556bae10cafe7642ddcfd937 name: parseable @@ -1603,7 +1621,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: v0.2.2 - created: "2026-06-08T13:03:45.111004+08:00" + created: "2026-06-19T11:48:21.377963+05:30" description: Helm chart for Parseable Server digest: 477d0dc2f0c07d4f4c32e105d4bdd70c71113add5c2a75ac5f1cb42aa0276db7 name: parseable @@ -1613,7 +1631,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: v0.2.1 - created: "2026-06-08T13:03:45.110512+08:00" + created: "2026-06-19T11:48:21.377807+05:30" description: Helm chart for Parseable Server digest: 84826fcd1b4c579f301569f43b0309c07e8082bad76f5cdd25f86e86ca2e8192 name: parseable @@ -1623,7 +1641,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: v0.2.0 - created: "2026-06-08T13:03:45.110391+08:00" + created: "2026-06-19T11:48:21.377646+05:30" description: Helm chart for Parseable Server digest: 7a759f7f9809f3935cba685e904c021a0b645f217f4e45b9be185900c467edff name: parseable @@ -1633,7 +1651,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: v0.1.1 - created: "2026-06-08T13:03:45.110273+08:00" + created: "2026-06-19T11:48:21.377507+05:30" description: Helm chart for Parseable Server digest: 37993cf392f662ec7b1fbfc9a2ba00ec906d98723e38f3c91ff1daca97c3d0b3 name: parseable @@ -1643,7 +1661,7 @@ entries: version: 0.1.1 - apiVersion: v2 appVersion: v0.1.0 - created: "2026-06-08T13:03:45.110158+08:00" + created: "2026-06-19T11:48:21.377365+05:30" description: Helm chart for Parseable Server digest: 1d580d072af8d6b1ebcbfee31c2e16c907d08db754780f913b5f0032b403789b name: parseable @@ -1653,7 +1671,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: v0.0.8 - created: "2026-06-08T13:03:45.110047+08:00" + created: "2026-06-19T11:48:21.377219+05:30" description: Helm chart for Parseable Server digest: c805254ffa634f96ecec448bcfff9973339aa9487dd8199b21b17b79a4de9345 name: parseable @@ -1663,7 +1681,7 @@ entries: version: 0.0.8 - apiVersion: v2 appVersion: v0.0.7 - created: "2026-06-08T13:03:45.109937+08:00" + created: "2026-06-19T11:48:21.377084+05:30" description: Helm chart for Parseable Server digest: c591f617ed1fe820bb2c72a4c976a78126f1d1095d552daa07c4700f46c4708a name: parseable @@ -1673,7 +1691,7 @@ entries: version: 0.0.7 - apiVersion: v2 appVersion: v0.0.6 - created: "2026-06-08T13:03:45.10983+08:00" + created: "2026-06-19T11:48:21.376932+05:30" description: Helm chart for Parseable Server digest: f9ae56a6fcd6a59e7bee0436200ddbedeb74ade6073deb435b8fcbaf08dda795 name: parseable @@ -1683,7 +1701,7 @@ entries: version: 0.0.6 - apiVersion: v2 appVersion: v0.0.5 - created: "2026-06-08T13:03:45.109722+08:00" + created: "2026-06-19T11:48:21.376786+05:30" description: Helm chart for Parseable Server digest: 4d6b08a064fba36e16feeb820b77e1e8e60fb6de48dbf7ec8410d03d10c26ad0 name: parseable @@ -1693,7 +1711,7 @@ entries: version: 0.0.5 - apiVersion: v2 appVersion: v0.0.2 - created: "2026-06-08T13:03:45.109605+08:00" + created: "2026-06-19T11:48:21.375802+05:30" description: Helm chart for Parseable Server digest: 38a0a3e4c498afbbcc76ebfcb9cb598fa2ca843a53cc93b3cb4f135b85c10844 name: parseable @@ -1703,7 +1721,7 @@ entries: version: 0.0.2 - apiVersion: v2 appVersion: v0.0.1 - created: "2026-06-08T13:03:45.109495+08:00" + created: "2026-06-19T11:48:21.375565+05:30" description: Helm chart for Parseable Server digest: 1f1142db092b9620ee38bb2294ccbb1c17f807b33bf56da43816af7fe89f301e name: parseable @@ -1714,7 +1732,7 @@ entries: parseable-enterprise: - apiVersion: v2 appVersion: v2.8.1 - created: "2026-06-08T13:03:45.235107+08:00" + created: "2026-06-19T11:48:21.527896+05:30" dependencies: - condition: vector.enabled name: vector @@ -1739,7 +1757,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: v2.8.0 - created: "2026-06-08T13:03:45.233405+08:00" + created: "2026-06-19T11:48:21.525912+05:30" dependencies: - condition: vector.enabled name: vector @@ -1764,7 +1782,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: v2.7.3 - created: "2026-06-08T13:03:45.231589+08:00" + created: "2026-06-19T11:48:21.523575+05:30" dependencies: - condition: vector.enabled name: vector @@ -1789,7 +1807,7 @@ entries: version: 2.7.3 - apiVersion: v2 appVersion: v2.7.2 - created: "2026-06-08T13:03:45.22962+08:00" + created: "2026-06-19T11:48:21.521718+05:30" dependencies: - condition: vector.enabled name: vector @@ -1814,7 +1832,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: v2.7.1 - created: "2026-06-08T13:03:45.227818+08:00" + created: "2026-06-19T11:48:21.519409+05:30" dependencies: - condition: vector.enabled name: vector @@ -1839,7 +1857,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: v2.6.6 - created: "2026-06-08T13:03:45.225599+08:00" + created: "2026-06-19T11:48:21.517043+05:30" dependencies: - condition: vector.enabled name: vector @@ -1864,7 +1882,7 @@ entries: version: 2.6.7 - apiVersion: v2 appVersion: v2.6.6 - created: "2026-06-08T13:03:45.223825+08:00" + created: "2026-06-19T11:48:21.515118+05:30" dependencies: - condition: vector.enabled name: vector @@ -1887,4 +1905,4 @@ entries: urls: - https://charts.parseable.com/helm-releases/parseable-enterprise-2.6.6.tgz version: 2.6.6 -generated: "2026-06-08T13:03:45.109001+08:00" +generated: "2026-06-19T11:48:21.373906+05:30"