apiVersion: v1 kind: ConfigMap metadata: name: grafana-datasources namespace: monitoring data: prometheus.yaml: | apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true editable: true - name: Loki type: loki access: proxy url: http://loki:3100 editable: true --- apiVersion: v1 kind: ConfigMap metadata: name: grafana-dashboards namespace: monitoring data: besu-network.json: | # Besu Network Dashboard (imported from monitoring/grafana/dashboards/besu-network.json) ccip.json: | # CCIP Dashboard (imported from monitoring/grafana/dashboards/ccip.json) --- apiVersion: apps/v1 kind: Deployment metadata: name: grafana namespace: monitoring labels: app: grafana spec: replicas: 1 selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: containers: - name: grafana image: grafana/grafana:10.2.0 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 3000 protocol: TCP env: - name: GF_SECURITY_ADMIN_USER valueFrom: secretKeyRef: name: grafana-secrets key: admin-user - name: GF_SECURITY_ADMIN_PASSWORD valueFrom: secretKeyRef: name: grafana-secrets key: admin-password - name: GF_SERVER_ROOT_URL value: "http://grafana:3000" - name: GF_INSTALL_PLUGINS value: "grafana-piechart-panel" volumeMounts: - name: grafana-storage mountPath: /var/lib/grafana - name: datasources mountPath: /etc/grafana/provisioning/datasources - name: dashboards mountPath: /etc/grafana/provisioning/dashboards resources: requests: cpu: "500m" memory: "1Gi" limits: cpu: "2" memory: "2Gi" livenessProbe: httpGet: path: /api/health port: http initialDelaySeconds: 60 periodSeconds: 30 readinessProbe: httpGet: path: /api/health port: http initialDelaySeconds: 30 periodSeconds: 10 volumes: - name: grafana-storage persistentVolumeClaim: claimName: grafana-pvc - name: datasources configMap: name: grafana-datasources - name: dashboards configMap: name: grafana-dashboards --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-pvc namespace: monitoring spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: managed-premium --- apiVersion: v1 kind: Service metadata: name: grafana namespace: monitoring labels: app: grafana spec: type: ClusterIP ports: - port: 3000 targetPort: http protocol: TCP name: http selector: app: grafana --- # Secret should be created using: # kubectl create secret generic grafana-secrets \ # --from-literal=admin-user=admin \ # --from-literal=admin-password=$(openssl rand -base64 32) \ # -n monitoring