added repo

This commit is contained in:
Your Name
2026-08-26 03:39:42 +05:30
parent 45c25a95af
commit b8575bb8b9
6889 changed files with 1217125 additions and 0 deletions
@@ -0,0 +1,63 @@
Thanks for deploying Grafana Pyroscope.
# Pyroscope UI & Grafana
Pyroscope database comes with a built-in UI, to access it from your localhost you can use:
```
{{ include "pyroscope.kubectl_port_forward_read" . }}
```
You can also use Grafana to explore Pyroscope data.
For that, you'll need to add the Pyroscope data source to your Grafana instance and configure the query URL accordingly.
See https://grafana.com/docs/grafana/latest/datasources/grafana-pyroscope/ for more details.
The in-cluster query URL for the data source in Grafana is:
```
{{ include "pyroscope.read_url" . }}
```
# Collecting profiles.
{{ if or .Values.agent.enabled .Values.alloy.enabled }}
The Grafana {{ if .Values.alloy.enabled }}Alloy{{ else }}Agent{{ end }} has been installed to scrape and discover pprof profiles endpoint via pod annotations.
As an example, to start collecting memory and cpu profile using the 8080 port, add the following annotations to your workload:
```
profiles.grafana.com/memory.scrape: "true"
profiles.grafana.com/memory.port: "8080"
profiles.grafana.com/cpu.scrape: "true"
profiles.grafana.com/cpu.port: "8080"
```
To learn more supported annotations, read our guide https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/#optional-scrape-your-own-workloads-profiles
{{- end }}
There are various ways to collect profiles from your application depending on your needs.
Follow our guide to setup profiling data collection for your workload:
https://grafana.com/docs/pyroscope/latest/configure-client/
{{- $storage := .Values.architecture.storage }}
{{- if and $storage.v1 $storage.v2 }}
# Pyroscope v2 Migration is active
Write traffic will be written to:
- {{ mul $storage.migration.ingesterWeight 100 }}% v1: ingester
- {{ mul $storage.migration.segmentWriterWeight 100 }}% v2: segment-writer
{{ if $storage.migration.queryBackend }}
Read traffic is served from v2 read path from {{if eq $storage.migration.queryBackendFrom "auto"}}as soon as data was first ingested to v2{{else}}{{$storage.migration.queryBackendFrom}}{{end}}.
{{- else }}
Read traffic is served from v1 read path.
{{- end }}
{{- end }}
{{- if and (not $storage.v1) (not $storage.v2) }}
{{- fail "you need to set at least one of .Values.architecture.storage.v1, .Values.architecture.storage.v2 to true" }}
{{- end }}
@@ -0,0 +1,161 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "pyroscope.name" -}}
{{- default .Chart.Name .Values.pyroscope.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
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 "pyroscope.fullname" -}}
{{- if .Values.pyroscope.fullnameOverride }}
{{- .Values.pyroscope.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.pyroscope.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "pyroscope.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "pyroscope.labels" -}}
helm.sh/chart: {{ include "pyroscope.chart" . }}
{{ include "pyroscope.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- range $k, $v := .Values.pyroscope.extraLabels }}
{{$k}}: {{ $v | quote }}
{{- end }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "pyroscope.selectorLabels" -}}
app.kubernetes.io/name: {{ include "pyroscope.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Template labels
*/}}
{{- define "pyroscope.templateLabels" -}}
{{ include "pyroscope.selectorLabels" . }}
{{- range $k, $v := .Values.pyroscope.extraLabels }}
{{$k}}: {{ $v | quote }}
{{- end }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "pyroscope.serviceAccountName" -}}
{{- if .Values.pyroscope.serviceAccount.create }}
{{- default (include "pyroscope.fullname" .) .Values.pyroscope.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.pyroscope.serviceAccount.name }}
{{- end }}
{{- end }}
{{/*
Create a list of components that should be deployed.
*/}}
{{- define "pyroscope.components" -}}
{{- $full_name := (include "pyroscope.fullname" .) }}
{{- $components := dict }}
{{- if .Values.architecture.microservices.enabled }}
{{- if .Values.architecture.storage.v1 }}
{{- $components = mustMergeOverwrite (deepCopy $components) (.Values.architecture.microservices.v1 | default dict)}}
{{- end }}
{{- if .Values.architecture.storage.v2 }}
{{- $components = mustMergeOverwrite (deepCopy $components) (.Values.architecture.microservices.v2 | default dict)}}
{{- end }}
{{- end }}
{{- $components = mustMergeOverwrite (deepCopy $components) (.Values.pyroscope.components | default dict)}}
{{- range $k, $v := $components }}
{{- $v := set $v "name" (printf "%s-%s" $full_name $k) }}
{{$k}}: {{ $v | toJson }}
{{- end }}
{{/*
If no components are defined fall back to single binary statefulset
*/}}
{{- if eq (len $components) 0 }}
all: {kind: "StatefulSet", name: "{{$full_name}}"}
{{- end }}
{{- end }}
{{/*
Return the URL for sending profiles to Pyroscope.
*/}}
{{- define "pyroscope.write_url" -}}
{{- $components := (fromYaml (include "pyroscope.components" .)) -}}
{{- if .Values.architecture.deployUnifiedServices -}}
http://{{ include "pyroscope.fullname" . }}-write.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}
{{- else if hasKey $components "distributor" -}}
http://{{ include "pyroscope.fullname" . }}-distributor.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ ($components.distributor.service).port | default .Values.pyroscope.service.port}}
{{- else -}}
http://{{ include "pyroscope.fullname" . }}.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.service.port }}
{{- end }}
{{- end }}
{{/*
Return the URL for querying profiles from Pyroscope.
*/}}
{{- define "pyroscope.read_url" -}}
{{- $components := (fromYaml (include "pyroscope.components" .)) -}}
{{- if .Values.architecture.deployUnifiedServices -}}
http://{{ include "pyroscope.fullname" . }}-read.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}
{{- else if hasKey $components "query-frontend" -}}A
{{- $port := ((index $components "query-frontend").service).port | default .Values.pyroscope.service.port }}
http://{{ include "pyroscope.fullname" . }}-query-frontend.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ $port }}
{{- else -}}
http://{{ include "pyroscope.fullname" . }}.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.service.port }}
{{- end }}
{{- end }}
{{/*
Return the kubectl port-forward command for querying profiles from Pyroscope.
*/}}
{{- define "pyroscope.kubectl_port_forward_read" -}}
{{- $components := (fromYaml (include "pyroscope.components" .)) -}}
{{- if .Values.architecture.deployUnifiedServices -}}
kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "pyroscope.fullname" . }}-read {{ .Values.pyroscope.service.port }}:80
{{- else if hasKey $components "query-frontend" -}}
{{- $port := ((index $components "query-frontend").service).port | default .Values.pyroscope.service.port }}
kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "pyroscope.fullname" . }}-query-frontend {{ $port }}:{{ $port }}
{{- else -}}
kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "pyroscope.fullname" . }} {{ .Values.pyroscope.service.port }}:{{ .Values.pyroscope.service.port }}
{{- end }}
{{- end }}
{{- define "pyroscope.defaultAutoscalingComponents" -}}
enabled: false
minReplicas: 1
maxReplicas: 3
targetCPUUtilizationPercentage: 60
targetMemoryUtilizationPercentage: null
customMetrics: []
behavior:
enabled: false
scaleDown: {}
scaleUp: {}
{{- end }}
@@ -0,0 +1,190 @@
{{- /* Note this config file is depreacted, use the alloy one instead */}}
{{- if and (.Values.agent.enabled) (not .Values.agent.agent.configMap.create) }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.agent.agent.configMap.name }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
data:
config.river: |
logging {
level = "info"
format = "logfmt"
}
discovery.kubernetes "pyroscope_kubernetes" {
role = "pod"
}
// The default scrape config allows to define annotations based scraping.
//
// For example the following annotations:
//
// ```
// profiles.grafana.com/memory.scrape: "true"
// profiles.grafana.com/memory.port: "8080"
// profiles.grafana.com/cpu.scrape: "true"
// profiles.grafana.com/cpu.port: "8080"
// profiles.grafana.com/goroutine.scrape: "true"
// profiles.grafana.com/goroutine.port: "8080"
// ```
//
// will scrape the `memory`, `cpu` and `goroutine` profiles from the `8080` port of the pod.
//
// For more information see https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/helm/#optional-scrape-your-own-workloads-profiles
discovery.relabel "kubernetes_pods" {
targets = concat(discovery.kubernetes.pyroscope_kubernetes.targets)
rule {
action = "drop"
source_labels = ["__meta_kubernetes_pod_phase"]
regex = "Pending|Succeeded|Failed|Completed"
}
rule {
action = "labelmap"
regex = "__meta_kubernetes_pod_label_(.+)"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_namespace"]
target_label = "namespace"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_pod_name"]
target_label = "pod"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_pod_container_name"]
target_label = "container"
}
}
{{- $profileTypes := list "memory" "cpu" "goroutine" "block" "mutex" "fgprof" }}
{{- range $profileTypes }}
discovery.relabel "kubernetes_pods_{{.}}_default_name" {
targets = concat(discovery.relabel.kubernetes_pods.output)
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
action = "keep"
regex = "true"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
action = "keep"
regex = ""
}
rule {
source_labels = ["__meta_kubernetes_pod_container_port_number"]
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"
action = "keepequal"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
action = "replace"
regex = "(https?)"
target_label = "__scheme__"
replacement = "$1"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
action = "replace"
regex = "(.+)"
target_label = "__profile_path__"
replacement = "$1"
}
rule {
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
action = "replace"
regex = "(.+?)(?::\\d+)?;(\\d+)"
target_label = "__address__"
replacement = "$1:$2"
}
}
discovery.relabel "kubernetes_pods_{{.}}_custom_name" {
targets = concat(discovery.relabel.kubernetes_pods.output)
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
action = "keep"
regex = "true"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
action = "drop"
regex = ""
}
rule {
source_labels = ["__meta_kubernetes_pod_container_port_name"]
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"
action = "keepequal"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
action = "replace"
regex = "(https?)"
target_label = "__scheme__"
replacement = "$1"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
action = "replace"
regex = "(.+)"
target_label = "__profile_path__"
replacement = "$1"
}
rule {
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
action = "replace"
regex = "(.+?)(?::\\d+)?;(\\d+)"
target_label = "__address__"
replacement = "$1:$2"
}
}
pyroscope.scrape "pyroscope_scrape_{{.}}" {
clustering {
enabled = true
}
targets = concat(discovery.relabel.kubernetes_pods_{{.}}_default_name.output, discovery.relabel.kubernetes_pods_{{.}}_custom_name.output)
forward_to = [pyroscope.write.pyroscope_write.receiver]
profiling_config {
{{- $currentType := . -}}
{{- range $profileTypes }}
profile.{{if eq . "cpu"}}process_cpu{{else}}{{.}}{{end}} {
enabled = {{if eq . $currentType}}true{{else}}false{{end}}
}
{{- if ne . (last $profileTypes) }}{{ printf "\n" }}{{ end }}
{{- end }}
}
}
{{- end }}
pyroscope.write "pyroscope_write" {
endpoint {
url = "{{ include "pyroscope.write_url" . }}"
}
}
{{- end }}
@@ -0,0 +1,207 @@
{{- if and (.Values.alloy.enabled) (not .Values.alloy.alloy.configMap.create) }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.alloy.alloy.configMap.name }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
data:
config.alloy: |
logging {
level = "info"
format = "logfmt"
}
discovery.kubernetes "pyroscope_kubernetes" {
role = "pod"
}
// The default scrape config allows to define annotations based scraping.
//
// For example the following annotations:
//
// ```
// profiles.grafana.com/memory.scrape: "true"
// profiles.grafana.com/memory.port: "8080"
// profiles.grafana.com/cpu.scrape: "true"
// profiles.grafana.com/cpu.port: "8080"
// profiles.grafana.com/goroutine.scrape: "true"
// profiles.grafana.com/goroutine.port: "8080"
// ```
//
// will scrape the `memory`, `cpu` and `goroutine` profiles from the `8080` port of the pod.
//
// For more information see https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/helm/#optional-scrape-your-own-workloads-profiles
discovery.relabel "kubernetes_pods" {
targets = concat(discovery.kubernetes.pyroscope_kubernetes.targets)
rule {
action = "drop"
source_labels = ["__meta_kubernetes_pod_phase"]
regex = "Pending|Succeeded|Failed|Completed"
}
rule {
action = "labelmap"
regex = "__meta_kubernetes_pod_label_(.+)"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_namespace"]
target_label = "namespace"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_pod_name"]
target_label = "pod"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_pod_container_name"]
target_label = "container"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_service_repository"]
target_label = "service_repository"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_service_git_ref"]
target_label = "service_git_ref"
}
rule {
action = "replace"
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_service_root_path"]
target_label = "service_root_path"
}
}
{{- $profileTypes := list "memory" "cpu" "goroutine" "block" "mutex" "fgprof" }}
{{- range $profileTypes }}
discovery.relabel "kubernetes_pods_{{.}}_default_name" {
targets = concat(discovery.relabel.kubernetes_pods.output)
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
action = "keep"
regex = "true"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
action = "keep"
regex = ""
}
rule {
source_labels = ["__meta_kubernetes_pod_container_port_number"]
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"
action = "keepequal"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
action = "replace"
regex = "(https?)"
target_label = "__scheme__"
replacement = "$1"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
action = "replace"
regex = "(.+)"
target_label = "__profile_path__"
replacement = "$1"
}
rule {
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
action = "replace"
regex = "(.+?)(?::\\d+)?;(\\d+)"
target_label = "__address__"
replacement = "$1:$2"
}
}
discovery.relabel "kubernetes_pods_{{.}}_custom_name" {
targets = concat(discovery.relabel.kubernetes_pods.output)
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
action = "keep"
regex = "true"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
action = "drop"
regex = ""
}
rule {
source_labels = ["__meta_kubernetes_pod_container_port_name"]
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"
action = "keepequal"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
action = "replace"
regex = "(https?)"
target_label = "__scheme__"
replacement = "$1"
}
rule {
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
action = "replace"
regex = "(.+)"
target_label = "__profile_path__"
replacement = "$1"
}
rule {
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
action = "replace"
regex = "(.+?)(?::\\d+)?;(\\d+)"
target_label = "__address__"
replacement = "$1:$2"
}
}
pyroscope.scrape "pyroscope_scrape_{{.}}" {
clustering {
enabled = true
}
targets = concat(discovery.relabel.kubernetes_pods_{{.}}_default_name.output, discovery.relabel.kubernetes_pods_{{.}}_custom_name.output)
forward_to = [pyroscope.write.pyroscope_write.receiver]
profiling_config {
{{- $currentType := . -}}
{{- range $profileTypes }}
profile.{{if eq . "cpu"}}process_cpu{{else}}{{.}}{{end}} {
enabled = {{if eq . $currentType}}true{{else}}false{{end}}
}
{{- if ne . (last $profileTypes) }}{{ printf "\n" }}{{ end }}
{{- end }}
}
}
{{- end }}
pyroscope.write "pyroscope_write" {
endpoint {
url = "{{ include "pyroscope.write_url" . }}"
}
}
{{- end }}
@@ -0,0 +1,11 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "pyroscope.fullname" . }}-overrides-config
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
data:
overrides.yaml: |
overrides:
{{- toYaml .Values.pyroscope.tenantOverrides | nindent 6 }}
@@ -0,0 +1,10 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "pyroscope.fullname" . }}-config
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
data:
config.yaml: |
{{- tpl (mergeOverwrite (tpl .Values.pyroscope.config . | fromYaml) .Values.pyroscope.structuredConfig | toYaml) . | nindent 4 }}
@@ -0,0 +1,325 @@
{{- $global := . }}
{{- $components := (fromYaml (include "pyroscope.components" .)) }}
{{- $hasV1 := $global.Values.architecture.storage.v1 }}
{{- $hasV2 := $global.Values.architecture.storage.v2 }}
{{- $hasMetastore := hasKey $components "metastore" }}
{{- $hasQueryBackend := hasKey $components "query-backend" }}
{{- range $component, $cfg := $components }}
{{- with $global }}
{{- $values := mustMergeOverwrite (deepCopy .Values.pyroscope ) ($cfg | default dict)}}
{{- $extraArgs := mustMergeOverwrite (deepCopy .Values.pyroscope.extraArgs ) ($cfg.extraArgs | default dict)}}
{{- $isMetastore := or (and (eq $component "all") ($hasV2)) (eq $component "metastore") }}
---
apiVersion: apps/v1
kind: {{ $cfg.kind }}
metadata:
name: {{ $cfg.name }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
spec:
{{- if eq $values.kind "StatefulSet" }}
serviceName: {{ $values.name }}-headless
podManagementPolicy: Parallel
{{- end }}
{{- if and (hasKey $values "replicaCount") (not ($values.autoscaling).enabled) }}
replicas: {{ $values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "pyroscope.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: {{ $component | quote }}
template:
metadata:
annotations:
{{- if not (hasKey $values.podAnnotations "checksum/config") }}
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
{{- end }}
{{- if not (hasKey $values.podAnnotations "profiles.grafana.com/service_repository") }}
profiles.grafana.com/service_repository: "https://github.com/grafana/pyroscope"
{{- end }}
{{- if not (hasKey $values.podAnnotations "profiles.grafana.com/service_git_ref") }}
profiles.grafana.com/service_git_ref: "v{{ .Chart.AppVersion }}"
{{- end }}
{{- with $values.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "pyroscope.templateLabels" . | nindent 8 }}
app.kubernetes.io/component: {{ $component | quote }}
name: {{ if eq $component "all" }}"pyroscope"{{ else }}"{{ $component }}"{{ end }}
spec:
{{- with $values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "pyroscope.serviceAccountName" . }}
securityContext:
{{- toYaml $values.podSecurityContext | nindent 8 }}
{{- if hasKey $values "hostNetwork" }}
hostNetwork: {{ $values.hostNetwork }}
{{- end }}
{{- if hasKey $values "dnsPolicy" }}
dnsPolicy: {{ $values.dnsPolicy }}
{{- end }}
{{- with $values.initContainers }}
initContainers:
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- name: {{ if eq $component "all" }}"pyroscope"{{ else }}"{{ $component }}"{{ end }}
securityContext:
{{- toYaml $values.securityContext | nindent 12 }}
{{- $registry := $global.Values.global.imageRegistry | default $values.image.registry }}
image: "{{ if $registry }}{{ $registry }}/{{ end }}{{ $values.image.repository }}:{{ $values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ $values.image.pullPolicy }}
args:
- "-target={{ $component }}"
- "-self-profiling.disable-push={{ .Values.pyroscope.disableSelfProfile }}"
- "-server.http-listen-port={{ $values.service.port }}"
- "-memberlist.cluster-label={{ .Release.Namespace }}-{{ include "pyroscope.fullname" .}}{{if $global.Values.architecture.microservices.enabled}}{{$global.Values.architecture.microservices.clusterLabelSuffix}}{{end}}"
- "-memberlist.join=dns+{{ include "pyroscope.fullname" .}}-memberlist.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.memberlist.port }}"
- "-config.file=/etc/pyroscope/config.yaml"
- "-runtime-config.file=/etc/pyroscope/overrides/overrides.yaml"
{{- range $key, $value := $extraArgs }}
- "-{{ $key }}={{ $value }}"
{{- end }}
{{- /* When v2 and single binary is used we need to explicitly configure "filesystem" (TODO: This should be the default in v2) */}}
{{- if and $hasV2 (eq $component "all") }}
{{- if (not (hasKey $extraArgs "storage.backend")) }}
- "-storage.backend=filesystem"
{{- end }}
{{- end }}
{{- /* v2 specific options for all components */}}
{{- if $hasV2 }}
{{- if (not (hasKey $extraArgs "query-backend.address")) }}
- "-query-backend.address=dns:///_grpc._tcp.{{ include "pyroscope.fullname" . }}{{ if $hasQueryBackend }}-query-backend{{ end }}-headless.$(NAMESPACE_FQDN):{{ .Values.pyroscope.grpc.port }}"
{{- end }}
{{- if (not (hasKey $extraArgs "metastore.address")) }}
- "-metastore.address=kubernetes:///{{ include "pyroscope.fullname" . }}{{ if $hasMetastore }}-metastore{{ end }}-headless.$(NAMESPACE_FQDN):{{ .Values.pyroscope.grpc.port }}"
{{- end }}
{{- end }}
{{- /* metastore specific v2 migration config */}}
{{- if $isMetastore }}
{{- if (not (hasKey $extraArgs "metastore.raft.server-id")) }}
- "-metastore.raft.bind-address=:{{ .Values.pyroscope.metastore.port }}"
{{- end }}
{{- if (not (hasKey $extraArgs "metastore.raft.server-id")) }}
- "-metastore.raft.server-id=$(POD_NAME).$(PYROSCOPE_METASTORE_SERVICE)"
{{- end }}
{{- if (not (hasKey $extraArgs "metastore.raft.advertise-address")) }}
- "-metastore.raft.advertise-address=$(POD_NAME).$(PYROSCOPE_METASTORE_SERVICE)"
{{- end }}
{{- if (not (hasKey $extraArgs "metastore.raft.server-id")) }}
- "-metastore.raft.bootstrap-peers=dnssrvnoa+_raft._tcp.$(PYROSCOPE_METASTORE_SERVICE)"
{{- end }}
{{- end }}
{{- /* distributor specific v1/v2 migration config */}}
{{- if or (eq $component "all") (eq $component "distributor") }}
{{- if and $hasV2 (not (hasKey $extraArgs "write-path")) }}
{{- if $hasV1 }}
- "-write-path=combined"
{{- if not (hasKey $extraArgs "write-path.segment-writer-weight") }}
- "-write-path.segment-writer-weight=1"
{{- end }}
{{- else }}
- "-write-path=segment-writer"
{{- end }}
{{- end }}
{{- end }}
{{- /* query-frontend specific v1/v2 migration config */}}
{{- if or (eq $component "all") (eq $component "query-frontend") }}
{{- if and $hasV2 (not (hasKey $extraArgs "enable-query-backend")) }}
{{- if and $hasV1 $global.Values.architecture.storage.migration.queryBackend }}
- "-enable-query-backend=true"
{{- if and (not (hasKey $extraArgs "enable-query-backend-from")) $global.Values.architecture.storage.migration.queryBackendFrom }}
- "-enable-query-backend-from={{$global.Values.architecture.storage.migration.queryBackendFrom}}"
{{- end }}
{{- else }}
- "-enable-query-backend=true"
{{- end }}
{{- end }}
{{- end }}
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NAMESPACE_FQDN
value: "{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}"
{{- if and $hasV2 (not (hasKey $values.extraEnvVars "PYROSCOPE_V2_EXPERIMENT")) }}
- name: PYROSCOPE_V2_EXPERIMENT
value: "1"
{{- end }}
{{- if and $hasV2 (not (hasKey $values.extraEnvVars "PYROSCOPE_METASTORE_SERVICE")) }}
- name: PYROSCOPE_METASTORE_SERVICE
value: "{{ include "pyroscope.fullname" .}}{{ if $hasMetastore }}-metastore{{ end }}-headless.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.metastore.port }}"
{{- end }}
{{- with $values.extraEnvVars }}
{{- range $key, $value := . }}
- name: {{ $key }}
{{- if kindIs "map" $value }}
{{- toYaml $value | nindent 14 }}
{{- else }}
value: {{ $value | quote }}
{{- end }}
{{- end }}
{{- end }}
{{- with $values.extraCustomEnvVars }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with $values.extraEnvFrom }}
envFrom:
{{- toYaml . | nindent 12 }}
{{- end }}
ports:
- name: {{ $values.service.port_name }}
containerPort: {{ $values.service.port }}
protocol: TCP
- name: {{ $values.memberlist.port_name }}
containerPort: {{ $values.memberlist.port }}
protocol: TCP
{{- if $hasV2 }}
- name: {{ $values.grpc.port_name }}
containerPort: {{ $values.grpc.port }}
protocol: TCP
{{- end }}
{{- if $isMetastore }}
- name: {{ $values.metastore.port_name }}
containerPort: {{ $values.metastore.port }}
protocol: TCP
{{- end }}
readinessProbe:
httpGet:
path: /ready
port: {{ $values.service.port_name }}
scheme: {{ $values.service.scheme }}
{{- if ($values.readinessProbe).initialDelaySeconds }}
initialDelaySeconds: {{ $values.readinessProbe.initialDelaySeconds }}
{{- end }}
volumeMounts:
- name: config
mountPath: /etc/pyroscope/config.yaml
subPath: config.yaml
- name: overrides-config
mountPath: /etc/pyroscope/overrides/
- name: data
mountPath: /data
{{- if eq $component "compactor" }}
subPath: default
- name: data
mountPath: /data-compactor
subPath: compactor
{{- end }}
{{- if (and $hasV2 $values.persistence.shared.enabled) }}
- name: data
mountPath: /data-shared
subPath: {{ $values.persistence.shared.subPath }}
{{- end }}
{{- if $isMetastore }}
- name: data
mountPath: /data-metastore
subPath: {{ $values.persistence.metastore.subPath }}
{{- end }}
{{- with $values.extraVolumeMounts }}
{{- toYaml . | nindent 12 }}
{{- end }}
resources:
{{- if $global.Values.architecture.overwriteResources }}
{{- toYaml $global.Values.architecture.overwriteResources | nindent 12 }}
{{- else }}
{{- toYaml $values.resources | nindent 12 }}
{{- end }}
{{- with $values.extraContainers }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $values.topologySpreadConstraints }}
topologySpreadConstraints:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- if hasKey $values "priorityClassName" }}
priorityClassName: {{ $values.priorityClassName | quote }}
{{- end }}
{{- if $values.terminationGracePeriodSeconds }}
terminationGracePeriodSeconds: {{ $values.terminationGracePeriodSeconds }}
{{- end }}
volumes:
{{- with $values.extraVolumes }}
{{- toYaml . | nindent 8 }}
{{- end }}
- name: config
configMap:
name: {{ include "pyroscope.fullname" . }}-config
- name: overrides-config
configMap:
name: {{ include "pyroscope.fullname" . }}-overrides-config
{{- $persistence := $values.persistence }}
{{- if not $persistence.enabled }}
- name: data
emptyDir: {}
{{- else if $persistence.existingClaim}}
- name: data
persistentVolumeClaim:
claimName: {{ $persistence.existingClaim }}
{{- else if ne $cfg.kind "StatefulSet"}}
- name: data
persistentVolumeClaim:
claimName: {{ $cfg.name }}-data
{{- else }}
volumeClaimTemplates:
- metadata:
name: data
annotations:
{{- toYaml $persistence.annotations | nindent 8 }}
spec:
accessModes:
{{- toYaml $persistence.accessModes | nindent 8 }}
resources:
requests:
storage: {{ $persistence.size | quote }}
storageClassName: {{ $persistence.storageClassName }}
{{- if $persistence.selector }}
selector:
{{- toYaml $persistence.selector | nindent 8 }}
{{- end }}
{{- with $persistence.extraVolumeClaimTemplates }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- end }}
---
{{- $pdb := $values.podDisruptionBudget }}
{{- if $pdb.enabled }}
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: {{ $cfg.name }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
spec:
{{- if hasKey $pdb "minAvailable" }}
minAvailable: {{ $pdb.minAvailable }}
{{- else }}
maxUnavailable: {{ $pdb.maxUnavailable }}
{{- end }}
selector:
matchLabels:
{{- include "pyroscope.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: {{ $component | quote }}
{{- end }}
{{- end }}
{{- end }}
@@ -0,0 +1,54 @@
{{- $global := . }}
{{- range $component, $cfg := (fromYaml (include "pyroscope.components" .)) }}
{{- with $global }}
{{- $autoScalingValues := mergeOverwrite (fromYaml (include "pyroscope.defaultAutoscalingComponents" .)) ($cfg.autoscaling | default dict) }}
{{- if $autoScalingValues.enabled }}
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ $cfg.name }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: {{ $cfg.kind }}
name: {{ $cfg.name }}
minReplicas: {{ $autoScalingValues.minReplicas }}
maxReplicas: {{ $autoScalingValues.maxReplicas }}
metrics:
{{- with $autoScalingValues.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ . }}
{{- end }}
{{- with $autoScalingValues.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ . }}
{{- end }}
{{- with $autoScalingValues.customMetrics }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- if $autoScalingValues.behavior.enabled }}
behavior:
{{- with $autoScalingValues.behavior.scaleDown }}
scaleDown: {{ toYaml . | nindent 6 }}
{{- end }}
{{- with $autoScalingValues.behavior.scaleUp }}
scaleUp: {{ toYaml . | nindent 6 }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
@@ -0,0 +1,118 @@
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "pyroscope.fullname" . }}-ingress
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
{{- with .Values.ingress.labels }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- with .Values.ingress.className }}
ingressClassName: {{ . }}
{{- end }}
{{- with .Values.ingress.tls }}
tls:
{{- toYaml . | nindent 4 }}
{{- end }}
rules:
{{- range $.Values.ingress.hosts }}
- host: {{ . | quote }}
http:
paths:
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-query-frontend
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /
pathType: {{ $.Values.ingress.pathType }}
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-query-frontend
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /querier.v1.QuerierService/
pathType: {{ $.Values.ingress.pathType }}
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-query-frontend
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /render
pathType: {{ $.Values.ingress.pathType }}
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-query-frontend
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /render-diff
pathType: {{ $.Values.ingress.pathType }}
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-distributor
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /push.v1.PusherService/
pathType: {{ $.Values.ingress.pathType }}
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-distributor
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /ingest
pathType: {{ $.Values.ingress.pathType }}
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-tenant-settings
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /settings.v1.SettingsService/
pathType: {{ $.Values.ingress.pathType }}
- backend:
service:
{{- if gt (len $.Values.pyroscope.components) 1}}
name: {{ include "pyroscope.fullname" $ }}-ad-hoc-profiles
{{- else }}
name: {{ include "pyroscope.fullname" $ }}
{{- end }}
port:
number: {{ $.Values.pyroscope.service.port }}
path: /adhocprofiles.v1.AdHocProfileService/
pathType: {{ $.Values.ingress.pathType }}
{{- end }}
{{- end }}
@@ -0,0 +1,20 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "pyroscope.fullname" . }}-memberlist
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
spec:
type: ClusterIP
clusterIP: None
ports:
- name: {{ .Values.pyroscope.memberlist.port_name }}
port: {{ .Values.pyroscope.memberlist.port }}
protocol: TCP
targetPort: {{ .Values.pyroscope.memberlist.port }}
publishNotReadyAddresses: true
selector:
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
# TODO: Ensure only services that offer memberlist register
# pyroscope.grafana.com/memberlist: "true"
@@ -0,0 +1,38 @@
{{- $hasV2 := .Values.architecture.storage.v2 }}
{{- if $hasV2 }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ template "pyroscope.fullname" . }}-discovery
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
rules:
- apiGroups:
- ""
- discovery.k8s.io
resources:
- endpointslices
- endpoints
- services
- pods
verbs:
- get
- watch
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ template "pyroscope.fullname" . }}-discovery
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ template "pyroscope.fullname" . }}-discovery
subjects:
- kind: ServiceAccount
name: {{ include "pyroscope.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
{{- end }}
@@ -0,0 +1,13 @@
{{- if .Values.pyroscope.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "pyroscope.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
{{- with .Values.pyroscope.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
@@ -0,0 +1,69 @@
{{- if .Values.serviceMonitor.enabled }}
{{- $global := . }}
{{- $serviceMonitor := .Values.serviceMonitor }}
{{- range $component, $cfg := (fromYaml (include "pyroscope.components" .)) }}
{{- with $global }}
{{- $values := mustMergeOverwrite (deepCopy .Values.pyroscope ) ($cfg | default dict)}}
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: {{ $cfg.name }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
{{- with $serviceMonitor.labels }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- with $serviceMonitor.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- with $serviceMonitor.namespaceSelector }}
namespaceSelector:
{{- toYaml . | nindent 4 }}
{{- end }}
selector:
matchLabels:
{{- include "pyroscope.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: {{ $component | quote }}
matchExpressions:
- key: prometheus.io/service-monitor
operator: NotIn
values:
- "false"
{{- with $serviceMonitor.matchExpressions }}
{{- toYaml . | nindent 6 }}
{{- end }}
endpoints:
- port: {{ $values.service.port_name }}
{{- with $serviceMonitor.interval }}
interval: {{ . }}
{{- end }}
{{- with $serviceMonitor.scrapeTimeout }}
scrapeTimeout: {{ . }}
{{- end }}
{{- with $serviceMonitor.relabelings }}
relabelings:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $serviceMonitor.metricRelabelings }}
metricRelabelings:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $serviceMonitor.scheme }}
scheme: {{ . }}
{{- end }}
{{- with $serviceMonitor.tlsConfig }}
tlsConfig:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $serviceMonitor.targetLabels }}
targetLabels:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
@@ -0,0 +1,94 @@
{{- $global := . }}
{{- $components := (fromYaml (include "pyroscope.components" .)) }}
{{- $hasV2 := $global.Values.architecture.storage.v2 }}
{{- range $component, $cfg := $components }}
{{- with $global }}
{{- $values := mustMergeOverwrite (deepCopy .Values.pyroscope ) ($cfg | default dict)}}
{{- $isMetastore := or (and (eq $component "all") ($hasV2)) (eq $component "metastore") }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ $cfg.name }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
{{- if $values.service.annotations }}
annotations:
{{- toYaml $values.service.annotations | nindent 4 }}
{{- end }}
spec:
type: {{ $values.service.type }}
ports:
- port: {{ $values.service.port }}
targetPort: {{ $values.service.port_name }}
protocol: TCP
name: {{ $values.service.port_name }}
{{- if $hasV2 }}
- port: {{ $values.grpc.port }}
targetPort: {{ $values.grpc.port_name }}
protocol: TCP
name: {{ $values.grpc.port_name }}
{{- end }}
{{- if $isMetastore }}
- port: {{ $values.metastore.port }}
targetPort: {{ $values.metastore.port_name }}
protocol: TCP
name: {{ $values.metastore.port_name }}
{{- end }}
{{- with $values.service.extraPorts }}
{{- toYaml . | nindent 4 }}
{{- end }}
selector:
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ $cfg.name }}-headless
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
{{- if or .Values.serviceMonitor.enabled $values.service.headlessAnnotations }}
annotations:
{{- if .Values.serviceMonitor.enabled }}
prometheus.io/service-monitor: "false"
{{- end }}
{{- with $values.service.headlessAnnotations }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
spec:
type: ClusterIP
clusterIP: None
ports:
- port: {{ $values.service.port }}
targetPort: {{ $values.service.port_name }}
protocol: TCP
name: {{ $values.service.port_name }}
{{- if $hasV2 }}
- port: {{ $values.grpc.port }}
targetPort: {{ $values.grpc.port_name }}
protocol: TCP
name: {{ $values.grpc.port_name }}
{{- end }}
{{- if $isMetastore }}
- port: {{ $values.metastore.port }}
targetPort: {{ $values.metastore.port_name }}
protocol: TCP
name: {{ $values.metastore.port_name }}
{{- end }}
{{- with $values.service.extraPorts }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- if or $values.service.publishNotReadyAddresses $isMetastore }}
publishNotReadyAddresses: true
{{- end }}
selector:
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
app.kubernetes.io/component: {{ $component | quote }}
{{- end }}
{{- end }}
@@ -0,0 +1,47 @@
{{- $global := . }}
{{- $components := (fromYaml (include "pyroscope.components" .)) }}
{{- if $global.Values.architecture.deployUnifiedServices }}
{{- /* There services are useful wanting to switch from single binary to microservices without reconfiguring the endpoints */}}
{{- $hasDistributor := hasKey $components "distributor" }}
{{- $hasQueryFrontend := hasKey $components "query-frontend" }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-write
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
spec:
type: "ClusterIP"
ports:
- port: 80
targetPort: {{ .Values.pyroscope.service.port_name }}
protocol: TCP
name: {{ .Values.pyroscope.service.port_name }}
selector:
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
{{- if $hasDistributor }}
app.kubernetes.io/component: distributor
{{- end }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-read
namespace: {{ .Release.Namespace }}
labels:
{{- include "pyroscope.labels" . | nindent 4 }}
spec:
type: "ClusterIP"
ports:
- port: 80
targetPort: {{ .Values.pyroscope.service.port_name }}
protocol: TCP
name: {{ .Values.pyroscope.service.port_name }}
selector:
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
{{- if $hasQueryFrontend }}
app.kubernetes.io/component: query-frontend
{{- end }}
{{- end }}