added repo
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
apiVersion: v2
|
||||
name: grafana-mcp
|
||||
version: 2.0.0
|
||||
# renovate: docker=docker.io/grafana/mcp-grafana
|
||||
appVersion: 0.11.2
|
||||
kubeVersion: "^1.25.0-0"
|
||||
description: MCP server for Grafana — Meesho fork with Contour HTTPProxy + ExternalSecret.
|
||||
home: https://grafana.com
|
||||
icon: https://artifacthub.io/image/b4fed1a7-6c8f-4945-b99d-096efa3e4116
|
||||
sources:
|
||||
- https://github.com/grafana/mcp-grafana
|
||||
- https://github.com/grafana-community/helm-charts
|
||||
annotations:
|
||||
"artifacthub.io/license": Apache-2.0
|
||||
"artifacthub.io/links": |
|
||||
- name: Chart Source
|
||||
url: https://github.com/grafana-community/helm-charts
|
||||
- name: Upstream Project
|
||||
url: https://github.com/grafana/mcp-grafana
|
||||
maintainers:
|
||||
- name: Mohammad Abubaker
|
||||
email: sheikhabubaker761@gmail.com
|
||||
url: https://github.com/Sheikh-Abubaker
|
||||
- name: Jan-Otto Kröpke
|
||||
email: github@jkroepke.de
|
||||
url: https://github.com/jkroepke
|
||||
- name: Aviv Guiser
|
||||
email: avivguiser@gmail.com
|
||||
url: https://github.com/KyriosGN0
|
||||
- name: Quentin Bisson
|
||||
email: quentin.bisson@gmail.com
|
||||
url: https://github.com/QuentinBisson
|
||||
type: application
|
||||
keywords:
|
||||
- monitoring
|
||||
- mcp
|
||||
@@ -0,0 +1,51 @@
|
||||
# grafana-mcp Helm Chart
|
||||
|
||||
MCP server for Grafana.
|
||||
|
||||
## Source Code
|
||||
|
||||
* <https://github.com/grafana/mcp-grafana>
|
||||
|
||||
## Requirements
|
||||
|
||||
Kubernetes: `^1.25.0-0`
|
||||
|
||||
## Installing the Chart
|
||||
|
||||
### OCI Registry
|
||||
|
||||
OCI registries are preferred in Helm as they implement unified storage, distribution, and improved security.
|
||||
|
||||
```console
|
||||
helm install RELEASE-NAME oci://ghcr.io/grafana-community/helm-charts/grafana-mcp
|
||||
```
|
||||
|
||||
### HTTP Registry
|
||||
|
||||
```console
|
||||
helm repo add grafana-community https://grafana-community.github.io/helm-charts
|
||||
helm repo update
|
||||
helm install --set grafana.apiKey=<Grafana_ApiKey> RELEASE-NAME grafana-community/grafana-mcp
|
||||
```
|
||||
|
||||
## Uninstalling the Chart
|
||||
|
||||
To remove all of the Kubernetes objects associated with the Helm chart release:
|
||||
|
||||
```console
|
||||
helm delete RELEASE-NAME
|
||||
```
|
||||
|
||||
## Changelog
|
||||
|
||||
See the [changelog](https://grafana-community.github.io/helm-charts/changelog/?chart=grafana-mcp).
|
||||
|
||||
---
|
||||
|
||||
## Upgrading
|
||||
|
||||
A major chart version change indicates that there is an incompatible breaking change needing manual actions.
|
||||
|
||||
### From Chart versions < 0.1.3
|
||||
If you are upgrading from a chart version older than 0.1.3, we have changed the image to be pulled from
|
||||
`grafana/mcp-grafana` instead of `mcp/grafana` and the default tag to be the chart's appVersion instead of `latest`.
|
||||
@@ -0,0 +1,2 @@
|
||||
grafana:
|
||||
apiKey: "test"
|
||||
@@ -0,0 +1,19 @@
|
||||
grafana:
|
||||
apiKey: "test"
|
||||
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/instance: grafana-test
|
||||
app.kubernetes.io/name: grafana
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
weight: 100
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/instance: grafana-test
|
||||
app.kubernetes.io/name: grafana
|
||||
topologyKey: kubernetes.io/hostname
|
||||
@@ -0,0 +1,90 @@
|
||||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "grafana-mcp.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 "grafana-mcp.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 "grafana-mcp.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account
|
||||
*/}}
|
||||
{{- define "grafana-mcp.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "grafana-mcp.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "grafana-mcp.namespace" -}}
|
||||
{{- if .Values.namespaceOverride }}
|
||||
{{- .Values.namespaceOverride }}
|
||||
{{- else }}
|
||||
{{- .Release.Namespace }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "grafana-mcp.labels" -}}
|
||||
helm.sh/chart: {{ include "grafana-mcp.chart" . }}
|
||||
{{ include "grafana-mcp.selectorLabels" . }}
|
||||
{{- if or .Chart.AppVersion .Values.image.tag }}
|
||||
app.kubernetes.io/version: {{ mustRegexReplaceAllLiteral "@sha.*" .Values.image.tag "" | default .Chart.AppVersion | trunc 63 | trimSuffix "-" | quote }}
|
||||
{{- end }}
|
||||
{{- with .Values.extraLabels }}
|
||||
{{ toYaml . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "grafana-mcp.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "grafana-mcp.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
|
||||
{{/*
|
||||
Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific imagePullSecrets})
|
||||
*/}}
|
||||
{{- define "grafana.imagePullSecrets" -}}
|
||||
{{- $root := .root }}
|
||||
{{- range (concat .root.Values.global.imagePullSecrets .imagePullSecrets) }}
|
||||
{{- if eq (typeOf .) "map[string]interface {}" }}
|
||||
- {{ toYaml (dict "name" (tpl .name $root)) | trim }}
|
||||
{{- else }}
|
||||
- name: {{ tpl . $root }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,190 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "grafana-mcp.fullname" . }}
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
{{- with .Values.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicas }}
|
||||
revisionHistoryLimit: {{ .Values.revisionHistoryLimit | default 10 }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "grafana-mcp.selectorLabels" . | nindent 6 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
{{- with .Values.deploymentStrategy }}
|
||||
strategy:
|
||||
{{- toYaml . | trim | nindent 4 }}
|
||||
{{- end }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "grafana-mcp.selectorLabels" . | nindent 8 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
{{- with .Values.podAnnotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "grafana-mcp.serviceAccountName" . }}
|
||||
automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
|
||||
{{- with .Values.hostAliases }}
|
||||
hostAliases:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.securityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.priorityClassName }}
|
||||
priorityClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.schedulerName }}
|
||||
schedulerName: {{ . }}
|
||||
{{- end }}
|
||||
{{- if or .Values.initContainers .Values.extraInitContainers }}
|
||||
initContainers:
|
||||
{{- with .Values.initContainers }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.extraInitContainers }}
|
||||
{{- tpl (toYaml .) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: mcp-grafana
|
||||
{{- $registry := .Values.image.registry -}}
|
||||
{{- if $registry }}
|
||||
image: "{{ $registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||
{{- else }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||
{{- end }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
{{- with .Values.readinessProbe }}
|
||||
readinessProbe:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.livenessProbe }}
|
||||
livenessProbe:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.startupProbe }}
|
||||
startupProbe:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: mcp-http
|
||||
containerPort: {{ .Values.service.port }}
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: GRAFANA_URL
|
||||
value: {{ .Values.grafana.url | quote }}
|
||||
{{- if or .Values.grafana.apiKey .Values.grafana.apiKeySecret.name }}
|
||||
- name: GRAFANA_SERVICE_ACCOUNT_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
{{- if .Values.grafana.apiKey }}
|
||||
name: {{ include "grafana-mcp.fullname" . }}
|
||||
key: api-key
|
||||
{{- else }}
|
||||
name: {{ .Values.grafana.apiKeySecret.name }}
|
||||
key: {{ .Values.grafana.apiKeySecret.key }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- range $key, $value := .Values.env }}
|
||||
- name: {{ $key | quote }}
|
||||
value: {{ $value | quote }}
|
||||
{{- end }}
|
||||
{{- range $key, $value := .Values.envValueFrom }}
|
||||
- name: {{ $key | quote }}
|
||||
valueFrom:
|
||||
{{- toYaml $value | nindent 16 }}
|
||||
{{- end }}
|
||||
{{- with .Values.envFrom }}
|
||||
envFrom:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if or (.Values.debug) (.Values.metrics.enabled) (.Values.disabledCategories) (.Values.extraArgs) }}
|
||||
args:
|
||||
{{- if .Values.debug }}
|
||||
- -debug
|
||||
{{- end }}
|
||||
{{- if .Values.metrics.enabled }}
|
||||
- --metrics
|
||||
{{- end }}
|
||||
{{- range .Values.disabledCategories }}
|
||||
- --disable-{{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.extraArgs }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- else -}}
|
||||
{{- with .Values.extraArgs }}
|
||||
args:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.lifecycle }}
|
||||
lifecycle:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.resources }}
|
||||
resources:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
volumeMounts:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.extraContainers }}
|
||||
{{- tpl (toYaml .) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
volumes:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.dnsPolicy }}
|
||||
dnsPolicy: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.dnsConfig }}
|
||||
dnsConfig:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,27 @@
|
||||
{{- if .Values.externalSecret.enabled }}
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: {{ .Values.externalSecret.secretName | default (printf "%s-vault" (include "grafana-mcp.fullname" .)) }}
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
argocd.argoproj.io/sync-wave: "-5"
|
||||
spec:
|
||||
refreshInterval: {{ .Values.externalSecret.refreshInterval | default "0" | quote }}
|
||||
secretStoreRef:
|
||||
kind: ClusterSecretStore
|
||||
name: {{ .Values.externalSecret.secretStoreRef | default "vault-backend" }}
|
||||
target:
|
||||
name: {{ .Values.externalSecret.secretName | default (printf "%s-vault" (include "grafana-mcp.fullname" .)) }}
|
||||
creationPolicy: Owner
|
||||
deletionPolicy: Retain
|
||||
dataFrom:
|
||||
- extract:
|
||||
conversionStrategy: Default
|
||||
key: {{ .Values.externalSecret.path }}
|
||||
{{- with .Values.externalSecret.version }}
|
||||
version: {{ . | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,36 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- if .Values.createContourGateway -}}
|
||||
{{- if or (eq "contour-internal" .Values.ingress.ingressClassName) (eq "contour-external" .Values.ingress.ingressClassName) (eq "contour-internal-0" .Values.ingress.ingressClassName) (eq "contour-internal-1" .Values.ingress.ingressClassName) (eq "contour-external-0" .Values.ingress.ingressClassName) (eq "contour-external-1" .Values.ingress.ingressClassName) }}
|
||||
{{- $serviceName := include "grafana-mcp.fullname" . -}}
|
||||
{{- $servicePortNumber := .Values.ingress.servicePortNumber | default .Values.service.port -}}
|
||||
apiVersion: projectcontour.io/v1
|
||||
kind: HTTPProxy
|
||||
metadata:
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
name: {{ $serviceName }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
projectcontour.io/ingress.class: {{ .Values.ingress.ingressClassName }}
|
||||
spec:
|
||||
ingressClassName: {{ .Values.ingress.ingressClassName }}
|
||||
routes:
|
||||
- services:
|
||||
- name: {{ $serviceName }}
|
||||
port: {{ $servicePortNumber }}
|
||||
{{- if .Values.ingress.slowStart.enabled }}
|
||||
slowStartPolicy:
|
||||
window: {{ .Values.ingress.slowStart.window }}
|
||||
aggression: {{ .Values.ingress.slowStart.aggression | float64 | squote }}
|
||||
minWeightPercent: {{ .Values.ingress.slowStart.minPercent }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.enableWebsocket }}
|
||||
enableWebsockets: true
|
||||
{{- end }}
|
||||
{{- if .Values.contourResponseTimeout }}
|
||||
timeoutPolicy:
|
||||
response: {{ .Values.contourResponseTimeout | quote }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,46 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- if .Values.createContourGateway -}}
|
||||
{{- if or (eq "contour-internal" .Values.ingress.ingressClassName) (eq "contour-internal-0" .Values.ingress.ingressClassName) (eq "contour-internal-1" .Values.ingress.ingressClassName) }}
|
||||
{{- $serviceName := include "grafana-mcp.fullname" . -}}
|
||||
{{- $servicePortNumber := .Values.ingress.servicePortNumber | default .Values.service.port -}}
|
||||
|
||||
{{- $intraIngressClass := "" -}}
|
||||
{{- if eq .Values.ingress.ingressClassName "contour-internal" -}}
|
||||
{{- $intraIngressClass = "contour-internal-intra" -}}
|
||||
{{- else if eq .Values.ingress.ingressClassName "contour-internal-0" -}}
|
||||
{{- $intraIngressClass = "contour-internal-intra-0" -}}
|
||||
{{- else if eq .Values.ingress.ingressClassName "contour-internal-1" -}}
|
||||
{{- $intraIngressClass = "contour-internal-intra-1" -}}
|
||||
{{- end -}}
|
||||
|
||||
apiVersion: projectcontour.io/v1
|
||||
kind: HTTPProxy
|
||||
metadata:
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
name: {{ $serviceName }}-intra
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
projectcontour.io/ingress.class: {{ $intraIngressClass }}
|
||||
spec:
|
||||
ingressClassName: {{ $intraIngressClass }}
|
||||
routes:
|
||||
- services:
|
||||
- name: {{ $serviceName }}
|
||||
port: {{ $servicePortNumber }}
|
||||
{{- if .Values.ingress.slowStart.enabled }}
|
||||
slowStartPolicy:
|
||||
window: {{ .Values.ingress.slowStart.window }}
|
||||
aggression: {{ .Values.ingress.slowStart.aggression | float64 | squote }}
|
||||
minWeightPercent: {{ .Values.ingress.slowStart.minPercent }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.enableWebsocket }}
|
||||
enableWebsockets: true
|
||||
{{- end }}
|
||||
{{- if .Values.contourResponseTimeout }}
|
||||
timeoutPolicy:
|
||||
response: {{ .Values.contourResponseTimeout | quote }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,48 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- if .Values.createContourGateway -}}
|
||||
{{- if or (eq "contour-internal" .Values.ingress.ingressClassName) (eq "contour-internal-0" .Values.ingress.ingressClassName) (eq "contour-internal-1" .Values.ingress.ingressClassName) }}
|
||||
{{- $serviceName := include "grafana-mcp.fullname" . -}}
|
||||
{{- $namespace := include "grafana-mcp.namespace" . -}}
|
||||
|
||||
{{- $intraIngressClass := "" -}}
|
||||
{{- if eq .Values.ingress.ingressClassName "contour-internal" -}}
|
||||
{{- $intraIngressClass = "contour-internal-intra" -}}
|
||||
{{- else if eq .Values.ingress.ingressClassName "contour-internal-0" -}}
|
||||
{{- $intraIngressClass = "contour-internal-intra-0" -}}
|
||||
{{- else if eq .Values.ingress.ingressClassName "contour-internal-1" -}}
|
||||
{{- $intraIngressClass = "contour-internal-intra-1" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ $count := 0 | int }}
|
||||
{{- range .Values.ingress.hosts }}
|
||||
apiVersion: projectcontour.io/v1
|
||||
kind: HTTPProxy
|
||||
metadata:
|
||||
namespace: {{ $namespace }}
|
||||
name: {{ $serviceName }}-intra-{{ $count }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" $ | nindent 4 }}
|
||||
annotations:
|
||||
projectcontour.io/ingress.class: {{ $intraIngressClass }}
|
||||
spec:
|
||||
ingressClassName: {{ $intraIngressClass }}
|
||||
virtualhost:
|
||||
fqdn: "{{ .host }}"
|
||||
includes:
|
||||
{{- range .paths }}
|
||||
- conditions:
|
||||
{{- if or (eq (lower .pathType) "prefix") (eq (lower .pathType) "implementationspecific") }}
|
||||
- prefix: {{ .path }}
|
||||
{{- end }}
|
||||
{{- if eq (lower .pathType) "exact" }}
|
||||
- exact: {{ .path }}
|
||||
{{- end }}
|
||||
name: {{ $serviceName }}-intra
|
||||
namespace: {{ $namespace }}
|
||||
{{- end }}
|
||||
---
|
||||
{{ $count = add1 $count }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,39 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- if .Values.createContourGateway -}}
|
||||
{{- if or (eq "contour-internal" .Values.ingress.ingressClassName) (eq "contour-external" .Values.ingress.ingressClassName) (eq "contour-internal-0" .Values.ingress.ingressClassName) (eq "contour-internal-1" .Values.ingress.ingressClassName) (eq "contour-external-0" .Values.ingress.ingressClassName) (eq "contour-external-1" .Values.ingress.ingressClassName) }}
|
||||
{{- $serviceName := include "grafana-mcp.fullname" . -}}
|
||||
{{- $namespace := include "grafana-mcp.namespace" . -}}
|
||||
{{- $ingressClassName := .Values.ingress.ingressClassName -}}
|
||||
{{ $count := 0 | int }}
|
||||
{{- range .Values.ingress.hosts }}
|
||||
apiVersion: projectcontour.io/v1
|
||||
kind: HTTPProxy
|
||||
metadata:
|
||||
namespace: {{ $namespace }}
|
||||
name: {{ $serviceName }}-{{ $count }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" $ | nindent 4 }}
|
||||
annotations:
|
||||
projectcontour.io/ingress.class: {{ $ingressClassName }}
|
||||
spec:
|
||||
ingressClassName: {{ $ingressClassName }}
|
||||
virtualhost:
|
||||
fqdn: "{{ .host }}"
|
||||
includes:
|
||||
{{- range .paths }}
|
||||
- conditions:
|
||||
{{- if or (eq (lower .pathType) "prefix") (eq (lower .pathType) "implementationspecific") }}
|
||||
- prefix: {{ .path }}
|
||||
{{- end }}
|
||||
{{- if eq (lower .pathType) "exact" }}
|
||||
- exact: {{ .path }}
|
||||
{{- end }}
|
||||
name: {{ $serviceName }}
|
||||
namespace: {{ $namespace }}
|
||||
{{- end }}
|
||||
---
|
||||
{{ $count = add1 $count }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,51 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- if or (eq "nginx-internal" .Values.ingress.ingressClassName) (eq "nginx-external" .Values.ingress.ingressClassName) -}}
|
||||
{{- $fullName := include "grafana-mcp.fullname" . }}
|
||||
{{- $svcPort := .Values.ingress.servicePortNumber | default .Values.service.port }}
|
||||
{{- if and .Values.ingress.ingressClassName (not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class")) }}
|
||||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.ingressClassName}}
|
||||
{{- end }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
{{- with .Values.ingress.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
ingressClassName: {{ .Values.ingress.ingressClassName }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
pathType: {{ .pathType }}
|
||||
backend:
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
number: {{ $svcPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,16 @@
|
||||
{{- if .Values.grafana.apiKey }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "grafana-mcp.fullname" . }}
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
{{- with .Values.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
type: Opaque
|
||||
data:
|
||||
api-key: {{ .Values.grafana.apiKey | toString | b64enc }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,55 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "grafana-mcp.fullname" . }}
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
{{- if .Values.service.clusterIP }}
|
||||
clusterIP: {{ .Values.service.clusterIP }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.externalIPs }}
|
||||
externalIPs:
|
||||
{{- toYaml .Values.service.externalIPs | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerSourceRanges }}
|
||||
loadBalancerSourceRanges:
|
||||
{{- toYaml .Values.service.loadBalancerSourceRanges | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- if and (eq .Values.service.type "ExternalName") .Values.service.externalName }}
|
||||
externalName: {{ .Values.service.externalName }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: mcp-http
|
||||
protocol: TCP
|
||||
name: mcp-http
|
||||
{{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) .Values.service.nodePort }}
|
||||
nodePort: {{ .Values.service.nodePort }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.extraPorts }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "grafana-mcp.selectorLabels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
{{- with .Values.service.sessionAffinity }}
|
||||
sessionAffinity: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.sessionAffinityConfig }}
|
||||
sessionAffinityConfig:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,17 @@
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- tpl (toYaml . | nindent 4) $ }}
|
||||
{{- end }}
|
||||
name: {{ include "grafana-mcp.serviceAccountName" . }}
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,39 @@
|
||||
{{- if .Values.serviceMonitor.enabled }}
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ include "grafana-mcp.fullname" . }}
|
||||
namespace: {{ include "grafana-mcp.namespace" . }}
|
||||
labels:
|
||||
{{- include "grafana-mcp.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
{{- with .Values.serviceMonitor.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.serviceMonitor.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "grafana-mcp.selectorLabels" . | nindent 6 }}
|
||||
app.kubernetes.io/component: mcp-server
|
||||
endpoints:
|
||||
- port: mcp-http
|
||||
path: {{ .Values.serviceMonitor.path }}
|
||||
interval: {{ .Values.serviceMonitor.interval }}
|
||||
scrapeTimeout: {{ .Values.serviceMonitor.scrapeTimeout }}
|
||||
{{- with .Values.serviceMonitor.relabelings }}
|
||||
relabelings:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.serviceMonitor.metricRelabelings }}
|
||||
metricRelabelings:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.serviceMonitor.namespaceSelector }}
|
||||
namespaceSelector:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,285 @@
|
||||
# -- Number of replicas for the MCP server
|
||||
replicas: 1
|
||||
|
||||
# -- Deployment strategy
|
||||
deploymentStrategy:
|
||||
type: RollingUpdate
|
||||
rollingUpdate:
|
||||
maxSurge: 25%
|
||||
maxUnavailable: 25%
|
||||
|
||||
# -- Image configuration
|
||||
image:
|
||||
# -- The Docker registry
|
||||
registry: asia-southeast1-docker.pkg.dev
|
||||
# -- The Docker repository
|
||||
repository: meesho-devops-admin-0622/prd/devop/grafana-mcp
|
||||
# -- Image tag
|
||||
tag: "v2026-03-10"
|
||||
# -- Image pull policy
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# -- Image pull secrets
|
||||
imagePullSecrets: []
|
||||
|
||||
# -- Grafana connection configuration.
|
||||
# `apiKeySecret.name` should point at the K8s Secret produced by the
|
||||
# ExternalSecret (see `externalSecret` below). The key inside that Secret must
|
||||
# match the env var the mcp-grafana binary reads: GRAFANA_SERVICE_ACCOUNT_TOKEN.
|
||||
grafana:
|
||||
# -- Grafana URL (set per-cluster in the override)
|
||||
url: ""
|
||||
# -- Secret containing the Grafana service-account token
|
||||
apiKeySecret:
|
||||
# -- Name of the K8s Secret (typically the ExternalSecret's target.name)
|
||||
name: ""
|
||||
# -- Key inside that Secret holding the token
|
||||
key: "GRAFANA_SERVICE_ACCOUNT_TOKEN"
|
||||
|
||||
# -- Enable debug mode
|
||||
debug: false
|
||||
|
||||
# -- Categories to disable (e.g., oncall, incident, sift)
|
||||
disabledCategories: []
|
||||
|
||||
# -- Additional command line arguments
|
||||
extraArgs: []
|
||||
|
||||
# -- Environment variables
|
||||
env: {}
|
||||
|
||||
# -- Environment variables from other sources
|
||||
envValueFrom: {}
|
||||
|
||||
# -- Environment variables from ConfigMaps or Secrets
|
||||
envFrom: []
|
||||
|
||||
# -- MCP server Readiness probe configuration
|
||||
readinessProbe: {}
|
||||
|
||||
# -- MCP server Liveness probe configuration
|
||||
livenessProbe: {}
|
||||
|
||||
# -- MCP server Startup probe configuration
|
||||
startupProbe: {}
|
||||
|
||||
# -- Service account Configuration
|
||||
serviceAccount:
|
||||
# -- Enable service account
|
||||
create: true
|
||||
# -- Name of the service account
|
||||
name: ""
|
||||
# -- Annotations for the service account
|
||||
annotations: {}
|
||||
# -- Labels for the service account
|
||||
labels: {}
|
||||
# -- Automount service account token
|
||||
automountServiceAccountToken: false
|
||||
|
||||
# -- Service configuration
|
||||
service:
|
||||
# -- Enable service
|
||||
enabled: true
|
||||
# -- Service type
|
||||
type: ClusterIP
|
||||
# -- Service port (matches the mcp-grafana SSE default)
|
||||
port: 8000
|
||||
# -- Service annotations
|
||||
annotations: {}
|
||||
# -- Service labels
|
||||
labels: {}
|
||||
# -- Cluster IP (if type is ClusterIP)
|
||||
clusterIP: ""
|
||||
# -- External IPs
|
||||
externalIPs: []
|
||||
# -- Load balancer IP
|
||||
loadBalancerIP: ""
|
||||
# -- Load balancer source ranges
|
||||
loadBalancerSourceRanges: []
|
||||
# -- External name (if type is ExternalName)
|
||||
externalName: ""
|
||||
# -- Node port (if type is NodePort or LoadBalancer)
|
||||
nodePort: ""
|
||||
# -- Extra ports
|
||||
extraPorts: []
|
||||
# -- Session affinity
|
||||
sessionAffinity: ""
|
||||
# -- Session affinity config
|
||||
sessionAffinityConfig: {}
|
||||
|
||||
# -- Create Contour HTTPProxy resources (parent + child for the configured class,
|
||||
# plus intra parent + child when class is contour-internal*).
|
||||
# When false, only the upstream Ingress is considered (and only for nginx-* classes).
|
||||
createContourGateway: false
|
||||
|
||||
# -- Response timeout for Contour HTTPProxy routes. SSE is long-lived — set this
|
||||
# to e.g. "5m" or "1h" in the override. Leave false to keep Contour defaults.
|
||||
contourResponseTimeout: false
|
||||
|
||||
# -- Routing configuration. Reused by both the Ingress fallback and the HTTPProxy
|
||||
# templates: `ingressClassName` decides which family of resources render.
|
||||
# * nginx-internal / nginx-external -> Ingress
|
||||
# * contour-external / contour-external-0/1 -> HTTPProxy (external)
|
||||
# * contour-internal / contour-internal-0/1 -> HTTPProxy (internal) + intra
|
||||
ingress:
|
||||
# -- Enable routing (HTTPProxy or Ingress, picked by ingressClassName)
|
||||
enabled: false
|
||||
# -- Ingress / HTTPProxy class
|
||||
ingressClassName: ""
|
||||
# -- Backend service port number (defaults to service.port)
|
||||
servicePortNumber: 8000
|
||||
# -- Forward WebSocket upgrades. mcp-grafana SSE transport benefits from this.
|
||||
enableWebsocket: true
|
||||
# -- Ingress annotations (Ingress fallback only; HTTPProxy uses its own spec)
|
||||
annotations: {}
|
||||
# -- Hosts and paths
|
||||
hosts: []
|
||||
# - host: grafana-mcp.meeshogcp.in
|
||||
# paths:
|
||||
# - path: /
|
||||
# pathType: Prefix
|
||||
# -- Ingress TLS configuration (Ingress fallback only)
|
||||
tls: []
|
||||
# -- Ingress labels
|
||||
labels: {}
|
||||
# -- Contour slow-start policy (HTTPProxy only)
|
||||
slowStart:
|
||||
enabled: false
|
||||
window: "120s"
|
||||
aggression: 1
|
||||
minPercent: 10
|
||||
|
||||
# -- ExternalSecret (Vault-backed). The template renders an external-secrets.io
|
||||
# ExternalSecret that pulls a KV bundle from Vault at `path` and writes a K8s
|
||||
# Secret named `secretName`. The deployment reads
|
||||
# `GRAFANA_SERVICE_ACCOUNT_TOKEN` from that Secret via `grafana.apiKeySecret`.
|
||||
externalSecret:
|
||||
enabled: false
|
||||
# -- Name of the K8s Secret created by the ExternalSecret.
|
||||
# Reference this from grafana.apiKeySecret.name.
|
||||
secretName: ""
|
||||
# -- Vault path holding the bundle. Must contain a key named
|
||||
# GRAFANA_SERVICE_ACCOUNT_TOKEN (matches grafana.apiKeySecret.key).
|
||||
path: ""
|
||||
# -- Refresh interval. "0" disables periodic refresh; ESO still syncs on changes.
|
||||
refreshInterval: "0"
|
||||
# -- ClusterSecretStore name
|
||||
secretStoreRef: "vault-backend"
|
||||
# -- Optional Vault version
|
||||
version: ""
|
||||
|
||||
# -- Resource requests and limits
|
||||
resources:
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 512Mi
|
||||
requests:
|
||||
cpu: 250m
|
||||
memory: 256Mi
|
||||
|
||||
# -- Container security context
|
||||
containerSecurityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
readOnlyRootFilesystem: true
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1000
|
||||
runAsGroup: 1000
|
||||
|
||||
# -- Pod security context
|
||||
securityContext:
|
||||
fsGroup: 1000
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1000
|
||||
runAsGroup: 1000
|
||||
|
||||
# -- Automount service account token
|
||||
automountServiceAccountToken: true
|
||||
|
||||
# -- Node selector
|
||||
nodeSelector: {}
|
||||
|
||||
# -- Tolerations
|
||||
tolerations: []
|
||||
|
||||
# -- Affinity
|
||||
affinity: {}
|
||||
|
||||
# -- Topology spread constraints
|
||||
topologySpreadConstraints: []
|
||||
|
||||
# -- Priority class name
|
||||
priorityClassName: ""
|
||||
|
||||
# -- Runtime class name
|
||||
runtimeClassName: ""
|
||||
|
||||
# -- Scheduler name
|
||||
schedulerName: ""
|
||||
|
||||
# -- Host aliases
|
||||
hostAliases: []
|
||||
|
||||
# -- DNS policy
|
||||
dnsPolicy: ""
|
||||
|
||||
# -- DNS config
|
||||
dnsConfig: {}
|
||||
|
||||
# -- Pod annotations
|
||||
podAnnotations: {}
|
||||
|
||||
# -- Pod labels
|
||||
podLabels: {}
|
||||
|
||||
# -- Deployment annotations
|
||||
annotations: {}
|
||||
|
||||
# -- Deployment labels
|
||||
labels: {}
|
||||
|
||||
# -- Lifecycle hooks
|
||||
lifecycle: {}
|
||||
|
||||
# -- Volume mounts
|
||||
volumeMounts: []
|
||||
|
||||
# -- Volumes
|
||||
volumes: []
|
||||
|
||||
# -- Init containers
|
||||
initContainers: []
|
||||
|
||||
# -- Extra init containers
|
||||
extraInitContainers: []
|
||||
|
||||
# -- Extra containers
|
||||
extraContainers: []
|
||||
|
||||
# -- Metrics configuration
|
||||
metrics:
|
||||
# -- Enable Prometheus metrics endpoint (adds --metrics flag)
|
||||
enabled: false
|
||||
|
||||
# -- ServiceMonitor configuration for Prometheus Operator
|
||||
serviceMonitor:
|
||||
# -- Enable ServiceMonitor
|
||||
enabled: false
|
||||
# -- ServiceMonitor labels
|
||||
labels: {}
|
||||
# -- ServiceMonitor annotations
|
||||
annotations: {}
|
||||
# -- Scrape interval
|
||||
interval: 30s
|
||||
# -- Scrape timeout
|
||||
scrapeTimeout: 10s
|
||||
# -- Metrics path
|
||||
path: /metrics
|
||||
# -- Additional relabelings
|
||||
relabelings: []
|
||||
# -- Additional metric relabelings
|
||||
metricRelabelings: []
|
||||
# -- Namespace selector
|
||||
namespaceSelector: {}
|
||||
Reference in New Issue
Block a user