Add VictoriaMetrics observability stack + sync catalog for monitoring test

- VM stack 10 charts: victoria-metrics-cluster/auth, victoria-logs-cluster,
  victoria-metrics-agent/alert, opentelemetry-collector, kube-state-metrics,
  prometheus-node-exporter, alertmanager, perses (JWT/OIDC, Infisical-ready)
- ArgoCD ApplicationSet (syncWave) + per-chart dip-values overlays
- doc/victoria-metrics-architecture.md, define-chart-resources updates
- includes pending working-tree changes (mlflow, kubeflow, apisix, CLAUDE.md)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
wbsong111
2026-06-25 11:10:51 +09:00
parent a55427730e
commit 6290322f1b
514 changed files with 68103 additions and 40 deletions
@@ -0,0 +1,90 @@
{{/* ========================================================================
Configuration helpers
========================================================================= */}}
{{/*
Return env vars generated from authentication providers for client_id/client_secret.
We include entries even when the value is empty so they can be sourced from an external Secret.
NOTE: When using external secrets (secret.create=false or envVarsExternalSecretName),
this should return empty to avoid duplicate secret creation.
*/}}
{{- define "perses.authProviderEnvVars" -}}
{{- $result := list }}
{{- $usingExternalSecret := or (and .Values.secret (not (default true .Values.secret.create))) .Values.envVarsExternalSecretName }}
{{- if not $usingExternalSecret }}
{{- $auth := .Values.config.security.authentication }}
{{- if and .Values.config.security.enable_auth $auth }}
{{- range $i, $provider := $auth.providers.oidc }}
{{- $result = append $result (dict "name" (printf "PERSES_SECURITY_AUTHENTICATION_PROVIDERS_OIDC_%d_CLIENT_ID" $i) "value" ($provider.client_id | default "")) }}
{{- $result = append $result (dict "name" (printf "PERSES_SECURITY_AUTHENTICATION_PROVIDERS_OIDC_%d_CLIENT_SECRET" $i) "value" ($provider.client_secret | default "")) }}
{{- end }}
{{- range $i, $provider := $auth.providers.oauth }}
{{- $result = append $result (dict "name" (printf "PERSES_SECURITY_AUTHENTICATION_PROVIDERS_OAUTH_%d_CLIENT_ID" $i) "value" ($provider.client_id | default "")) }}
{{- $result = append $result (dict "name" (printf "PERSES_SECURITY_AUTHENTICATION_PROVIDERS_OAUTH_%d_CLIENT_SECRET" $i) "value" ($provider.client_secret | default "")) }}
{{- end }}
{{- end }}
{{- end }}
{{- toYaml $result }}
{{- end }}
{{/*
Merge user-provided envVars with auto-generated auth provider env vars.
Auto-generated env vars are only added if not already provided by the user.
*/}}
{{- define "perses.mergedEnvVars" -}}
{{- $autoRaw := include "perses.authProviderEnvVars" . }}
{{- $auto := $autoRaw | fromYamlArray | default (list) }}
{{- $userRaw := .Values.envVars | default (list) }}
{{- $user := (kindIs "slice" $userRaw | ternary $userRaw (list $userRaw)) }}
{{- /* Build a map of user-provided env var names for deduplication */ -}}
{{- $userEnvNames := dict }}
{{- range $user }}
{{- if and (kindIs "map" .) (hasKey . "name") }}
{{- $_ := set $userEnvNames .name true }}
{{- end }}
{{- end }}
{{- /* Only add auto-generated env vars if not already provided by user */ -}}
{{- $filteredAuto := list }}
{{- range $auto }}
{{- if and (kindIs "map" .) (hasKey . "name") }}
{{- if not (hasKey $userEnvNames .name) }}
{{- $filteredAuto = append $filteredAuto . }}
{{- end }}
{{- end }}
{{- end }}
{{- $merged := concat $user $filteredAuto }}
{{- if $merged }}
{{- toYaml $merged }}
{{- else }}
[]
{{- end }}
{{- end }}
{{/*
Resolve env vars Secret name (generated or custom override).
*/}}
{{- define "perses.envVarsSecretName" -}}
{{- $name := "" }}
{{- if and .Values.secret .Values.secret.name }}
{{- $name = .Values.secret.name }}
{{- else if .Values.envVarsExternalSecretName }}
{{- $name = .Values.envVarsExternalSecretName }}
{{- else }}
{{- $name = (include "perses.fullname" .) }}
{{- end }}
{{- $name }}
{{- end }}
{{/*
Should we create the env vars Secret?
*/}}
{{- define "perses.shouldCreateEnvVarsSecret" -}}
{{- $create := true }}
{{- if hasKey .Values "secret" }}
{{- if hasKey .Values.secret "create" }}
{{- $create = .Values.secret.create }}
{{- end }}
{{- end }}
{{- $shouldCreate := and $create (not .Values.envVarsExternalSecretName) }}
{{- if $shouldCreate }}true{{- else }}false{{- end }}
{{- end }}
@@ -0,0 +1,75 @@
{{/* ========================================================================
Naming & identity helpers
========================================================================= */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "perses.name" -}}
{{- default .Chart.Name .Values.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 "perses.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.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 "perses.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "perses.labels" -}}
helm.sh/chart: {{ include "perses.chart" . }}
{{ include "perses.selectorLabels" . }}
app.kubernetes.io/version: {{ default .Chart.AppVersion .Values.image.version }}
app.kubernetes.io/part-of: {{ include "perses.name" . }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- if not (empty .Values.additionalLabels) }}
{{ toYaml .Values.additionalLabels }}
{{- end }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "perses.selectorLabels" -}}
app.kubernetes.io/name: {{ include "perses.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "perses.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "perses.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
{{/*
Render an internal DNS endpoint for the Perses service.
*/}}
{{- define "perses.dns" -}}
http://{{ include "perses.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.service.targetPort }}
{{- end -}}