grafana-dashboards-kubernetes is a free, open source monitoring & observability project written in several languages and released under Apache-2.0. It has 3,829 GitHub stars, 487 forks and 14 open issues, and was last pushed 3 days ago. On this registry it ranks #111 of 270 tracked projects in Monitoring & Observability, with 5 head-to-head comparisons available. It gained 22 stars over the last 30 tracked days.

What is grafana-dashboards-kubernetes?

grafana-dashboards-kubernetes is an Apache-2.0 collection of modern Grafana dashboards for Kubernetes, built for platform, SRE, and cluster-operations teams that already run Prometheus-based monitoring and want ready-made views instead of assembling panels by hand.

What it is

The repository holds a modern set of Grafana dashboards for Kubernetes. They are inspired by other dashboards from kubernetes-mixin and grafana.com, and are also published for download on Grafana.com under search dotdc. Dashboards ship as JSON files, including k8s-addons-prometheus.json, k8s-addons-trivy-operator.json, k8s-system-api-server.json, and the k8s-views-global and k8s-views-nodes views. Releases follow semantic versioning, driven by conventional commits and automated with semantic-release.

The concrete problem is that a Kubernetes cluster emits metrics but no usable visual layer. These dashboards are made and tested for the kube-prometheus-stack Helm chart, and they work with other setups as long as kube-state-metrics and prometheus-node-exporter run on the cluster. That makes the project a replacement for the ad-hoc dashboards practitioners otherwise write themselves or inherit from kubernetes-mixin, which do not exploit newer Grafana panel features. A Prometheus Datasource variable is included so the dashboards also work on a federated Grafana instance.

Key capabilities

  • Provides per-subject dashboards, including k8s-addons-prometheus.json for Prometheus, k8s-addons-trivy-operator.json for the Aqua Security Trivy Operator, and k8s-system-api-server.json for the Kubernetes API Server component.
  • Uses Grafana gradient mode (Grafana 8.1), the time series visualization panel (Grafana 7.4), and the $__rate_interval variable (Grafana 7.2), and is therefore not backward compatible with older Grafana versions.
  • Exposes a Prometheus Datasource variable for federated Grafana deployments.
  • Supports install manually, via grafana.com, with ArgoCD, with Helm values, as ConfigMaps, as ConfigMaps with Terraform, and as a GrafanaDashboard resource with the Grafana Operator.
  • Targets the kube-prometheus-stack chart while remaining usable with other stacks that provide kube-state-metrics and prometheus-node-exporter.
  • Automates releases through semantic-release, conventional commits, and semantic versioning.

Who uses it and how

  • Teams running kube-prometheus-stack on Kubernetes clusters that want node, pod, and add-on views without authoring panels.
  • GitOps workflows, using the ArgoCD path or the ConfigMap and Terraform variants to deploy dashboards declaratively.
  • Federated Grafana instances, where the Prometheus Datasource variable lets one Grafana point at multiple Prometheus sources.
  • Clusters running the Aqua Security Trivy Operator, which get a dedicated dashboard for that add-on.
  • Users who download the dashboards directly from Grafana.com instead of from the repository.

Getting started

Import the JSON dashboard files manually into Grafana or download them from Grafana.com. Automated paths are also documented for ArgoCD, Helm values, ConfigMaps, ConfigMaps with Terraform, and the Grafana Operator's GrafanaDashboard resource.

How it compares

The facts name similar tools rather than paid products: the dashboards sit alongside the kubernetes-mixin dashboards and the dashboards published on Grafana.com, and the README positions this set by its use of newer Grafana panel features. Unlike mixin output tuned for older Grafana releases, it is deliberately not backward compatible, which is the main axis of difference. It is Apache-2.0 licensed and self-hosted inside the operator's own Grafana instance.

When to use it — and when not to

A self-hoster must already operate Grafana new enough for gradient mode, the time series panel, and $__rate_interval, plus kube-state-metrics and prometheus-node-exporter on the cluster. Known issues are documented: broken panels due to a too-high resolution, broken panels on k8s-views-nodes when a node changes its IP address, and broken panels on the same view due to the nodename label, with Windows support covered as a separate topic. Anyone pinned to an older Grafana release, or without the required exporters, should not pick this set.

project readme (upstream, from github) — read inline

grafana-dashboards-kubernetes

logo

Table of contents

Description

This repository contains a modern set of Grafana dashboards for Kubernetes.
They are inspired by many other dashboards from kubernetes-mixin and grafana.com.

More information about them in my article: A set of modern Grafana dashboards for Kubernetes

You can also download them on Grafana.com.

Releases

This repository follows semantic versioning for releases.
It relies on conventional commits to automate releases using semantic-release.

Features

These dashboards are made and tested for the kube-prometheus-stack chart, but they should work well with others as soon as you have kube-state-metrics and prometheus-node-exporter installed on your Kubernetes cluster.

They are not backward compatible with older Grafana versions because they try to take advantage of Grafana's newest features like:

They also have a Prometheus Datasource variable so they will work on a federated Grafana instance.

