Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Kubernetes
  3. Usine logicielle
Extrait - Kubernetes Gérez la plateforme de déploiement de vos applications conteneurisées (2e édition)
Extraits du livre
Kubernetes Gérez la plateforme de déploiement de vos applications conteneurisées (2e édition)
2 avis
Revenir à la page d'achat du livre

Usine logicielle

Objectifs du chapitre et prérequis

Dans le chapitre précédent, vous avez abordé le principe de compilation d’une image Docker. L’accent va maintenant être mis sur l’automatisation de cette tâche. En effet, les images Docker sont rarement compilées manuellement.

Dans le cas de certains sites (GitLab ou GitHub), cette automatisation est prise en charge à l’aide de fichiers YAML à ajouter à la racine du dépôt Git. Un exemple avec GitLab sera présenté pour comprendre le principe de fonctionnement.

Une autre méthode sera présentée en s’appuyant sur Jenkins et prendra en charge également l’aspect déploiement continu. Le successeur Jenkins X sera également présenté de manière succincte.

Au niveau des prérequis, vous devrez avoir une connaissance minimale sur l’utilisation de Git comme par exemple :

  • ajouter un fichier,

  • modifier le contenu d’un dépôt,

  • pousser le contenu sur un dépôt distant (GitHub, GitLab, BitBucket, etc.),

  • mettre en place des hooks d’événements.

Compilation à l’aide de GitLab

1. Application à compiler

Dans ce qui suit, l’application Flask du chapitre précédent sera intégrée dans un repository GitLab.

Le seul ajout viendra du fichier .gitlab-ci.yml qui définira le lancement de la compilation des éléments du dépôt Git.

2. Mécanisme de pipeline GitLab

Le fichier .gitlab-ci.yml est un fichier au format YAML qui se trouve à la racine du dépôt. Il contient des instructions à utiliser pour construire les éléments du dépôt Git.

À chaque changement, le pipeline de déploiement est déclenché et s’appuie sur un gestionnaire de tâches (Runner).

Comme le fichier .gitlab-ci.yml est stocké avec le code, il devient possible de compiler de vieilles versions du logiciel ou de maintenir des versions différentes en fonction des branches Git.

3. Adresse et contenu du dépôt

Le dépôt GitLab d’exemple est disponible à l’adresse suivante : https://gitlab.com/yannig.perre/flask-healthcheck

La récupération du contenu de ce dépôt se fait à l’aide de la commande suivante :

$ git clone https://gitlab.com/yannig.perre/flask-healthcheck.git 

À la racine de ce dépôt, vous pourrez trouver les éléments suivants :

  • Les fichiers de l’application Flask du chapitre précédent.

  • Les instructions de compilation dans le fichier .gitlab-ci.yml.

4. Structure du fichier .gitlab-ci.yml

Par défaut, un fichier de construction GitLab contient trois phases :

  • La phase build en charge de la compilation.

  • La phase test en charge du lancement des tests.

  • La phase deploy en charge du déploiement.

Ces phases seront exécutées dans cet ordre et le rattachement à ces phases se fait à l’aide du mot-clé stage au niveau d’une tâche (job).

Une tâche est une déclaration de YAML pouvant contenir les champs suivants :

  • before_script : à exécuter avant le script.

  • script : commande à exécuter.

  • after_script : à exécuter en fin de script.

Ci-dessous un exemple de déclaration d’une tâche my-task lancée durant la phase build :

my-task: 
   stage:...

Déploiement continu avec Jenkins

1. À propos de Jenkins

Dans ce qui va suivre, le logiciel Jenkins sera mis en place dans Kubernetes.

Des exemples seront mis en œuvre afin de créer un pipeline de construction d’images Docker ainsi qu’un mécanisme de mise à jour automatique.

Tout comme pour GitLab, ce chapitre n’a pas pour vocation de présenter de fond en comble le fonctionnement de Jenkins. Il s’agit plutôt d’un guide pour quelqu’un ayant déjà une première expérience sur le sujet.

Pour plus de détails, n’hésitez pas consulter le site de Jenkins à l’adresse suivante : https://jenkins.io

2. Installation de Jenkins

a. Configuration du chart

L’installation de Jenkins se fera à l’aide du chart Helm jenkins/jenkins. Afin de le rendre accessible de l’extérieur, le master sera exposé à l’aide du mécanisme Ingress.

Ajoutez tout d’abord la source de paquets Jenkins :

$ helm repo add jenkins https://charts.jenkins.io 

Ci-dessous la configuration à utiliser pour exposer le master sur Internet à l’adresse https://jenkins.eni.yannig.ovh avec création d’un certificat SSL/TLS :

controller: 
 ingress: 
   enabled: true 
   apiVersion: "networking.k8s.io/v1" 
   annotations:  
     kubernetes.io/tls-acme: "true" 
     cert-manager.io/cluster-issuer:...

Pipeline de déploiement continu avec Jenkins

1. Prérequis

Pour les exemples qui vont suivre, le dépôt Git https://github.com/Yannig/eni-kubernetes.git sera utilisé. Charge à vous de changer l’adresse pour pointer vers un dépôt Git lui appartenant.

2. Présentation du mécanisme de déploiement continu

Dans Jenkins, un pipeline de déploiement continu est un programme écrit en Groovy qui va piloter le déroulement d’un déploiement. Un déploiement se déroule généralement de la manière suivante :

  • récupération du code source,

  • compilation du programme,

  • sauvegarde du résultat de la compilation,

  • mise à jour de l’application sur l’environnement de déploiement continu.

Le pipeline d’exemple reprendra ces grandes phases.

Schéma de principe du pipeline de déploiement continu

Schéma de principe du pipeline de déploiement continu

L’application à construire est stockée dans le sous-répertoire flask-healthcheck. Cette application est une application Flask qui dispose d’un fichier Dockerfile.

Cette image sera stockée sur le registre public de Docker sous le nom yannig/flask-healthcheck

3. Stockage des identifiants Docker

Afin de pouvoir pousser l’image compilée sur Docker Hub, un secret sera créé dans l’espace de noms de Jenkins.

 Créez ce secret à l’aide de la commande suivante :

$ kubectl create secret docker-registry docker-hub-cred \ 
  --docker-server=docker.io \ 
  --namespace=jenkins \       
  --docker-username=yannig \ 
  --docker-password=xxx 

4. Création de l’environnement develop

Afin de mettre à jour en continu une version de l’application, l’espace de noms develop sera créé avec un déploiement de test.

 En premier lieu, créez l’espace de noms :

$ kubectl create ns develop 

 Dans cet espace de noms, créez un déploiement de test de l’image yannig/flask-healthcheck en version latest :

$ kubectl -n develop create deployment \ 
              --image yannig/flask-healthcheck:latest test 

5. Création du pipeline

a. Création du pod de compilation

La première chose que fera le pipeline...

Un mot sur Jenkins X

La mise en place d’un processus d’intégration et de déploiement continu à l’aide de Jenkins dans Kubernetes réclame un certain savoir-faire :

  • Choisir les extensions Jenkins.

  • Gérer la mise en place des droits.

  • Orchestrer les opérations à l’aide du pipeline.

Jenkins X propose une réponse plus simple à mettre en œuvre pour un développeur en prenant en charge les aspects communication/création du cluster Kubernetes. L’utilisateur peut ainsi se concentrer sur sa tâche principale : le développement.

N’hésitez pas à consulter les adresses suivantes pour en savoir plus sur ce logiciel :