Aller au contenu

TP - Kubernetes, Infra & Observability Stack

Abstract

Ce projet a pour but de mettre en place une plateforme complète d’observabilité sur un cluster Kubernetes managé. Vous déploierez une stack metrics et logs, configurerez des dashboards Grafana, des alertes, et exposerez vos services de manière sécurisée via la Gateway API.

Objectifs

Partie 1 — Déploiement d'un Kubernetes managé

Déployez un cluster Kubernetes managé sur le cloud provider de votre choix (GKE, EKS, AKS, Scaleway Kapsule, etc.).

Contraintes :

  • Le déploiement doit être entièrement as-code via Terraform
  • Toute opération manuelle via une interface web (ClickOps) est interdite
  • Le code Terraform doit être propre, lisible et idempotent (modules, variables, outputs) et sans apparation de credentials en clair.

Partie 2 — Stack de monitoring — Métriques

Choix de la solution

Effectuez un benchmark des solutions existantes (Prometheus, VictoriaMetrics, Thanos, Mimir, Cortex…) et justifiez votre choix final.

Contraintes :

  • Installation via Helm uniquement
  • L'utilisation de stacks all-in-one type kube-prometheus-stack est interdite — chaque composant doit être installé séparément
  • La TSDB (Time Series Database) doit être correctement configurée (rétention, stockage persistant)

Exporters

Installez les deux charts suivants sur votre cluster, ils serviront de source de données pour vos dashboards :

Pipelines de collecte

Configurez les deux pipelines de scraping suivants :

KSM  →  Vector  →  TSDB
NE  →  Agent (Prometheus Agent Mode ou VMAgent)  →  Vector  →  TSDB
       └─ gère les ServiceMonitor / PodMonitor

Remarque

Pour le second pipeline, l'agent doit fonctionner en mode scrape-only (Prometheus Agent Mode ou équivalent). Les ServiceMonitor et PodMonitor doivent être correctement configurés.

Tip

Un peu de doc sur la partie Agent Mode : Article blog Prometheus et Doc Prometheus

Partie 3 — Dashboards Grafana

Installation

Installez Grafana via son chart Helm officiel et configurez les datasources pour pointer vers votre TSDB.

Dashboard — Métriques

Créez deux dashboards distincts (aucune utilisation de la Marketplace Grafana) :

Dashboard kube-state-metrics :

  • Variable de dashboard permettant de filtrer sur un ou plusieurs namespaces Kubernetes
  • Histogramme CPU : consommation, limits et requests des pods
  • Histogramme Memory : consommation, limits et requests des pods
  • Bar chart TOP 10 des plus gros consommateurs de ressources

Dashboard node-exporter :

  • Métriques système issues exclusivement de node-exporter (CPU, RAM, disque, réseau)

Dashboard — Logs

Créez un dashboard dédié aux logs (aucune utilisation de la Marketplace Grafana) :

  • Listing de l'ensemble des logs
  • Filtres sur les champs pertinents : log_level, service_name, contenu du message, etc.

Attention à la cardinalité

L'indexation de champs à haute cardinalité (ex. UUIDs, IPs, timestamps) est coûteuse en ressources. Choisissez vos labels avec soin.

Partie 4 — AlertManager

Installation et configuration générale

Installez AlertManager via Helm et configurez au minimum un sink de notification (SMS, e-mail, Slack, Discord, PagerDuty…).

Exigences sur les templates d'alertes :

  • Utilisation des Go templates pour enrichir le contenu des notifications
  • Titre précis et description détaillée (exploitation de .Labels, .Annotations, .Value…)
  • Variables utilisées pour rendre les templates réutilisables

Alertes — Métriques

Implémentez les quatre règles PromQL suivantes, chacune devant être déclenchable en démo orale :

# Alerte Description
1 PodHighRAMUsage Pod dépassant un seuil critique de consommation RAM
2 PodHighCPUUsage Pod dépassant un seuil critique de consommation CPU
3 HPAAtMaxReplicas HPA ayant atteint son nombre maximum de réplicas
4 UnhealthyPods Pods unhealthy ou pourcentage de pods en ImagePullBackOff / CrashLoopBackOff

Alertes — Logs

Développez un service applicatif dédié à la génération de logs :

  • Le service émet des logs de niveaux variés en continu (INFO, DEBUG, WARN, etc.)
  • Il expose un endpoint ou utilise un mécanisme (ex. randomInteger, appel API) pour déclencher à la demande un log de niveau WARN, ERROR ou FATAL sur stdout
  • Une règle d'alerte doit se déclencher sur un niveau de log précis (ERROR ou FATAL)

Partie 5 — Stack de monitoring — Logs

Choix de la solution

Effectuez un benchmark des solutions de collecte de logs (Loki + Promtail, Loki + Alloy, OpenTelemetry Collector…) et justifiez votre choix.

