Le but de ce TP est de mettre en place un système de surveillance d'un cluster Kubernetes en utilisant Prometheus et Grafana. Les objectifs principaux étaient :
- Installer Prometheus et Grafana pour le monitoring d'un cluster Kubernetes.
- Déployer une application d'exemple et la connecter à Prometheus.
- Observer les stratégies de déploiement et de mise à jour d'applications dans Kubernetes.
- Visualiser les métriques collectées à l'aide de Grafana.
- Préparation de l’Environnement Avant de commencer l'installation de Prometheus et Grafana, j'ai vérifié que le cluster Kubernetes était opérationnel en exécutant les commandes suivantes :
kubectl cluster-info
kubectl get nodes
Cela a confirmé que mon cluster Minikube était fonctionnel. J'ai également vérifié que Helm était installé avec :
helm version
- Installation de Prometheus avec Helm Ensuite, j'ai créé un namespace dédié pour Prometheus et Grafana :
kubectl create namespace monitoring
J'ai ajouté les dépôts Helm nécessaires pour Prometheus et kube-state-metrics :
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add kube-state-metrics https://kubernetes.github.io/kube-state-metrics
helm repo update
J'ai ensuite installé Prometheus dans le namespace monitoring :
helm install --namespace=monitoring --version=26.0.0 --set=service.type=NodePort prometheus prometheus-community/prometheus
Cela a installé Prometheus avec les paramètres définis pour l'accès via NodePort. J'ai vérifié que les pods étaient bien lancés avec :
kubectl get pods -n monitoring
-
Exploration de kube-state-metrics Le chart Helm a automatiquement installé kube-state-metrics, une intégration entre Kubernetes et Prometheus. J'ai utilisé Lens, un outil graphique pour Kubernetes, afin d'explorer les métriques collectées, notamment les informations sur les pods, les ressources CPU, mémoire, etc.
-
Déploiement de l'Application Exemple J'ai cloné le dépôt contenant l'application d'exemple goprom :
git clone https://gitlab.com/devops_tps/k8s-deployment-strategies.git
cd 'k8s-deployment-strategies/k8s_stategies/1recreate'
J'ai ensuite appliqué le fichier app-v1.yaml pour déployer l'application :
kubectl apply -f app-v1.yaml
Cela a déployé l'application et les services associés.
- Observation de l'Application et de son Déploiement
J'ai exploré le code de l'application, notamment main.go et le fichier app-v1.yaml. L'application expose plusieurs ports :
Port 8080 : pour l'interface principale. Port 8086 : pour les probes de liveness et readiness. Port 9101 : pour exposer les métriques à Prometheus. J'ai exposé les services et vérifié que les métriques étaient accessibles :
minikube service goprom
minikube service goprom-metrics
- Configuration de Prometheus pour Collecter les Métriques
J'ai modifié le service Prometheus en le passant de ClusterIP à NodePort pour pouvoir y accéder via un port externe :
kubectl edit service prometheus-server -n monitoring
minikube service prometheus-server -n monitoring
Ensuite, j'ai vérifié que Prometheus récupérait bien les métriques de l'application avec la requête PromQL suivante :
sum(rate(http_requests_total{app="goprom"}[5m])) by (version)
- Installation et Configuration de Grafana
J'ai créé un secret pour les identifiants de connexion de Grafana :
cat <<EOF | kubectl apply -n monitoring -f -
apiVersion: v1
kind: Secret
metadata:
namespace: monitoring
name: grafana-auth
type: Opaque
data:
admin-user:
J'ai ajouté le dépôt Grafana et installé Grafana :
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install --namespace=monitoring --version=8.6.4 --set=admin.existingSecret=grafana-auth --set=service.type=NodePort --set=service.nodePort=32001 grafana grafana/grafana
J'ai exposé le service Grafana et me suis connecté à l'interface en utilisant les identifiants admin/admin.
- Création d’un Dashboard Grafana
J'ai créé un tableau de bord Grafana avec un panneau de type Graph pour visualiser les métriques collectées :
sum(rate(http_requests_total{app="goprom"}[5m])) by (version)
J'ai configuré la légende pour afficher la version de l'application.
- Importation d’un Dashboard Kubernetes Complet
J'ai téléchargé et importé un dashboard Kubernetes complet (ID 18283) depuis Grafana Dashboards pour avoir une vue d'ensemble détaillée du cluster. J'ai vérifié que les cibles nécessaires étaient bien présentes dans Prometheus.
- Observation des Stratégies de Déploiement
J'ai testé plusieurs stratégies de déploiement en modifiant le fichier app-v2.yaml pour appliquer une mise à jour de l'application :
kubectl apply -f app-v2.yaml
kubectl rollout status deployment/goprom
J'ai observé les changements en temps réel dans Grafana avec la même requête PromQL.
- Nettoyage des Ressources Après avoir terminé le TP, j'ai nettoyé les ressources créées pour ne pas encombrer le cluster :
kubectl delete -f app-v1.yaml
kubectl delete -f app-v2.yaml
helm uninstall prometheus -n monitoring
helm uninstall grafana -n monitoring
kubectl delete namespace monitoring