Techniques logicielles pour le Cloud Computing
===
[Lien vers cette page](https://hackmd.diverse-team.fr/s/SJqu5DjSD)
<a id="objectif"></a>
# Objectif
Le but du cours est de se familiariser avec la notion de *ops* dont vous avez entendu parler dans l'acronyme *devops*. *Le DevOps peut se définir comme un processus d'alignement des équipes informatiques qui combine « *Dev* » (en charge des améliorations, nouvelles fonctionnalités et changements applicatifs) et « *Ops* » (en charge de l'exploitation des applications et des infrastructures)*[1]. Le mouvement Devops se caractérise principalement par la promotion de l'automation et du suivi (monitoring) de toutes les étapes de la création d'un logiciel, depuis le développement, l'intégration, les tests, la livraison jusqu'au déploiement, l'exploitation et la maintenance des infrastructures [2]. Dans un contexte cloud et dans un contexte où les applications sont prévues pour le cloud (applications dites *cloud-native*) alors, il est important de comprendre les problématiques de déploiement, d'exploitation et de maintenance des infrastructures. C'est l'objectif de ce cours.
[1] https://www.journaldunet.com/solutions/dsi/1208029-dev-et-ops-une-alliance-impossible/
[2] https://fr.wikipedia.org/wiki/Devops
Dans l'idéal, à fin du cours, vous maîtrisez l'ensemble de [ces concepts et technologies associées](https://landscape.cncf.io/). C'est évidemment pour rire, mais cela vous montre l'étendu du domaine du monde du *cloud native*.
---
<a id="plan"></a>
# Plan
- [Objectif](#objectif)
- [Plan](#plan)
- [Déroulement du cours](#d-roulement-du-cours)
- [Cours](#cours)
* [**Course 1**: Introduction à la notion de cloud computing (Olivier)](#Course-1-Introduction-à-la-notion-de-cloud-computing-Olivier)
* [**Course 2**: Some Facts on Modern Developments (Benoit Combemale)](#Course-2-Some-Facts-on-Modern-Developments-Benoit-Combemale)
* [**Course 3**: Docker: une solution unifiée pour faciliter le déploiement de vos applications modularisées sous forme de micro-services](#Course-4-Docker-une-solution-unifiée-pour-faciliter-le-déploiement-de-vos-applications-modularisées-sous-forme-de-micro-services)
* [**Course 4**: De la notion de micro-services à la problématique de la gestion des APIs (En souvenir de TAA ;)=](#Course-3-De-la-notion-de-micro-services-à-la-problématique-de-la-gestion-des-APIs-En-souvenir-de-TAA-)
* [**Course 5**: Infrastructure as code](#Course-5-Infrastructure-as-code)
* [**Course 6** : La méthodologie 12factor](#Course-6--La-méthodologie-12factor)
* [**Course 7** : Kubernetes](#Course-7-Kubernetes)
* [**Course 8**: Web app ops what does it mean ?](#Course-8-Web-app-ops-what-does-it-mean-)
* [**Course 9**: Quarkus: understanding the requirement for cloud native apps](#Course-9-Quarkus-understanding-the-requirement-for-cloud-native-apps)
* [**Course 10**: Monitoring of running applications](#Course-10-Monitoring-of-running-applications)
- [Labs](#labs)
* [**TP1 Docker**](#TP1-Docker)
+ [Etape 1: se familiariser avec Docker](#Etape-1-se-familiariser-avec-Docker)
+ [Etape 2: LoadBalancer with Docker + une image docker pour vos applications](#Etape-2-LoadBalancer-with-Docker--une-image-docker-pour-vos-applications)
* [**TP2 Ansible**](#tpansible)
* [**Projet**](#projet)
+ [Backlog du projet](#Backlog-du-projet)
- [Evaluation](#Evaluation)
- [Other relevant videos](#Other-relevant-videos)
- [References](#References)
- [Questions réponses](#questions-r-ponses)
<a id="d-roulement-du-cours"></a>
---
# Déroulement du cours
Si nous fournirons quelques contenus vidéos au départ, la majorité du cours suivera une [pédagogie par projet](https://www.bienenseigner.com/la-pedagogie-de-projet/). Cela veut dire que l'on partagera du contenu et des informations aussi en fonction de votre avancé.
---
<a id="cours"></a>
# Cours
## **Course 1**: Introduction à la notion de cloud computing (Olivier)
- [Slides](https://uniren1.sharepoint.com/:b:/s/M2ILCCN/ERArfidNLNlDrVQXFgs4GasB4Sth-JrLQXl_5NpQe9wKew)
- [Vidéo](https://drive.google.com/file/d/1KBsp9noRrRCrPwHPNVq2B5gkwat54jCD/preview)
**Conclusion**: Cloud native app, kesako ?
> A cloud-native technology enables you to build and to run your scalable app in a dynamic environment: a public, private, or hybrid cloud.
## **Course 2**: Some Facts on Modern Developments (Benoit Combemale)
State of the Practice (large-scale, polyglot, short term delivery…)
DevOps: current scope, concepts and principles. (Benoit)
- [Slides](https://people.irisa.fr/Benoit.Combemale/pub/course/devops/2020-DLC-DevOps101-lr.pdf)
- [Vidéo](https://youtu.be/47kTURt5CdM)
## **Course 3**: Les conteneurs docker: une solution unifiée pour faciliter le déploiement de vos applications modularisées sous forme de micro-services
- [Slides](https://drive.google.com/file/d/1S1Di_ZL76yOKpDZSB8uaDncQ3NgItZ0O/view?usp=sharing)
- [Introduction: Docker c'est quoi, à quel problème cela répond](https://drive.google.com/file/d/1x3fw72g33nbnGYgvgu8Cx8ndItIh7ac3/preview)
- [Docker, les dessous de l'iceberg](https://drive.google.com/file/d/1JAjRAyVvzoBR73syry6uayp0QFhApsNK/preview)
## **Course 4**: De la notion de micro-services à la problématique de la gestion des APIs (En souvenir de TAA ;)=
- [Slides](http://olivier.barais.fr/microservicescourses/)
- [Cours Vidéo 1: Introduction à la notion d'application cloud native](https://drive.google.com/file/d/19gr9XsZnyI8ebxVADsdD2M5wAw41so-p/preview)
- [Cours Vidéo 2: Notion de micro-services](https://drive.google.com/file/d/1NqlkVG_fejyJ0xDlRCuQgdIh4TJcS-cU/preview)
- [Cours Vidéo 3: Des API Web bien définies](https://drive.google.com/file/d/1dpLpvuJaznt9-XBSNKBUzaaSCxA3rnYp/preview)
- [Cours Vidéo 4: Continuous Delivery](https://drive.google.com/file/d/15WBR7Jso4OcCNMF9qErHEGFHoC8KcAa8/preview)
- [Cours Vidéo 5: Première conclusion sur la notion de Cloud Native](https://drive.google.com/file/d/1k_xOlctexiOSSCssEzxiOVbpTCAPchoD/preview)
## **Course 5**: Infrastructure as code
- [teaser](https://drive.google.com/file/d/18GZyiRPWNXaD9wr63K-4EwbnzioqUCzc/preview)
- **Infractructure As Code**
- [IAC slides](https://drive.google.com/file/d/1o4mhskfB0qOiZGJp4H5ZAUvAbfz6Z-ZI/view)
- [Infractructure As Code course](https://drive.google.com/file/d/1gsGlvVR8naoGn0WWFMXApB2KzJDtRVm7/preview)
- **Ansible**
- [Ansible slides](https://docs.google.com/presentation/d/10C-z8CDD4loNIZ6TGQwOj9sPUICl7T7Eirzd6PYKVU4/edit?usp=sharing)
- [Ansible demo](https://github.com/barais/demoAnsible)
- [Ansible videos]()
## Course 6 : La méthodologie 12factor
À l’époque actuelle, les logiciels sont régulièrement délivrés en tant que services : on les appelle des applications web (web apps), ou logiciels en tant que service (software-as-a-service). L’application 12 facteurs est une méthodologie pour concevoir des logiciels en tant que service qui :
- Utilisent des formats déclaratifs pour mettre en oeuvre l’automatisation, pour minimiser le temps et les coûts pour que de nouveaux développeurs rejoignent le projet;
- Ont un contrat propre avec le système d’exploitation sous-jacent, offrant une portabilité maximum entre les environnements d’exécution;
- Sont adaptés à des déploiements sur des plateformes cloud modernes, rendant inutile le besoin de serveurs et de l’administration de systèmes;
- Minimisent la divergence entre le développement et la production, ce qui permet le déploiement continu pour une agilité maximum;
- et peuvent grossir verticalement sans changement significatif dans les outils, l’architecture ou les pratiques de développement;
La méthodologie 12 facteurs peut être appliquée à des applications écrites dans tout langage de programmation, et qui utilisent tout type de services externes (base de données, file, cache mémoire, etc.)
https://12factor.net/fr/
- [12 factors app slides](https://drive.google.com/file/d/1YXAwBSCMcdx-PcT7v_I7e3fXMsdZQ0Bh/view?usp=sharing)
- [12 factors app course intro](https://drive.google.com/file/d/1DQb66JZB-AeV3WjjzCdCNZBEZ7izeZqS/preview)
- [12 factors app course](https://drive.google.com/file/d/1tIaobk2MpY_nX8-8vDdJ2kBl9OFktvcZ/preview)
## Course 7: Kubernetes
- [slides](https://drive.google.com/file/d/15hOVMLiVdFcR2Vl6MvxnqrCcAsUtt9X7/view?usp=sharing)
- **vidéos**
- [K8S introduction](https://drive.google.com/file/d/1Z-GG63T8Dinig8Oa3khDHXUv7I5I3dda/preview)
- [K8S les concepts](https://drive.google.com/file/d/1gn4nPPwHaO_hLF0XbjFt6IufZTHBhL_n/preview)
- [K8S architecture et conclusion](https://drive.google.com/file/d/1MRbfW6vBmger8MmgjcG3ZILqeTS3zxIi/preview)
- [tutoriels](https://devopssec.fr/article/cours-complet-apprendre-orchestrateur-kubernetes-k8s)
## Course 8: Web app ops what does it mean ?
- How can I deploy web applications ?
Le but de ce cours est de se familiariser avec lesproblématiques de déploiement d'une application Web, comprendre la notion de :
- Reverse proxy
- dns
- server security,
- ...
0. [Plan de ces démos](https://drive.google.com/file/d/12ndvauRaEocWS6uPGbEN2zbaNrS47PXm/preview)
1. [Compilation / Optimisation de son application Web](https://drive.google.com/file/d/1IN0Ygq5XA0VWMn0UGd7MrGvT_GROH-dy/preview)
2. [Déploiement du JS/HTML/CSS sur votre serveur](https://drive.google.com/file/d/1j4N7s54AZHA6dHtsjMQjW6AtUbupt6f0/preview)
3. [Configuration du serveur Web (Nginx)](https://drive.google.com/file/d/1w3AagsKqCwyRq1Nk1yimKb9L0GL1XLwO/preview)
4. [Configuration du nom de domaine (sous domaine)](https://drive.google.com/file/d/166Q7vx4pju8GI4yUFkTnF-LNT3eP2AjR/preview)
5. [Mise en place des certificats pour la connexion https (letsencrypt)](https://drive.google.com/file/d/1Cn2g7TOinhLSdRY9FcuUiKEehm6F-Q32/preview)
6. [Mise en place du reverse proxy pour le back (si nécessaire)](https://drive.google.com/file/d/1njBb9ktsercTzOgo7stA-sv0SVWywQNL/preview)
7. [Mise en place d'un firewall (UFW)](https://drive.google.com/file/d/1-dk0nB3XG2IIa9KtJmAwyl1tRf8VRJFV/preview)
8. [Mise en place de fail2ban](https://drive.google.com/file/d/1e7yRrD66QVjYMdONAvqvpB9ATdhgTOsN/preview)
9. [Automatisation à l'aide de bunkerized nginx](https://drive.google.com/file/d/15xZbO07X8cPuvImilXsKcGKkfpzVYmdY/preview)
https://github.com/bunkerity/bunkerized-nginx
Je vous rappelle d'autres vidéos bien faite sur le sujet pour compléter ce cours
- [Mettre en place un serveur Web](https://www.youtube.com/watch?v=cfJh8vdKuQU&list=PLjwdMgw5TTLUnvhOKLcpCG8ORQsfE7uB4&ab_channel=Grafikart.fr)
- [Configurer nginx](https://www.youtube.com/watch?v=YD_exb9aPZU&ab_channel=Grafikart.fr)
- [Nginx: Mettre en place letsencrypt](https://www.youtube.com/watch?v=NXyE3mayrtg&ab_channel=Grafikart.fr)
- [Nginx : Se protéger des attaques Flood](https://www.youtube.com/watch?v=ge768xOLQJs&list=PLjwdMgw5TTLUnvhOKLcpCG8ORQsfE7uB4&index=22&ab_channel=Grafikart.fr)
- [Fail2ban c'est quoi](https://www.youtube.com/watch?v=-rmK50PbqCY&ab_channel=Grafikart.fr)
- [un firewall c'est quoi: configuration de ufw](https://www.grafikart.fr/tutoriels/ufw-696), [vidéo](https://www.youtube.com/watch?v=XnfMAU3zIew&ab_channel=Grafikart.fr)
## Course 9: Quarkus: understanding the requirement for cloud native apps
- [Slides du cours (Quarkus, Java coding made fun again)](https://docs.google.com/presentation/d/1YnC5eSrpa94v0P5-qg_y5NR5ArMpaJhurc6II7n5NME/edit?usp=sharing)
- [De Java à un exécutable natif : GraalVM et Quarkus changent la donne (Emmanuel Bernard)](https://www.youtube.com/watch?v=oMxztQBHp_A&ab_channel=DevoxxFR)
- [Quarkus: Comment faire une appli Java Cloud Native avec Graal VM (E. Bernard, C. Escoffier)](https://www.youtube.com/watch?v=S05WsHJZsYk&ab_channel=DevoxxFR)
## Course 10: Monitoring of running applications
- promotheus/kibana
- Elastick search stack
- datadog...
<a id="labs"></a>
---
# Labs
## TP1 Docker
Créer votre compte sur katacoda. Permet d'avoir un playground sans installer docker sur vos postes
### Etape 1: se familiariser avec Docker
- [Tutoriel Docker (à passer pour ceux qui ont déjà manipuler quelque peu)](https://docs.docker.com/get-started/)
### Etape 2: LoadBalancer with Docker + une image docker pour vos applications
En installant docker sur votre machine voir
https://olivier.barais.fr/teaching/2022-09-08-Operation_portable_M2_ISTIC
[sujet](https://github.com/barais/TPDockerSampleApp/)
**à rendre, le fichier dockercompose de l'étape 2 et le docker file de l'étape 3.**
<a id="tpansible"></a>
## TP Ansible
- [énoncé du TP Ansible](https://github.com/barais/demoAnsible/tree/main/ansibleLabsTLC)
<a id="projet"></a>
## Projet
Le but du projet est de mettre en place un chaine de déploiement automatisée d'une application Web développée dans des technologies cloud-native sur une infrastructure que vous pilotez.
L'application est une application de type doodle like qui offre la possibilité de déployer aussi une intégration avec un service de type etherpad pour la prise de notes de réunions. Nous souhaitons que vous fassiez au minimum le travail pour
- Faciliter son déploiement à l'aide de containers
- Faciliter sa configurabilité au déploiement (serveur smtp à utiliser, connexion à l'etherpad, ...)
- Faciliter sa sécurisation au moment du déploiement
Ces tâches là sont appélés le niveau 1 du projet dans le suite de ce texte.
Pour ceux qui veulent aller plus loin, vous pouvez explorer quatre autres pistes/aventures autour du cloud pour cette matière TLC. Ces trois pistes sont indépendantes et une, deux ou les trois de ces pistes peuvent être menées.
- Au choix:
- **Aventure 1**: Mettre en place un mécanisme de déploiement continue qui permette de déployer la nouvelle version de l'application automatiquement si un nouveau commit est activé sur le back ou le front. L'idée de ce travail est d'explorer les liens entre pratique devops (intégration/déploiement continue) et outil de déploiement en mode cloud native
- **Aventure 2**: Mettre en place des outils de monitoring avancés de cette application et des dashboard associés à ce monitoring
- **Aventure 3**: Utiliser K8S comme orchestrateur pour le déploiement de nos containers
- **Aventure 4**: mettre en place un identity provider et ou une passerelle d'API pour mettre de faire de l'accounting sur l'API de l'application
- Voici une petite [vidéo](https://drive.google.com/file/d/1GQbdgq2CHcddTlcoHqM5Zc8Dw5o_eeLg/preview) de présentation des fonctionnalités de l'application.
- Voici une petite [vidéo](https://drive.google.com/file/d/1l5UAsU5_q-oshwEW6edZ4UvQjN3-tzwi/preview) de présentation de l'architecture de l'application.
- Voici une petite [vidéo](https://drive.google.com/file/d/1jxYNfJdtd4r_pDbOthra360ei8Z17tX_/preview) de revue de code de l'application.
- Voici une petite [vidéo](https://drive.google.com/file/d/1P0_d4bLBDixLAg27FDweVB58qdaFW6GE/preview) pour aider à la compréhension du projet afin de comprendre le travail à faire sur les premières étapes.
Voici le [repo de code source](https://github.com/barais/doodlestudent) de cette application. Vous pouvez regarder le code source, le *back* est développé en [quarkus.io](https://quarkus.io/) et le front en [angular](https://angular.io/).
<a id="backlog-du-projet"></a>
### Backlog du projet
#### Niveau 1: minimum à faire
- **Tâche 0**. Créer une machine virtuelle (https://vm.istic.univ-rennes1.fr/ séléctionner **ubuntu20** comme image de base) et demandez l'accès externe vers le port *80* (http) et *443* (https) de votre machine virtuelle par le [helpdesk, catégorie ISTIC-ESIR - Tous problèmes informatiques](https://assistance.univ-rennes1.fr/), l'accès au port 22 se fera au travers du [VPN](https://istic.univ-rennes1.fr/intranet/services#section-4). Partager moi l'adresse IP de la machine et le sous domaine souhaité [ici](https://forms.gle/a7EfKraasGpTYAXa6) (sous domaine de *diverse-team.fr*). (Je mets jour quand c'est fait le [google doc joint](https://docs.google.com/spreadsheets/d/14Yv-3ujq9OL0HuYkj4Wlp9Piw5075b6iEKSf-yJWytc/edit?usp=sharing))
- **Tache 1**. Fournir un ou plusieurs docker file(s) et un ou plusieurs docker compose(s) pour cette application permettant de facilement déployer et configurer l'application. (Faites un fork du projet avant.)
:information_source: https://nearsoft.com/blog/how-to-synchronize-your-github-fork/
[1] [docker compose documentation](https://docs.docker.com/compose/)
[2] [docker file documentation](https://docs.docker.com/engine/reference/builder/)
:warning: Vous aurez du mal à avoir un fonctionnement correct à cette étape là. En effet, le code du front va faire ces requêtes *REST* à la même adresse que celui qui lui a fourni le code html, css et js pour éviter les problèmes de CORS. Il est donc nécessaire de se forcer à configurer le serveur nginx qui délivre le front pour faire *proxy_pass* quand il reçoit une requête sur la route */api* ou une sous route de */api*. Ne vous inquiétez pas, on configure cela à l'étape suivante.
- **Tâche 2**,
Il va falloir maintenant configurer le serveur Web du Front pour qu'il soit capable de servir de point d'entrée à l'ensemble des requêtes puis qu'il les *route* vers le bon service de Back. Il est possible de mettre en place un serveur Web spécifique pour gérer ce routing (on le nomme alors la gateway d'API). On peut aussi dans notre cas se servir du fichier nginx du front pour router les requêtes.
Nous fournissons trois examples de fichiers de configuration nginx pour configurer les trois services. Pour plus d'information sur la configuration nginx, RDV sur ce très bon [site Web](https://www.digitalocean.com/community/tutorials/understanding-the-nginx-configuration-file-structure-and-configuration-contexts) et [Proxy nginx explained](https://dev.to/danielkun/nginx-everything-about-proxypass-2ona).
```txt
server {
listen 80;
listen [::]:80;
# server name to change based on your own domain name for doodle
server_name doodle.tlc.fr;
location /api {
proxy_pass http://api:8080/api;
proxy_set_header Host $http_host;
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html?$args;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
```
```txt
server {
listen 80;
listen [::]:80;
# server name to change based on your own domain name for doodle
server_name myadmin.tlc.fr;
location / {
proxy_pass http://myadmin:80;
proxy_set_header Host $http_host;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
```
```txt
server {
listen 80;
listen [::]:80;
# server name to change based on your own domain name for doodle
server_name pad.tlc.fr;
location / {
proxy_pass http://etherpad:9001;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
```
- **Tâche 3**, déployer correctement une première fois votre application en configurant convenablement la partie DNS pour le reverse proxy, letsencrypt pour le certificat côté serveur et ufw pour le firewall sur votre machine virtuelle.
En gros vous allez prendre votre fichier docker-compose, votre fichier de configuration nginx, votre front et mettre cela sur votre vm. Mettre les bonnes variables de configuration dans ces deux fichiers. Vous aurez besoin soit de builder les images sur la vm soit de pushé vos images sur le docker_hub afin de pouvoir les *puller* depuis votre VM.
- **Tâche 4**, Documenter, à l'aide d'un diagramme de déploiement UML ou autre notation, le déploiement réalisé pour le moment sur votre machine virtuelle.
- Voici une petite [vidéo](https://drive.google.com/file/d/19CajZRTqBLtfBJDJUy4Z3MlDWKylDHfe/preview) pour aider à la compréhension de la première étape du projet, à savoir la construction d'un *DockerFile* pour le front.
- Voici une petite [vidéo](https://drive.google.com/file/d/1xkolZ30OV4LaY5ApFbx3lIrj9jMke2og/preview) pour aider à la compréhension de la première étape du projet, à savoir la construction d'un *DockerFile* pour le *back*.
- Voici une petite [vidéo](https://drive.google.com/file/d/1y_Z-idZm0Ql5ENUJmpV-sIpQZ4nEdkcL/preview) pour aider à la compréhension de la deuxième étape du projet, à savoir la défnition d'un *docker-compose* pour le déploiement de l'application.
- Voici une petite [vidéo](https://drive.google.com/file/d/1AWU-Ub5-c9PLZE8cII95q5I3_1zMFUdS/preview) pour aider à la compréhension de l'étape sur le déploiement de l'application avec K8S. [note de présentation accessible ici](https://hackmd.diverse-team.fr/s/ByQWRz0sw)
Vous pouvez maintenant choisir selon vos envies une, deux trois ou quatre de ces quatres aventures au choix.
#### Aventure 1: Decploiement continue à l'aide de gitlabCI et déploiement à l'aide de Docker.
- **Aventure 1**, mettre en place un mécanisme de déploiement continue qui permette de déployer la nouvelle version de l'application automatiquement si un nouveau commit est activé sur le back ou le front. Vous pourrez mettre en place votre outil d'intégration continue sur la même VM même si c'est une pratique de nous ne suivrions pas pour un déploiement réel. Vous avez le choix pour l'outil d'intégration continue.
Vous pouvez utiliser gitlabCI de l'ISTIC si vous avez mis le code dans un repo du gitlab de l'ISTIC. Vous pouvez alors créer votre propre runner gitlab ci ( https://docs.gitlab.com/runner/) ou utiliser travis sur github ou les runners de gitlab.com. Vous pouvez aussi déployer un jenkins sur votre machine si vous préférez.
#### Aventure 2: Chaîne de monitoring de l'application en production.
- **Aventure 2** mettre en place la chaine de monitoring de l'application à l'aide de Promotheus et grafana comme front
http://www.mastertheboss.com/soa-cloud/quarkus/monitoring-quarkus-with-prometheus.
Mettre en place le sous domaine et le certificat letsencrypt pour grafana.
Mettre en place munin pour la surveillance de votre machine virtuelle
#### Aventure 3: Utilisation de K8S comme orchestrateur d'un petit cluster
- **Aventure 3**, On souhaite maintenant utiliser kubernetes pour déployer l'ensemble des micro-services. Le but est de pouvoir comparer et comprendre les abstractions supplémentaires fournies par kubernetes par rapport à un seimple déploiement d'une application sur un seul noeud à l'aide de docker et docker-compose. En particulier, on souhaite ajouter de la redondance pour la partie back de l'application (redondance uniquement sur ce micro-service là. Surout pas sur la BD relationnelle, c'est plus compliqué et pas complètement transparent). Déployer donc microk8s sur votre VM.
- Utiliser kubernetes pour mettre en place un minimum de redondance pour le back de l'application (on ne clusterisera pas la BD dans un premier temps).
:information_source: Nous utiliserons https://microk8s.io/
Vous pouvez trouver quelques notes autour de microk8s [ici](https://hackmd.diverse-team.fr/s/ByQWRz0sw)
Vous pouvez utiliser le promotheus et les outils de monitoring de microk8s
#### Aventure 4: Mise en place d'un outils d'autentification et d'une passerelle d'API
- **Aventure 4**, mettre en place [keycloak](https://www.keycloak.org/getting-started/getting-started-docker) pour un accès sécurisé à vos ressources Web et/ou une passerelle d'API pour mettre de faire de l'accounting sur l'API de l'application. Je vous propose l'utilisation d'[ambassador](https://www.getambassador.io/)
- (https://blog.getambassador.io/explore-the-ambassador-api-gateway-with-microk8s-f75a7a295113)
:information_desk_person: Le projet est très/trop ambitieux. Allez y à votre rythme. Le strict minimum à atteindre est la tâche 4, j'aimerai que vous atteignez la tâche 6 pour un maximum de personnes. Je serai ravi que certains aillent jusque la tâche 7. Ceux qui vont jusque la tâche 8 auront évidemment mon respect eternel et une recommandation de ma part sur [linkedin](https://www.linkedin.com/) ;).
:warning: Il va falloir lire beaucoup de documentation, posez beaucoup de questions, faire des schémas pour comprendre ce que vous êtes en train de faire. Utilisez les tickets github dès que quelque chose ne marche pas comme vous le souhaitez.
---
<a id="evaluation"></a>
# Evaluation
Pour le rendu je propose d'utiliser le formulaire suivant. https://forms.gle/ypoaNwh9FmwC2kyk7 . Comme d'habitude un petit readme à la racine des différents repos.
J'attends un rendu sur le TP Docker, un petit rendu sur la partie ansible et un rendu sur la partie projet. Cela fera trois notes séparées.
### Date de rendu **27/03 23h59 ferme**
Je sais que cela correspond pour certains non apprenti à une période où vous êtes en stage donc finissez avant le départ en stage. Je corrigerai dans la semaine car les notes sont à renvoyer à Brigitte pour le 1/04 donc pas possible de décaler plus.
---
<a id="other-relevant-videos"></a>
# Other relevant videos
- [What are cloud native apps](https://www.youtube.com/watch?v=fp9_ubiKqFU)
- [Cloud native applications](https://www.youtube.com/watch?v=nyQAkR84RHM&ab_channel=ParallelWireless)
- [Cloud Native DevOps Explained](https://www.youtube.com/watch?v=FzERTm_j2wE)
- [What are Microservices?](https://www.youtube.com/watch?v=CdBtNQZH8a4)
- [Advantages of Using OpenAPI to design APIs](https://www.youtube.com/watch?v=Fyuk50fFllM&ab_channel=SmartBear)
- [What is DevOps?](https://www.youtube.com/watch?v=_I94-tJlovg&ab_channel=RackspaceTechnology)
- [What is Continuous Integration?](https://www.youtube.com/watch?v=1er2cjUq1UI&frags=wn)
- [What is Continuous Delivery?](https://www.youtube.com/watch?v=2TTU5BB-k9U)
- [What is Infrastructure as Code?](https://www.youtube.com/watch?v=zWw2wuiKd5o&list=PLOspHqNVtKACSagAEeIY20NMVLNeQ1ZJx&index=3&ab_channel=IBMCloud)
- [Cloud-native Java for this decade with Quarkus](https://www.youtube.com/watch?v=KJZt0uc5OiM)
- [Quarkus.io](https://quarkus.io/get-started/)
- [Principles of Antifragile Software](https://www.youtube.com/watch?v=FXGWSyRtipY&ab_channel=MartinMonperrus)
- [Mastering Chaos - A Netflix Guide to Microservices](https://www.youtube.com/watch?v=CZ3wIuvmHeM&ab_channel=InfoQ)
- [Getting started with Chaos Engineering](https://www.youtube.com/watch?v=3Oc4-cMkGJY&ab_channel=NDCConferences)
---
<a id="references"></a>
# References
[1] BALALAIE, Armin, HEYDARNOORI, Abbas, et JAMSHIDI, Pooyan. Microservices architecture enables devops: Migration to a cloud-native architecture. Ieee Software, 2016, vol. 33, no 3, p. 42-52.
[2] https://www.redhat.com/en/resources/eight-steps-cloud-native-application-development-brief
[3] D. S. Linthicum, "Cloud-Native Applications and Cloud Migration: The Good, the Bad, and the Points Between," in IEEE Cloud Computing, vol. 4, no. 5, pp. 12-14, September/October 2017, doi: 10.1109/MCC.2017.4250932.
---
<a id="questions-r-ponses"></a>
# Questions réponses
- [Comprendre la notion de nom de domaine]()
- [Mettre en place un serveur Web](https://www.youtube.com/watch?v=cfJh8vdKuQU&list=PLjwdMgw5TTLUnvhOKLcpCG8ORQsfE7uB4&ab_channel=Grafikart.fr)
- [Configurer nginx](https://www.youtube.com/watch?v=YD_exb9aPZU&ab_channel=Grafikart.fr)
- [Nginx: Mettre en place letsencrypt](https://www.youtube.com/watch?v=NXyE3mayrtg&ab_channel=Grafikart.fr)
- [Nginx : Se protéger des attaques Flood](https://www.youtube.com/watch?v=ge768xOLQJs&list=PLjwdMgw5TTLUnvhOKLcpCG8ORQsfE7uB4&index=22&ab_channel=Grafikart.fr)
- [Fail2ban c'est quoi](https://www.youtube.com/watch?v=-rmK50PbqCY&ab_channel=Grafikart.fr)
- [un firewall c'est quoi: configuration de ufw](https://www.grafikart.fr/tutoriels/ufw-696), [vidéo](https://www.youtube.com/watch?v=XnfMAU3zIew&ab_channel=Grafikart.fr)
- [une autre présentation de docker](https://www.youtube.com/watch?v=XgKOC6X8W28&ab_channel=Grafikart.fr)
- [Pas mal de tutos assez bien fait](https://www.youtube.com/c/grafikart/playlists)
- [POC en local avec Docker et Traefik](https://www.aukfood.fr/poc-en-local-avec-docker-et-traefik/)
- [Mise en place et debug d’Influxdb avec Collectd et Grafana](https://www.aukfood.fr/mise-en-place-et-debug-dinfluxdb-avec-collectd-et-grafana/)
### Appendix
- :warning: **Tâche 2 bis (NON Obligatoire, UNIQUEMENT pour ceux que cela intéressent)**,
Pour servir d'API Gwateway, il y a un super projet que j'adore qui s'appelle **bunkerweb**. C'est un container docker avec nginx qui se configure au travers de variable d'environement et qui inclus de base plein de mécanisme de sécurité pour nginx, la génération des certificats ... mais il entraine pas mal de doc à lire.
:warning: **UNIQUEMENT pour ceux que cela intéressent (j'insite )**
configurer convenablement https://github.com/bunkerity/bunkerweb au sein de votre docker-compose pour sécuriser votre application. Tester localement le déploiement de l'application.
**nginx bunkerity/bunkerweb** va jouer le rôle de passerelle d'API, c'est-à-dire que toutes les requêtes passent par lui et il a la charge de fournir les fichiers html, css et js du front, mais aussi de servir de proxy vers les autres services.
Pour cela, il est nécessaire de configurer finement ce serveur nginx qui tourne dans ce container. Il faudra *monter* ce fichier de configuration au moment du lancement de ce container. (voir https://github.com/bunkerity/bunkerized-nginx/blob/700dfc0184f8d12e15f3ca3d6e5ca08befccd561/examples/wordpress/docker-compose.yml#L14)
Vous trouverez ci-dessous un exemple de fichier de configuration nginx (fichier api.conf par exemple dans le répertoire *server-confs* là où se trouve votre docker-compose.yml).
```txt
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# L'idée ici est que toute requête qui arrive sur /api ou une sous
# route d'API passe par ici et en gros on fait un if selon que cette
# requête est arrivé sur l'adresse IP en demandant à parler à
# doodle.diverse-team.fr ou à phpmyadmin.diverse-team.fr ou à
# pad.diverse-team.fr
location /api {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
if ($host = doodle.diverse-team.fr) {
proxy_pass http://doodleback:8080$request_uri;
}
if ($host = pad.diverse-team.fr) {
proxy_pass http://etherpad:9001$request_uri;
}
if ($host = phpmyadmin.diverse-team.fr) {
proxy_pass http://myadmin$request_uri;
}
}
# L'idée ici est que toute requête qui arrive sur / ou une sous
# route de / qui n'a pas été traité avant passe par ici et en gros
# on fait un if selon que cette requête est arrivé sur l'adresse IP
# en demandant à parler à phpmyadmin.diverse-team.fr ou à
# pad.diverse-team.fr et pour tout le reste on fourni les ressources
# statiques du front
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
if ($host = pad.diverse-team.fr) {
proxy_pass http://etherpad:9001$request_uri;
}
if ($host = phpmyadmin.diverse-team.fr) {
proxy_pass http://myadmin$request_uri;
}
try_files $uri $uri/ /index.html;
}
```
Il est aussi nécessaire de configurer finement les variables d'environement de ce container. Je vous met un exemple avec des explications
```txt
environment:
# Ensemble des endpoints pour lequel il générera des certificats
- SERVER_NAME=doodle.diverse-team.fr pad.diverse-team.fr phpmyadmin.diverse-team.fr
- SERVE_FILES=yes
- DISABLE_DEFAULT_SERVER=no
# Transmission de l'IP publique vers les containers
- PROXY_REAL_IP=yes
# - MAX_CLIENT_SIZE=100m
# - USE_ANTIBOT=captcha
# Configuration de letencrypt
- AUTO_LETS_ENCRYPT=yes
# redirect du 80 vers 443 automatique
- REDIRECT_HTTP_TO_HTTPS=yes
- USE_LIMIT_REQ=no
# Désactivation http2
- HTTP2=no
# Paramétrage des entêtes http
- FEATURE_POLICY=accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture 'none'; speaker 'none'; sync-xhr 'self'; usb 'none'; vibrate 'none'; vr 'none'
myadmin:
image: phpmyadmin
# ports:
# - "8082:80"
environment:
# pour phpmyadmin url externe
- PMA_ABSOLUTE_URI=https://phpmyadmin.diverse-team.fr
```