Accueil Nos publications Blog Environnements Kubernetes : la recette pour ton déploiement continu

Environnements Kubernetes : la recette pour ton déploiement continu

Kubernetes

Sommaire

  1. Introduction
  2. Préparation et configuration initiale
  3. Démarrage de terraform, et premier déploiement sur Kubernetes
  4. Automatisation du routage et gestion dynamiques des URLs
  5. Sécurisation !
  6. Optimisation des ressources
  7. Conclusion

Introduction

Retrouvez le témoignage de Mohamed sur son expérience lors du Hands-on Lab de Devoxx France 2024. Ce laboratoire fut une immersion dans Kubernetes, nous guidant à travers la création, la configuration et la sécurisation d’environnements de déploiement continus.

Le workshop, structuré comme une recette de cuisine, permet d’intégrer des outils essentiels tels que Flux, cert-manager, kube-downscaler, et Kyverno dans la boîte à outils Kubernetes et de construire des environnements robustes prêts pour les développements et tests.

L’expertise de Matthieu Vincent et Thomas Jouve a transformé un sujet complexe en une expérience accessible et enrichissante, faisant de ce Hands-on Lab un moment inoubliable et instructif pour tous les participants.

Préparation et configuration initiale

Dans cet atelier dédié à Kubernetes, nous sommes guidés à travers la création, la configuration et la sécurisation d’un cluster et d’autres aspects essentiels pour préparer des environnements de test et de développement prêts à être déployés. Ce workshop offre une expérience complète pour construire un ensemble d’outils pratique, agrémenté d’éléments tels que Flux, cert-manager, kube-downscaler, Kyverno, et bien d’autres encore.

Présenté sous la forme d’une recette de cuisine, ce workshop simplifie le processus en le comparant à la préparation d’un plat : il suffit de mêler les ingrédients et de manier les ustensiles pour obtenir un cluster Kubernetes parfaitement configuré.

L’équipe propose deux options pratiques : utiliser leur ensemble d’outils déjà préparé sur GitPod, ou travailler en local en installant quelques pré-requis tels que git, kubectl, helm, curl et terraform. Avant de commencer, un dernier contrôle est effectué, suivi d’une initialisation des variables d’environnement via un script téléchargé via “curl”, garantissant ainsi que toutes les conditions nécessaires sont réunies pour démarrer sans accroc.

Kubernetes

Démarrage de terraform, et premier déploiement sur Kubernetes

Dans le chapitre consacré à Terraform, nous sommes plongés dans le processus de création d’un cluster Kubernetes. Tout débute par l’initialisation de l’environnement Terraform, suivi de directives claires pour nommer le cluster en respectant des règles de nommage strictes. Nous apprenons ensuite à planifier et déployer notre configuration sans erreur. Une fois le déploiement réussi, le chapitre nous guide à travers l’extraction et la configuration du fichier kubeconfig, essentiel pour interagir avec le nouveau cluster. La vérification de la connexion au cluster conclut ce processus, illustrant son importance pour garantir un fonctionnement optimal. Cette présentation est conçue pour que les participants puissent savourer une pause-café pendant que les ressources se mettent en place, mettant en lumière l’efficacité et la simplicité du processus grâce à Terraform.

Dans le même registre, le chapitre d’introduction inaugure le premier déploiement dans le cluster Kubernetes avec un exemple ludique : un cinéma en ASCII. Après avoir replacé le contexte à la racine du répertoire, nous procédons au déploiement d’une application simple via un fichier YAML, ce qui engendre la création d’un espace de noms, d’un déploiement et d’un service dans le cluster. Une fois le déploiement confirmé, nous apprenons à vérifier son état et à accéder à l’application via un tunnel local, permettant ainsi de visualiser le cinéma ASCII sur notre navigateur local. Le chapitre s’achève sur une anticipation des besoins futurs, soulignant la nécessité d’une solution plus pratique pour les accès externes et le travail d’équipe, et suggérant l’introduction d’un Ingress et d’un Ingress Controller pour faciliter ces interactions.

Automatisation du routage et gestion dynamiques des URLs

Cette partie de notre étude se focalise sur la gestion des Ingress au sein de notre cluster Kubernetes, en utilisant le ingress-nginx-controller pour automatiser le routage des requêtes externes. Après avoir ajouté le repository Helm et effectué la mise à jour nécessaire, l’installation du contrôleur est un succès, ce qui témoigne de l’intégration harmonieuse de l’infrastructure requise pour prendre en charge l’exposition sécurisée des services. Une fois les composants déployés, nous procédons à une vérification minutieuse de l’installation et du bon fonctionnement de chaque élément. Par la suite, un nouveau déploiement est effectué, cette fois-ci avec un Ingress, offrant une solution simplifiée pour l’accès aux applications sans avoir besoin de recourir au port-forwarding :

Kubenetes

Nous testons l’accès au pod via curl :

Kubernetes

Et nous obtenons ce résultat :

Kubernetes

La conclusion de ce chapitre met en lumière une amélioration potentielle grâce à l’utilisation de external-dns pour la résolution automatique des noms de domaine. Cette discussion souligne l’évolution constante de notre configuration, visant à accroître l’efficacité et l’accessibilité de nos services.