As an example, here's how the Kubernetes / Views / Global dashboard looks like:

screenshot

Dashboards

File name Description Screenshot
k8s-addons-prometheus.json Dashboard for Prometheus. Screenshot
k8s-addons-trivy-operator.json Dashboard for the Trivy Operator from Aqua Security. Screenshot
k8s-system-api-server.json Dashboard for the API Server Kubernetes component. Screenshot
k8s-system-coredns.json Dashboard for the CoreDNS Kubernetes component. Screenshot
k8s-views-global.json Global level view dashboard for Kubernetes. Screenshot
k8s-views-namespaces.json Namespaces level view dashboard for Kubernetes. Screenshot
k8s-views-nodes.json Nodes level view dashboard for Kubernetes. Screenshot
k8s-views-pods.json Pods level view dashboard for Kubernetes. Screenshot

Installation

In most cases, you will need to clone this repository (or your fork):

git clone https://github.com/dotdc/grafana-dashboards-kubernetes.git
cd grafana-dashboards-kubernetes

If you plan to deploy these dashboards using ArgoCD, ConfigMaps or Terraform, you will also need to enable and configure the dashboards sidecar on the Grafana Helm chart to get the dashboards loaded in your Grafana instance:

# kube-prometheus-stack values
grafana:
  sidecar:
    dashboards:
      enabled: true
      defaultFolderName: "General"
      label: grafana_dashboard
      labelValue: "1"
      folderAnnotation: grafana_folder
      searchNamespace: ALL
      provider:
        foldersFromFilesStructure: true

Install manually

In your Grafana instance, put your mouse over the + sign on the left menu, then click on Import.
Once you are on the Import page, you can upload the JSON files one by one from your local copy using the Upload JSON file button.

Install via grafana.com

In your Grafana instance, put your mouse over the + sign on the left menu, then click on Import.
Once you are on the Import page, you can put the grafana.com dashboard ID (see table below) under Import via grafana.com then click on the Load button. Repeat for each dashboard.

Grafana.com dashboard id list:

Dashboard ID
k8s-addons-prometheus.json 19105
k8s-addons-trivy-operator.json 16337
k8s-system-api-server.json 15761
k8s-system-coredns.json 15762
k8s-views-global.json 15757
k8s-views-namespaces.json 15758
k8s-views-nodes.json 15759
k8s-views-pods.json 15760

Install with ArgoCD

If you are using ArgoCD, this will deploy the dashboards in the default project of ArgoCD:

kubectl apply -f argocd-app.yml

You will also need to enable and configure the Grafana dashboards sidecar as described in Installation.

Install with Helm values

If you use the official Grafana helm chart or kube-prometheus-stack, you can install the dashboards directly using the dashboardProviders & dashboards helm chart values.

Depending on your setup, add or merge the following block example to your helm chart values.
The example is for kube-prometheus-stack, for the official Grafana helm chart, remove the first line (grafana:), and reduce the indentation level of the entire block.

grafana:
  # Provision grafana-dashboards-kubernetes
  dashboardProviders:
    dashboardproviders.yaml:
      apiVersion: 1
      providers:
      - name: 'grafana-dashboards-kubernetes'
        orgId: 1
        folder: 'Kubernetes'
        type: file
        disableDeletion: true
        editable: true
        options:
          path: /var/lib/grafana/dashboards/grafana-dashboards-kubernetes
  dashboards:
    grafana-dashboards-kubernetes:
      k8s-system-api-server:
        url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-system-api-server.json
        token: ''
      k8s-system-coredns:
        url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-system-coredns.json
        token: ''
      k8s-views-global:
        url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-global.json
        token: ''
      k8s-views-namespaces:
        url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-namespaces.json
        token: ''
      k8s-views-nodes:
        url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-nodes.json
        token: ''
      k8s-views-pods:
        url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-pods.json
        token: ''

Install as ConfigMaps

Grafana dashboards can be provisioned as Kubernetes ConfigMaps if you configure the dashboard sidecar available on the official Grafana Helm Chart.

To build the ConfigMaps and output them on STDOUT :

kubectl kustomize .

Note: no namespace is set by default, you can change that in the kustomization.yaml file.

To build and deploy them directly on your Kubernetes cluster :

kubectl apply -k . -n monitoring

You will also need to enable and configure the Grafana dashboards sidecar as described in Installation.

Note: you can change the namespace if needed.

Install as ConfigMaps with Terraform

If you use Terraform to provision your Kubernetes resources, you can convert the generated ConfigMaps to Terraform code using tfk8s.

To build and convert ConfigMaps to Terraform code :

kubectl kustomize . | tfk8s

You will also need to enable and configure the Grafana dashboards sidecar as described in Installation.

Note: no namespace is set by default, you can change that in the kustomization.yaml file.

Install as GrafanaDashboard with Grafana Operator

If you use Grafana Operator to provision your Grafana dashboards, you can use the following manifests:

Make sure to use your proper namespace.

apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: k8s-system-api-server
  namespace: monitoring
spec:
  instanceSelector:
    matchLabels:
      dashboards: "grafana"
  url: "https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-system-api-server.json"
