L’objectif de ce TP est de faire la démonstration pratique de la plupart des éléments techniques appris durant le cursus DevOps.
L’activité de DevOps dans une équipe est une activité de support au développement et d’automatisation des divers éléments pratiques nécessaire au bon fonctionnement d’une application. Elle est par nature intégrative.
Ce TP consiste donc logiquement à rassembler les aspects pratiques (éléments vus en TP) découverts dans les modules du cursus et de les combiner autour d’une infrastrure Kubernetes pour réaliser en particulier une CI/CD de notre application utilisant Jenkins.
Attention :
Toutes les parties ne sont pas forcément obligatoire. L’appréciation sera globale. Les bonus sont des idées de personnalisation à réaliser si vous avez le temps et le courage.
Ce sujet de TP est loin d’être simple :
Le sujet est succeptible d’évoluer au fur et à mesure en fonction de vos retours et demandes d’information.
Les parties de la fin du cursus (Jenkins et peut-être le Monitoring et/ou AWS et/ou Ansible) seront ajoutées par la suite.
N’oubliez pas de vous reposer pendant les vacances !!
Le rendu du TP est à effectuer par groupe.
Pour chaque groupe les éléments suivant devront être présentés lors de la présentation finale du cursus:
Une présentation décrivant les différents élements de l’infrastructure et leurs objectifs ainsi que les choix réalisés lors de la réalisation.
On peut se servir de diapositives afin d’avoir un support oral. L’idée est de voir la gestion du temps, l’expression orale et évidemment le côté technique. Et attention, à la répartition de parole dans le groupe, chacun doit occuper sa place.
La qualité des diapositives est notée également.
La présentation dure 20mn, 10mn de plus de questions du jury, 5 mn de délibération du jury sans les stagiaires et 5 mn de compte rendu au groupe de la part du jury.
Pas de rapport écrit à part les diapositives.
Mettre en œuvre un système d’intégration continue et de déploiement DevOps
Construire une image capable de servir à l’application
Automatiser la construction d’images
Mettre à jour et déployer automatiquement des images
Une installation fonctionnelle de l’infrastructure et de l’application du TP installé sur cette infrastructure telle que décrite dans l’énoncé suivant.
Deux dépots de code sur Github ou Gitlab contenant pour le premier le code d’infrastructure et pour le second l’application à déployer sur l’infrastructure.
Une infrastructure est généralement composée de machines virtuelles pour la flexibilité, qu’elles soient louées chez un provider de cloud comme Amazon Web Service ou créées à l’aide d’un hyperviseur comme Virtualbox (ou VMWare ou Proxmox etc).
Dans ce TP nous allons utiliser Virtualbox pour créer un ou plusieurs serveurs (selon vos préférences, voir bonus kubernetes installation dans la suite). Pour respecter les bonnes pratiques de l’infrastructure as code et pouvoir partager et reproduire l’installation nous aimerions créer ces machines virtuelles à l’aide de code descriptif. L’outil adapté pour cela s’appelle Vagrant
.
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install vagrant
tp_fil_rouge_infra
et ajoutez à l’intérieur un fichier Vagrantfile
contenant le code suivant:Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |v|
v.memory = 2048
v.cpus = 2
end
config.vm.define :master do |master|
# Vagrant va récupérer une machine de base ubuntu 20.04 (focal) depuis cette plateforme https://app.vagrantup.com/boxes/search
master.vm.box = "ubuntu/focal64"
master.vm.hostname = "master"
master.vm.network :private_network, ip: "10.10.0.1"
end
end
vagrant --help
ou vagrant <commande> --help
pour découvrir les possibilités de la ligne de commande vagrant).Remarques pratiques sur Vagrant :
Vagrantfile
à l’intérieur de la VM dans le dossier /vagrant
. Les scripts et autres fichiers sont donc directement accessibles dans la VM.En vous aidant du tutorial suivant (jusqu’à la partie 5, avant la partie certbot): https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-20-04-fr
Installez dans la machine virtuelle Vagrant précédente une application web flask (par exemple celle proposée dans le tutoriel).
Rassemblez les étapes d’installation dans un script shell (à ajouter dans le dossier d’infra).
Vérifiez que votre script d’installation fonctionne en détruisant et recréant la machine virtuelle (vagrant destroy
) puis en lançant le script en ssh.
(facultatif) Vous pouvez même ajouter le script directement au Vagrantfile
, après la ligne master.vm.network :private_network, ip: "10.10.0.1"
avec la syntaxe suivante (cf. la documentation):
master.vm.provision :shell, privileged: false, inline: <<-SHELL
commande1
commande2
etc
SHELL
Sur votre serveur, installez/scriptez en plus de la précédente, l’application flask microblog
du Flask Mega Tutorial avec une base de donnée MySQL. Voir ce lien tutoriel : https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvii-deployment-on-linux.
Personnalisez votre application Flask / Python avec une ou des pages en plus ou une fonctionnalité en plus
Versionner le code de l’application précédente avec Git. Créer un dépôt sur Github ou Gitlab.
maintainer
.develop
, une branche main
(production).develop
ou main
dans le futur mais en utilisant sa branche.develop
et/ou main
.Répétez les étapes précédentes en créant un dépôt pour le code d’infrastructure.
Ces deux dépôts serviront pour la présentation finale de votre code.
Écrire à l’avance des issues (au fur et a mesure plutôt que toutes au départ) pour décrire les prochaines étapes à réaliser.
Utilisez pour la suite du TP des branches pour les issues.
main
sans passer par develop
(les feature branches remplacent la branche develop
) en effectuant des pull request Github ou merge requests Gitlab.Utilisez le wiki Github ou Gitlab du dépôt d’infrastructure pour documenter votre infrastructure et servir de support à la présentation finale.
En s’aidant du TP2 et TP4 du module Docker, et de votre script d’installation existant :
docker-compose.yml
. pour lancer l’application.HEALTHCHECK
au Dockerfile pour tester si votre app va bien.En suivant/vous inspirant des TP kubernetes et de la partie 0.
En repartant du Vagrantfile de la partie 0 : utilisez la commande master.vm.provision
comme indiqué dans la partie 0 ci-dessus pour installer k3s avec la commande curl -sfL https://get.k3s.io | sh -
.
(facultatif) Trouvez comment supprimer l’ingress Traefik de k3s et installez à la place un ingress nginx plus classique (pour pouvoir exposer l’application web à l’extérieur).
(facultatif) Installez cert-manager comme dans le TP avec un générateur de certificat auto-signé : https://cert-manager.io/docs/configuration/selfsigned/
k8s
du dépôt d’application.