Cloud Native 7 min read

Deploying Prometheus, Grafana, and Node Exporter on Kubernetes Using YAML Manifests

This guide walks through deploying node‑exporter, Prometheus, and Grafana on a Kubernetes cluster with YAML manifests, configuring services, RBAC, and Grafana dashboards to monitor cluster metrics, and includes verification steps and code examples.

DevOps Cloud Academy
DevOps Cloud Academy
DevOps Cloud Academy
Deploying Prometheus, Grafana, and Node Exporter on Kubernetes Using YAML Manifests

Use Prometheus to monitor the system and Grafana to display data in a Kubernetes (K8s) environment, deploying resources via YAML files stored at https://github.com/zeyangli/devops-on-k8s .

1. Deploy node‑exporter for cluster monitoring

Deploy a DaemonSet that runs on every node and expose it with a NodePort service.

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-system
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
      name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter:v0.18.1
        ports:
        - containerPort: 9100
          protocol: TCP
          name: http
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: node-exporter
  name: node-exporter
  namespace: kube-system
spec:
  ports:
  - name: http
    port: 9100
    nodePort: 31672
    protocol: TCP
  type: NodePort
  selector:
    k8s-app: node-exporter

2. Deploy Prometheus service

Create a Deployment that runs the Prometheus container, mounts a ConfigMap for configuration, and defines resource requests and limits. Also create a Service to expose Prometheus via NodePort, and configure RBAC to grant the necessary permissions.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-deployment
  namespace: kube-system
  labels:
    name: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:v2.15.2
        command: ["/bin/prometheus"]
        args:
        - "--config.file=/etc/prometheus/prometheus.yml"
        - "--storage.tsdb.path=/prometheus"
        - "--storage.tsdb.retention=24h"
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: "/prometheus"
        - name: config-volume
          mountPath: "/etc/prometheus"
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
        serviceAccountName: prometheus
      volumes:
      - name: data
        hostPath:
          path: /data/devops/prometheus
          type: Directory
      - name: config-volume
        configMap:
          name: prometheus-config
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: prometheus
  name: prometheus
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 9090
    targetPort: 9090
    nodePort: 30003
  selector:
    app: prometheus
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources: ["nodes","nodes/proxy","services","endpoints","pods"]
  verbs: ["get","list","watch"]
- apiGroups: ["extensions"]
  resources: ["ingresses"]
  verbs: ["get","list","watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: kube-system

3. Deploy Grafana service

Create a Deployment for Grafana, set environment variables for basic authentication, define a readiness probe, and mount a persistent storage volume. Expose Grafana with a NodePort Service.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-core
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  selector:
    matchLabels:
      app: grafana
  replicas: 1
  template:
    metadata:
      labels:
        app: grafana
        component: core
    spec:
      containers:
      - image: grafana/grafana:6.5.3
        name: grafana-core
        imagePullPolicy: IfNotPresent
        env:
        - name: GF_AUTH_BASIC_ENABLED
          value: "true"
        - name: GF_AUTH_ANONYMOUS_ENABLED
          value: "false"
        readinessProbe:
          httpGet:
            path: /login
            port: 3000
        volumeMounts:
        - name: grafana-persistent-storage
          mountPath: /var
      volumes:
      - name: grafana-persistent-storage
        hostPath:
          path: /data/devops/grafana
          type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  type: NodePort
  ports:
  - port: 3000
    nodePort: 30011
  selector:
    app: grafana
    component: core

4. Verification

Check the pod status in the Prometheus dashboard, confirm that metrics are being collected, and access Grafana via the exposed NodePort to view the imported dashboards.

Images in the original article illustrate the dashboard view, Prometheus metrics page, and Grafana login screen.

5. Configure Grafana panels

Add Prometheus as a data source in Grafana, then import the dashboard with ID 315 from Grafana.com . The final view shows cluster monitoring metrics.

At the end of the article, a promotional link to a Jenkins‑based DevOps pipeline course is provided.

MonitoringCloud NativeKubernetesdevopsPrometheusYAMLGrafana
DevOps Cloud Academy
Written by

DevOps Cloud Academy

Exploring industry DevOps practices and technical expertise.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.