---
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: k8s-system-coredns
  namespace: monitoring
spec:
  instanceSelector:
    matchLabels:
      dashboards: "grafana"
  url: "https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-system-coredns.json"
---
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: k8s-views-global
  namespace: monitoring
spec:
  instanceSelector:
    matchLabels:
      dashboards: "grafana"
  url: "https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-global.json"
---
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: k8s-views-namespaces
  namespace: monitoring
spec:
  instanceSelector:
    matchLabels:
      dashboards: "grafana"
  url: "https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-namespaces.json"
---
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: k8s-views-nodes
  namespace: monitoring
spec:
  instanceSelector:
    matchLabels:
      dashboards: "grafana"
  url: "https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-nodes.json"
---
apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: k8s-views-pods
  namespace: monitoring
spec:
  instanceSelector:
    matchLabels:
      dashboards: "grafana"
  url: "https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-pods.json"

Known issue(s)

Broken panels due to a too-high resolution

A user reported in #50 that some panels were broken because the default value of the $resolution variable was too low. The root cause hasn't been identified precisely, but he was using Grafana Agent & Grafana Mimir. Changing the $resolution variable to a higher value (a lower resolution) will likely solve the issue. To make the fix permanent, you can configure the Scrape interval in your Grafana Datasource to a working value for your setup.

Broken panels on k8s-views-nodes when a node changes its IP address

To make this dashboard more convenient, there's a small variable hack to display node instead of instance. Because of that, some panels could lack data when a node changes its IP address as reported in #102.

There is currently no known fix for this scenario, though it should be a corner case for most deployments. Contributions with ideas or solutions are welcome.

Broken panels on k8s-views-nodes due to the nodename label

The k8s-views-nodes dashboard will have many broken panels if the node label from kube_node_info doesn't match the nodename label from node_uname_info.

This situation can happen on certain deployments of the node exporter running inside Kubernetes(e.g. via a DaemonSet), where nodename takes a different value than the node name as understood by the Kubernetes API.

Below are some ways to relabel the metric to force the nodename label to the appropriate value, depending on the way the collection agent is deployed:

Directly through the Prometheus configuration file

Assuming the node exporter job is defined through kubernetes_sd_config, you can take advantage of the internal discovery labels and fix this by adding the following relabeling rule to the job:

# File: prometheus.yaml
scrape_configs:
- job_name: node-exporter
  relabel_configs:
  # Add this
  - action: replace
    source_labels: [ __meta_kubernetes_pod_node_name]
    target_label: nodename
Through a ServiceMonitor

If using the Prometheus operator or the Grafana agent in operator mode, the scrape job should instead be configured via a ServiceMonitor that will dynamically edit the Prometheus configuration file. In that case, the relabeling has a slightly different syntax:

# File: service-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: node-exporter
spec:
  endpoints:
  - port: http-metrics
    relabelings:
    # Add this
    - action: replace
      sourceLabels: [__meta_kubernetes_node_name]
      targetLabel: nodename

As a convenience, if using the kube-prometheus-stack helm chart, this added rule can be directly specified in your values.yaml:

# File: kube-prometheus-stack-values.yaml
prometheus-node-exporter:
  prometheus:
    monitor:
      relabelings:
      - action: replace
        sourceLabels: [__meta_kubernetes_pod_node_name]
        targetLabel: nodename
With Grafana Alloy

Grafana Alloy can bundle its own node_exporter. In that case, relabeling can be done this way:

prometheus.exporter.unix "node_exporter" {
}

prometheus.scrape "node_exporter" {
  targets    = prometheus.exporter.unix.node_exporter.targets
  forward_to = [prometheus.relabel.node_exporter.receiver]
  job_name   = "node-exporter"
}

prometheus.relabel "node_exporter" {
  forward_to = [prometheus.remote_write.<your_component>.receiver]

  rule {
    action       = "replace"
    replacement  = sys.env("HOSTNAME")
    target_label = "nodename"
  }
}

If you deploy Alloy with the Helm chart, the HOSTNAME environment variable is set to the Kubernetes node name by default. If you use a custom deployment, adjust the value used for nodename to match your node naming scheme.

Windows support

The dashboards currently don't support Windows. We experimented with Windows support in the k8s-views-global dashboard, but it ended up breaking some panels, so it has been removed for now. You can download the last Windows-compatible version of the dashboard or download revision 43 on Grafana.com.

See #79

Contributing

Feel free to contribute to this project:

  • Give a GitHub ⭐ if you like it
  • Create an Issue to make a feature request, report a bug or share an idea.
  • Create a Pull Request if you want to share code or anything useful to this project.

Frequently asked questions

Is grafana-dashboards-kubernetes free to use?

grafana-dashboards-kubernetes is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does grafana-dashboards-kubernetes do?

A set of modern Grafana dashboards for Kubernetes.

What is grafana-dashboards-kubernetes written in?

grafana-dashboards-kubernetes's source is publicly available at https://github.com/dotdc/grafana-dashboards-kubernetes, with 3,829 GitHub stars.