apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "grafana.fullname" . }} labels: app: {{ template "grafana.name" . }} chart: {{ template "grafana.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} {{- with .Values.annotations }} annotations: {{ toYaml . | indent 4 }} {{- end }} spec: replicas: {{ .Values.replicas }} selector: matchLabels: app: {{ template "grafana.name" . }} release: {{ .Release.Name }} strategy: type: {{ .Values.deploymentStrategy }} {{- if ne .Values.deploymentStrategy "RollingUpdate" }} rollingUpdate: null {{- end }} template: metadata: labels: app: {{ template "grafana.name" . }} release: {{ .Release.Name }} {{- with .Values.podAnnotations }} annotations: {{ toYaml . | indent 8 }} {{- end }} spec: serviceAccountName: {{ template "grafana.serviceAccountName" . }} {{- if .Values.schedulerName }} schedulerName: "{{ .Values.schedulerName }}" {{- end }} {{- if .Values.securityContext }} securityContext: {{ toYaml .Values.securityContext | indent 8 }} {{- end }} {{- if .Values.priorityClassName }} priorityClassName: {{ .Values.priorityClassName }} {{- end }} {{- if ( or .Values.persistence.enabled .Values.dashboards .Values.sidecar.datasources.enabled .Values.extraInitContainers) }} initContainers: {{- end }} {{- if ( and .Values.persistence.enabled .Values.persistence.initChownData ) }} - name: init-chown-data image: "{{ .Values.chownDataImage.repository }}:{{ .Values.chownDataImage.tag }}" imagePullPolicy: {{ .Values.chownDataImage.pullPolicy }} securityContext: runAsUser: 0 command: ["chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.runAsUser }}", "/var/lib/grafana"] volumeMounts: - name: storage mountPath: "/var/lib/grafana" {{- if .Values.persistence.subPath }} subPath: {{ .Values.persistence.subPath }} {{- end }} {{- end }} {{- if .Values.dashboards }} - name: download-dashboards image: "{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }} command: ["sh", "/etc/grafana/download_dashboards.sh"] volumeMounts: - name: config mountPath: "/etc/grafana/download_dashboards.sh" subPath: download_dashboards.sh - name: storage mountPath: "/var/lib/grafana" {{- if .Values.persistence.subPath }} subPath: {{ .Values.persistence.subPath }} {{- end }} {{- range .Values.extraSecretMounts }} - name: {{ .name }} mountPath: {{ .mountPath }} readOnly: {{ .readOnly }} {{- end }} {{- end }} {{- if .Values.sidecar.datasources.enabled }} - name: {{ template "grafana.name" . }}-sc-datasources image: "{{ .Values.sidecar.image }}" imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: - name: METHOD value: LIST - name: LABEL value: "{{ .Values.sidecar.datasources.label }}" - name: FOLDER value: "/etc/grafana/provisioning/datasources" {{- if .Values.sidecar.datasources.searchNamespace }} - name: NAMESPACE value: "{{ .Values.sidecar.datasources.searchNamespace }}" {{- end }} resources: {{ toYaml .Values.sidecar.resources | indent 12 }} volumeMounts: - name: sc-datasources-volume mountPath: "/etc/grafana/provisioning/datasources" {{- end}} {{- if .Values.extraInitContainers }} {{ toYaml .Values.extraInitContainers | indent 8 }} {{- end }} {{- if .Values.image.pullSecrets }} imagePullSecrets: {{- range .Values.image.pullSecrets }} - name: {{ . }} {{- end}} {{- end }} containers: {{- if .Values.sidecar.dashboards.enabled }} - name: {{ template "grafana.name" . }}-sc-dashboard image: "{{ .Values.sidecar.image }}" imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: - name: LABEL value: "{{ .Values.sidecar.dashboards.label }}" - name: FOLDER value: "{{ .Values.sidecar.dashboards.folder }}" {{- if .Values.sidecar.dashboards.searchNamespace }} - name: NAMESPACE value: "{{ .Values.sidecar.dashboards.searchNamespace }}" {{- end }} resources: {{ toYaml .Values.sidecar.resources | indent 12 }} volumeMounts: - name: sc-dashboard-volume mountPath: {{ .Values.sidecar.dashboards.folder | quote }} {{- end}} - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} {{- if .Values.command }} command: {{- range .Values.command }} - {{ . }} {{- end }} {{- end}} volumeMounts: - name: config mountPath: "/etc/grafana/grafana.ini" subPath: grafana.ini {{- if not .Values.admin.existingSecret }} - name: ldap mountPath: "/etc/grafana/ldap.toml" subPath: ldap.toml {{- end }} {{- range .Values.extraConfigmapMounts }} - name: {{ .name }} mountPath: {{ .mountPath }} readOnly: {{ .readOnly }} {{- end }} - name: storage mountPath: "/var/lib/grafana" {{- if .Values.persistence.subPath }} subPath: {{ .Values.persistence.subPath }} {{- end }} {{- if .Values.dashboards }} {{- range $provider, $dashboards := .Values.dashboards }} {{- range $key, $value := $dashboards }} {{- if (or (hasKey $value "json") (hasKey $value "file")) }} - name: dashboards-{{ $provider }} mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json" subPath: "{{ $key }}.json" {{- end }} {{- end }} {{- end }} {{- end -}} {{- if .Values.dashboardsConfigMaps }} {{- range keys .Values.dashboardsConfigMaps }} - name: dashboards-{{ . }} mountPath: "/var/lib/grafana/dashboards/{{ . }}" {{- end }} {{- end }} {{- if .Values.datasources }} - name: config mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml" subPath: datasources.yaml {{- end }} {{- if .Values.notifiers }} - name: config mountPath: "/etc/grafana/provisioning/notifiers/notifiers.yaml" subPath: notifiers.yaml {{- end }} {{- if .Values.dashboardProviders }} - name: config mountPath: "/etc/grafana/provisioning/dashboards/dashboardproviders.yaml" subPath: dashboardproviders.yaml {{- end }} {{- if .Values.sidecar.dashboards.enabled }} - name: sc-dashboard-volume mountPath: {{ .Values.sidecar.dashboards.folder | quote }} - name: sc-dashboard-provider mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" subPath: provider.yaml {{- end}} {{- if .Values.sidecar.datasources.enabled }} - name: sc-datasources-volume mountPath: "/etc/grafana/provisioning/datasources" {{- end}} {{- range .Values.extraSecretMounts }} - name: {{ .name }} mountPath: {{ .mountPath }} readOnly: {{ .readOnly }} {{- end }} {{- range .Values.extraVolumeMounts }} - name: {{ .name }} mountPath: {{ .mountPath }} subPath: {{ .subPath | default "" }} readOnly: {{ .readOnly }} {{- end }} {{- range .Values.extraEmptyDirMounts }} - name: {{ .name }} mountPath: {{ .mountPath }} {{- end }} ports: - name: service containerPort: {{ .Values.service.port }} protocol: TCP - name: grafana containerPort: 3000 protocol: TCP env: {{- if not .Values.env.GF_SECURITY_ADMIN_USER }} - name: GF_SECURITY_ADMIN_USER valueFrom: secretKeyRef: name: {{ .Values.admin.existingSecret | default (include "grafana.fullname" .) }} key: {{ .Values.admin.userKey | default "admin-user" }} {{- end }} {{- if not .Values.env.GF_SECURITY_ADMIN_PASSWORD }} - name: GF_SECURITY_ADMIN_PASSWORD valueFrom: secretKeyRef: name: {{ .Values.admin.existingSecret | default (include "grafana.fullname" .) }} key: {{ .Values.admin.passwordKey | default "admin-password" }} {{- end }} {{- if .Values.plugins }} - name: GF_INSTALL_PLUGINS valueFrom: configMapKeyRef: name: {{ template "grafana.fullname" . }} key: plugins {{- end }} {{- if .Values.smtp.existingSecret }} - name: GF_SMTP_USER valueFrom: secretKeyRef: name: {{ .Values.smtp.existingSecret }} key: {{ .Values.smtp.userKey | default "user" }} - name: GF_SMTP_PASSWORD valueFrom: secretKeyRef: name: {{ .Values.smtp.existingSecret }} key: {{ .Values.smtp.passwordKey | default "password" }} {{- end }} {{- range $key, $value := .Values.env }} - name: "{{ $key }}" value: "{{ $value }}" {{- end }} {{- if .Values.envFromSecret }} envFrom: - secretRef: name: {{ .Values.envFromSecret }} {{- end }} livenessProbe: {{ toYaml .Values.livenessProbe | indent 12 }} readinessProbe: {{ toYaml .Values.readinessProbe | indent 12 }} resources: {{ toYaml .Values.resources | indent 12 }} {{- if .Values.extraContainers }} {{ toYaml .Values.extraContainers | indent 8}} {{- end }} {{- with .Values.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.affinity }} affinity: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{ toYaml . | indent 8 }} {{- end }} volumes: - name: config configMap: name: {{ template "grafana.fullname" . }} {{- range .Values.extraConfigmapMounts }} - name: {{ .name }} configMap: name: {{ .configMap }} {{- end }} {{- if .Values.dashboards }} {{- range keys .Values.dashboards }} - name: dashboards-{{ . }} configMap: name: {{ template "grafana.fullname" $ }}-dashboards-{{ . }} {{- end }} {{- end }} {{- if .Values.dashboardsConfigMaps }} {{ $root := . }} {{- range $provider, $name := .Values.dashboardsConfigMaps }} - name: dashboards-{{ $provider }} configMap: name: {{ tpl $name $root }} {{- end }} {{- end }} {{- if not .Values.admin.existingSecret }} - name: ldap secret: {{- if .Values.ldap.existingSecret }} secretName: {{ .Values.ldap.existingSecret }} {{- else }} secretName: {{ template "grafana.fullname" . }} {{- end }} items: - key: ldap-toml path: ldap.toml {{- end }} - name: storage {{- if .Values.persistence.enabled }} persistentVolumeClaim: claimName: {{ .Values.persistence.existingClaim | default (include "grafana.fullname" .) }} {{- else }} emptyDir: {} {{- end -}} {{- if .Values.sidecar.dashboards.enabled }} - name: sc-dashboard-volume emptyDir: {} - name: sc-dashboard-provider configMap: name: {{ template "grafana.fullname" . }}-config-dashboards {{- end }} {{- if .Values.sidecar.datasources.enabled }} - name: sc-datasources-volume emptyDir: {} {{- end -}} {{- range .Values.extraSecretMounts }} - name: {{ .name }} secret: secretName: {{ .secretName }} defaultMode: {{ .defaultMode }} {{- end }} {{- range .Values.extraVolumeMounts }} - name: {{ .name }} persistentVolumeClaim: claimName: {{ .existingClaim }} {{- end }} {{- range .Values.extraEmptyDirMounts }} - name: {{ .name }} emptyDir: {} {{- end }}