Monitorer votre cluster kubernetes k3s avec prometheus et grafana

Sans monitoring difficile de comprendre ce qui se passe sur notre cluster kubernetes k3s. Parfois il peut arriver que certains de vos pods ne répondent plus ou votre cluster n’accepte plus aucune commande kubectl, mais comment comprendre ce qu’il s’est passé si vous n’avez de système de monitoring.

Pour vous superviser mon cluster Kubernetes k3s j’ai fait le choix d’utiliser Prometheus et Grafana :

  • Prometheus est un outil open source de monitoring qui s’installe très facilement sur un cluster k3s. * C’est lui qui va se charger de collecter les métriques de Kubernetes, et de les stocker dans sa base de données “Time Series Databasé.
  • Grafana est un logiciel open source, qui permet permet la visualisation et la mise en forme de données métriques stockées entre autre dans Prometheus.

Installation de Prometheus

Récupérons le chart promotheus et suchargeons sur valeurs. Par la même occasion voyons comment se passer de tiller :

helm fetch --untar stable/prometheus
cd prometheus
cp values.yaml my-values.yaml

Editer le fichier my-values.yaml. Personnellement es seuls valeurs que j’ai modifié sont les StorageClass des composants alertmanager, pomotheus-server et pushgateway. En effet j’ai fait le choix de centraliser mes données persistente via un simple server nfs exposé avec un client provisioner (je vous expliquerai une autre fois comment le mettre en place).

     storageClass: "managed-nfs-storage"

Maintenant générons les manifests et lançons le provisionnement de notre stack:

mkdir manifests
helm template  -f my-values.yaml --output-dir ./manifests --name prometheus --namespace monitoring .
cd manifests/prometheus/templates/
kubectl apply -f .

Au bout de quelques minutes vous devriez avoir ceci dans votre namespace monitoring :

kubectl get pod -o wide -n monitoring
NAME                                             READY   STATUS    RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
prometheus-node-exporter-lql9k                   1/1     Running   0          5h45m   192.168.1.43   kubi1   <none>           <none>
prometheus-kube-state-metrics-698c5bfbd6-wwm5p   1/1     Running   0          5h45m   10.42.0.52     kubi1   <none>           <none>
prometheus-server-77475f7fb5-dhfqf               2/2     Running   0          5h45m   10.42.0.53     kubi1   <none>           <none>
prometheus-alertmanager-6fcfdfb679-w89rg         2/2     Running   0          5h45m   10.42.0.54     kubi1   <none>           <none>
prometheus-node-exporter-2ttd9                   1/1     Running   0          5h45m   192.168.1.77   tower   <none>           <none>
prometheus-pushgateway-7d85754c5d-v4tk5          1/1     Running   0          5h45m   10.42.2.203    tower   <none>           <none>

Installation de Grafana sur notre cluster k3s

On reprend le même principe que pour prometheus :

helm fetch --untar stable/grafana
cd grafana
cp values.yaml my-values.yaml

Editer le fichier my-values.yaml. comme pour promotheus j’ai changé les storageclass. Je vais déployer dans le namespace default car mon issuer pour cert-manager s’y trouve.

Maintenant générons les manifests et lançons le provisionnement de notre stack:

mkdir manifests
helm template  -f my-values.yaml --output-dir ./manifests --name grafana --namespace default .
cd manifests/grafana/templates/
kubectl apply -f .

Au bout de quelques minutes vous devriez avoir ceci dans votre namespace monitoring :

NAME                                      READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
kubectl get pod -o wide -n default | grep grafana
grafana-97bdbfbb5-ftp5h                   1/1     Running   0          3h48m   10.42.0.75    kubi1   <none>           <none>

Je crée mon propre ingress au moyen de ce fichier (n’oubliez pas de modifier le domain avec le votre) :

kind: Ingress
metadata:
  annotations:
    certmanager.k8s.io/acme-challenge-type: http01
    certmanager.k8s.io/issuer: letsencrypt-prod
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/frontend-entry-points: http,https
    traefik.ingress.kubernetes.io/redirect-entry-point: https
    traefik.ingress.kubernetes.io/redirect-permanent: "true"
  name: grafana-ingress
  namespace: default
spec:
  rules:
  - host: grafana.example.com
    http:
      paths:
      - backend:
          serviceName: grafana
          servicePort: service
        path: /
  tls:
  - hosts:
    - grafana.example.com
    secretName: secret-tls-grafana

Maintenant allez sur l’url de grafana

Ah oui !!! Le user c’est admin et mot de passe :

kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

Installation du datasource prometheus et des dashboards

Dans un premier temps créons le datasource prometheus. Allez dans le menu Configurations/Datasource et cliquez sur Add Data Source. Sélectionner Prometheus.

Grafana prometheus dashboard

Il suffit juste de remplir URL avec http://prometheus-server.monitoring.svc.cluster.local

Maintenant installons le dashboard node exporter full. il suffit de télécharger le json à l’adresse suivante. Puis aller dans le menu Dashboard/Manage, et choissir import. Sélectionner le json précédement téléchargé.

Dans la configuration du dashboard il suffit juste de sélectionner la datasource Prometheus précédement créé. Au bout de quelques instant :

Grafana prometheus dashboard

Installation de l’application kubernetes dans grafana

Cette nous allons installer un plugin kubernetes dans grafana :

kubectl exec -it grafana-97bdbfbb5-ftp5h /bin/bash
grafana-cli plugins install grafana-kubernetes-app

Quitter le pod et détruiser le pod grafana comme suit pour charger le plugin:

kubectl delete pod grafana-97bdbfbb5-d5mvm --grace-period=0 --force

Un petit coup de refresh et hop. Configurer votre cluster avec les infos présentes dans votre fichier ~/.kube/config

Grafana prometheus dashboard kubernetes

Dans un prochain billet je vous montrerai comment installer loki, un outil de cnetralisation de logs pour prometheus.


Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) au travers des liens produits ci-contre, je touche une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!

comments powered by Disqus