Installing Grafana on Kubernetes with k3s
On this page
Learn how to install Grafana on Kubernetes using k3s, ArgoCD CLI, and configure it with an Ingress for secure access. This guide walks you through the deployment process, setting up persistent storage, and configuring an Ingress with TLS.
Using ArgoCD CLI:
argocd app create grafana --repo https://git.k3s.differentpla.net/roger/grafana.git --path . --dest-server https://kubernetes.default.svc --dest-namespace grafanaApplication ‘grafana’ created. The rest of this setup follows the Grafana installation guide for Kubernetes, with modifications to use an Ingress rather than a LoadBalancer.
Deployment Configuration
Create the deployment.yaml file:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: grafana
name: grafana
namespace: grafana
spec:
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
securityContext:
fsGroup: 472
supplementalGroups:
- 0
containers:
- name: grafana
image: grafana/grafana:9.1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: http-grafana
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /robots.txt
port: 3000
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 2
livenessProbe:
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 3000
timeoutSeconds: 1
resources:
requests:
cpu: 250m
memory: 750Mi
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-pv
volumes:
- name: grafana-pv
persistentVolumeClaim:
claimName: grafana-pvcPersistentVolumeClaim Configuration
Create the pvc.yaml file with storageClassName: longhorn:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-pvc
namespace: grafana
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: longhornService Configuration
Create the service.yaml file:
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: grafana
spec:
ports:
- port: 3000
protocol: TCP
name: http-grafana
targetPort: http-grafana
selector:
app: grafanaIngress Configuration
Create the ingress.yaml file:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana
namespace: grafana
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.tls: "true"
cert-manager.io/cluster-issuer: k3s-ca-cluster-issuer
spec:
tls:
- hosts:
- grafana.k3s.differentpla.net
secretName: grafana-tls
rules:
- host: grafana.k3s.differentpla.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana
port:
name: http-grafanaConfiguring DNS
Edit the ConfigMap for your custom CoreDNS to include the following:
kubectl --namespace k3s-dns edit configmap k3s-dnsAdd the following entry to NodeHosts:
data:
NodeHosts: |
192.168.28.10 grafana.k3s.differentpla.netConclusion
That’s pretty much it. By following these steps, you can install Grafana on your Kubernetes cluster using k3s, configure persistent storage, and set up an Ingress for secure access. This setup ensures that your monitoring solution is robust and accessible.
Consider adding a controller that scans for Ingress and Service annotations to automate the DNS configuration process in the future.