Configuration

  • Remontez tous les logs, à l'exception des niveaux DEBUG et assimilés (trop verbeux, sans valeur opérationnelle)
  • Configurez le parsing des logs applicatifs côté Vector afin d'extraire des champs structurés (log_level, service_name, etc.)
  • Ces champs doivent être filtrables depuis Grafana (LogQL ou équivalent)

Tip

Le filtrage des niveaux DEBUG et le parsing structuré doivent être gérés dans la configuration Vector, pas côté Grafana.

Partie 6 — Gateway API & Exposition HTTPS

Objectif

Exposez Grafana publiquement en passant par la Gateway API Kubernetes — à ne pas confondre avec une API Gateway applicative.

Routing

Instanciez les ressources Gateway API nécessaires :

  • GatewayClass (si requis par votre implémentation — Cilium, Traefik, Envoy Gateway, NGINX Gateway Fabric…)
  • Gateway
  • HTTPRoute configurée depuis le chart Grafana pour router le trafic entrant

Sécurité TLS

  • Configurez le TLS sur la Gateway (pas de HTTP exposé en clair)
  • Obtenez un certificat valide via l'une des deux options suivantes :
  • Le certificate manager natif de votre cloud provider
  • Le chart cert-manager avec une ClusterIssuer Let's Encrypt (ACME)
  • La rotation automatique des certificats doit être configurée et documentée

Grille d’évaluation

Barème sur 20 points

Partie Critère évalué Description Points
P1 Cluster K8s managé fonctionnel Cluster accessible, nodes ready, contexte kubeconfig valide 0.5
P1 Infra 100% as-code via Terraform Providers configurés, state propre, plan idempotent 1
P1 Qualité du code Terraform Modules, variables, outputs, README, peu de magic strings 0.5
P2 Benchmark solutions métriques Comparaison Prometheus / VictoriaMetrics / Thanos / Mimir, choix justifié 0.5
P2 Installation TSDB + exporters TSDB + node-exporter + kube-state-metrics via Helm séparé 1
P2 Pipeline KSM → Vector → TSDB Métriques kube-state-metrics présentes dans TSDB 1
P2 Pipeline NE → Agent → Vector → TSDB ServicePodMonitor configuré, agent en mode correct, relabeling 1.5
P3 Grafana fonctionnel Datasource TSDB configurée, queries OK 0.5
P3 Dashboard kube-state-metrics CPU/RAM, filtres namespace, top 10, variables 1.5
P3 Dashboard node-exporter Métriques système cohérentes (CPU, RAM, disk, net) 1
P3 Dashboard logs Liste logs, filtres pertinents, cardinalité maîtrisée 1
P4 AlertManager configuré Alertes reçues (mail/Slack/etc.), routing OK 0.5
P4 Templates d’alertes Labels, annotations, messages enrichis 0.5
P4 4 PromQL opérationnelles RAM, CPU, HPA max, pods unhealthy 2
P4 Logs + alerting Génération logs + alerte déclenchée 1
P5 Benchmark stack logs Loki / Promtail / Alloy / OTEL, choix justifié 0.5
P5 Collecte logs filtrée Drop DEBUG/TRACE via Vector 1
P5 Parsing structuré logs Extraction log_level, filtres Grafana 1.5
P6 Gateway API GatewayClass + Gateway + HTTPRoute fonctionnels 1
P6 TLS actif Certificat valide, HTTPS + redirection 1
P6 Certificats automatisés cert-manager + ACME ou équivalent 1

Barème Bonus

Partie Critère évalué Description Points
Bonus 1 GitOps & Deploiement Automatisation de deploiement des charts via GitOps pattern (FluxCD ou ArgoCD) +1
Bonus 1-2 GitOps & Deploiement Automatisation de deploiement des charts via provider terraform ArgoCD par exemple +1
Bonus 2 - 1 Automatisation & Terraform Réaliser une pipeline & workflow pour le deploiement de votre infra +1
Bonus 2 - 2 Automatisation & Terraform Mise en place d'outils comme Atlantis ou Terrateam pour le travail collaboratif pour l'infra +1

Récapitulatif des points

Partie Intitulé Points
P1 Infrastructure 2
P2 Métriques 4
P3 Dashboards 4
P4 Alerting 4
P5 Logs 3
P6 Gateway & HTTPS 3
Total 20

Notes importantes

  • Type : Une démonstration orale (10-20 minutes) où vous montrerez le fonctionnement de l’ensemble : dashboards, alertes, exposition HTTPS...
  • Travail: Par groupe de 3
  • Rendu : Un rapport ou un README détaillé expliquant les choix techniques, les benchmarks, et les étapes de déploiement ou tout autre informations qui vous semble importants. Obligation de donner l'accès du repository Git en amont de la soutenance
  • Notation : /20

☕️ Si tu souhaites soutenir mon travail, tu peux m'offrir un café ici.