Nous abordons ensuite la gestion avancée des URLs au sein de notre cluster Kubernetes grâce à external-dns, qui permet une résolution DNS dynamique pour les Ingress. Le processus démarre par la création d’un ServiceAccount dédié et d’autres ressources RBAC afin de garantir le bon fonctionnement de external-dns. En utilisant Cloudflare comme fournisseur DNS, nous configurons les secrets nécessaires pour l’authentification API, puis déployons external-dns à l’aide d’un manifest détaillé spécifiant les paramètres adaptés à notre environnement. Une fois opérationnel, external-dns automatise la création de records DNS pour nos services, démontrant ainsi sa capacité à détecter et à appliquer les configurations d’Ingress. Les résultats de cette automatisation sont immédiatement perceptibles.

Kubernetes

Confirmé par les logs et les tests DNS, il est établi que nos services Kubernetes sont désormais accessibles via des URLs publiques :

Résultat :

Ce chapitre se conclut sur une note de sécurité, rappelant l’importance de passer à HTTPS pour protéger nos communications.

Sécurisation !

Naturellement, ce chapitre se concentre sur la sécurité, en particulier sur la gestion des certificats SSL avec cert-manager pour sécuriser les communications de notre cluster Kubernetes. Après avoir ajouté le repository Helm et effectué la mise à jour nécessaire, nous procédons à l’installation de cert-manager dans un namespace dédié, garantissant ainsi que tous les composants nécessaires sont opérationnels. Ensuite, nous configurons un ClusterIssuer avec Let’s Encrypt pour automatiser la création de certificats SSL, en établissant les configurations nécessaires pour que cert-manager puisse interagir avec l’ACME server de Let’s Encrypt. Cette configuration permet à cert-manager de générer un certificat pour notre Ingress sécurisé, utilisant le challenge HTTP-01. Après un court délai, les certificats passent à l’état prêt, permettant un accès sécurisé via HTTPS à nos services.

Ensuite, nous abordons la sécurisation des secrets dans notre cluster Kubernetes en utilisant external-secrets, un outil qui permet de déléguer la gestion des secrets à des services externes comme GitLab ou HashiCorp Vault. Après l’installation d’external-secrets via Helm dans un namespace dédié, nous configurons un SecretStore qui se connecte à GitLab pour gérer les secrets. Cette configuration nous permet de synchroniser les secrets stockés dans GitLab avec notre cluster, illustrée par la création d’un ExternalSecret pour gérer les identifiants de Cloudflare. Une fois les secrets synchronisés et validés, nous mettons à jour notre configuration d’external-dns pour utiliser ces nouveaux secrets, en remplaçant les anciens. Ce processus renforce la sécurité de notre infrastructure en minimisant l’exposition directe des clés d’API et en améliorant la gestion des accès aux informations sensibles.

Enfin, nous nous concentrons sur l’utilisation de Kyverno pour gérer les politiques de sécurité dans Kubernetes. Nous installons Kyverno et configurons une politique pour restreindre les images Docker aux registres approuvés. Nous utilisons également un ExternalSecret pour gérer les secrets de tirage d’images de manière sécurisée et automatisée. Une seconde politique Kyverno assure que ces secrets sont générés automatiquement dans tous les nouveaux namespaces, renforçant ainsi la sécurité du cluster. La validation de ces politiques montre leur efficacité en bloquant les images non autorisées et en synchronisant les secrets nécessaires.

Optimisation des ressources

Pour ajouter une dimension Green-IT à notre recette, nous mettons en place kube-downscaler afin d’optimiser la gestion des ressources en éteignant les workloads pendant les périodes de faible activité. Après avoir apporté quelques modifications nécessaires aux fichiers de configuration, nous déployons kube-downscaler via kustomize. L’outil est configuré pour réduire l’activité des pods dans le namespace “demos” uniquement pendant des heures spécifiques le lundi, ce qui permet de minimiser l’utilisation des ressources en dehors des heures de pointe. Les tests confirment que kube-downscaler éteint effectivement les déploiements comme prévu, démontrant ainsi son utilité pour gérer efficacement les ressources du cluster en période de faible demande.

Conclusion

En conclusion, nous récapitulons la recette complète pour créer un cluster Kubernetes efficace et sécurisé. Nous débutons par l’instanciation du cluster avec Terraform, suivi de la gestion de l’accès externe via un ingress-controller (nginx). Pour une résolution DNS automatique, nous implémentons external-dns, et nous sécurisons les communications avec des certificats SSL via cert-manager. Les secrets sont gérés de manière externe grâce à external-secrets, tandis que Kyverno veille à surveiller et à appliquer les politiques de sécurité. Après un travail productif, nous utilisons kube-downscaler pour réduire les coûts en désactivant les workloads inutilisés. Ce chapitre illustre également comment ces technologies facilitent la visualisation et la gestion des environnements de déploiement dans GitLab, ainsi que l’approche GitOps avec Flux pour automatiser toute la configuration et la maintenance des clusters.

Matthieu Vincent et Thomas JOUVE, les deux très faux jumeaux, ont élaboré une recette simple qui pourrait aisément devenir une checklist de référence pour un déploiement Kubernetes conforme aux meilleures pratiques.

Vous souhaitez en savoir plus ? Contactez-nous !