#+TITLE: TP1 - Cours de virtualisation avancée - /Kubernetes/, dernier TP
#+OPTIONS: toc:nil date:nil author:nil
#+LATEX_CLASS: article
#+LATEX_CLASS_OPTIONS: [12pt,a4paper]
#+LATEX_HEADER: \usepackage[a4paper,margin=0.5in]{geometry}
#+LATEX_HEADER: \usepackage[utf8]{inputenc}
#+LATEX_HEADER: \usepackage[inkscapelatex=false]{svg}
#+LATEX_HEADER: \usepackage[sfdefault]{AlegreyaSans}
#+LATEX_HEADER: \usepackage{multicol}
#+LATEX_HEADER: \usepackage{minted}
#+LATEX_HEADER: \usepackage{float}
#+LATEX_HEADER: \usepackage{tikz}
#+LATEX_HEADER: \usetikzlibrary{positioning}
#+LATEX_HEADER: \renewcommand\listingscaption{Exemple de code}
#+LATEX_HEADER: \usepackage[tikz]{bclogo}
#+LATEX_HEADER: \usepackage{tcolorbox}
#+LATEX_HEADER: \tcbuselibrary{skins}
#+LATEX_HEADER: \usepackage{ragged2e}
#+LATEX_HEADER: \usepackage{environ}

#+BEGIN_EXPORT latex
\NewEnviron{warning}%
  {\begin{center}%
  \begin{tcolorbox}[notitle,
    colback=orange!5!white,
    colbacklower=white,
    frame hidden,
    boxrule=0pt,
    bicolor,
    sharp corners,
    borderline west={4pt}{0pt}{orange!50!black},
    fontupper=\sffamily]
     \textcolor{orange!50!black}{
        \sffamily
        \textbf{Attention:\\}%
    }%
    \BODY
  \end{tcolorbox}
  \end{center}%
  }

\NewEnviron{good}%
  {\begin{center}%
  \begin{tcolorbox}[notitle,
    colback=green!5!white,
    colbacklower=white,
    frame hidden,
    boxrule=0pt,
    bicolor,
    sharp corners,
    borderline west={4pt}{0pt}{green!50!black},
    fontupper=\sffamily]
     \textcolor{green!50!black}{
        \sffamily
    }%
    \BODY
  \end{tcolorbox}
  \end{center}%
  }  
#+END_EXPORT

#+BEGIN_warning
Comme pour les autres TPs, vous allez travailler dans une machine virtuelle VDN.

\medskip

N'oubliez pas de lancer \\
~export no_proxy="127.0.0.1,.vdn,localhost,10.96.0.0/12,192.168.49.2.nip.io"~ \\
à chaque connexion =ssh= !

\medskip

Pour lancer /Minikube/, lancez la commande =./minikube start= (attention vous aviez probablement laissé les binaires =minikube= et =kubectl= dans le dossier du TP2).

\medskip

N'oubliez pas aussi de laisser un autre terminal tourner avec la commande =minikube tunnel= ;)
#+END_warning

#+BEGIN_warning
Installez l'outil =httpie=: =sudo apt install -y httpie=.

Il s'agit d'un outil similaire à =curl= mais plus agréable à utiliser
#+END_warning

L'objectif de ce TP est de finir le travail commencé la semaine dernière et de tester de nouvelles choses.

La base de données que vous avez déployé est une simple /API REST/ qui reçoit et retourne une liste de films au format /json/.
Voici une commande permettant d'ajouter quelques films à la base:
#+BEGIN_SRC bash
http POST <ext ip>:<port>/ title="Blade Runner" director="Ridley Scott" release_year:=1982
http POST <ext ip>:<port>/ title="Dune" director="Denis Villeneuve" release_year:=2021
http POST <ext ip>:<port>/ title="Dune 2" director="Denis Villeneuve" release_year:=2024
#+END_SRC

* Une base de données sans stockage
Déployez le fichier =without_storage.yaml=.
Il contient les déploiements et services de la base de données et de l'application.

Une fois le fichier déployé, vérifier que les /pods/ sont bien en cours d’exécution.

Ensuite, lancez la commande =http <external ip>:4000=.
Vous devriez avoir une sortie telle que :
#+BEGIN_EXAMPLE
HTTP/1.1 200 OK
content-length: 2
content-type: application/json
date: Wed, 05 Jun 2024 07:21:34 GMT
x-servedby: database-85bddd5ddc-c4fm7

[]
#+END_EXAMPLE

Notez que la valeur de =x-servedby= change d'une requête à l'autre.
Cela montre que le /Service/ /LoadBalancer/ redirige bien le trafic vers les différents /pods/.
La sortie =[]= indique que la liste est vide.

Maintenant, lancez les commandes :
#+BEGIN_SRC bash
http POST <ext ip>:4000/ title="Blade Runner" director="Ridley Scott" release_year:=1982
http POST <ext ip>:4000/ title="Dune" director="Denis Villeneuve" release_year:=2021
http POST <ext ip>:4000/ title="Dune 2" director="Denis Villeneuve" release_year:=2024
#+END_SRC

Cela va ajouter des films dans la base de données.

Maintenant, relancez la commande =http <external ip>:4000= plusieurs fois.
Vous verrez que les films ne sont pas présents dans toutes les réponses car les requêtes =POST= ont été dirigées vers différents /pods/.

* Votre travail de la semaine dernière
Si vous aviez fini le TP la semaine dernière, passez à la partie suivante.

Sinon continuez le.
Si vous le souhaitez, vous pouvez vous baser le fichier =without_storage.yaml= et y ajouter :
- /ConfigMap/
- /PersistentVolume/
- /PersistentVolumeClaim/
- montage du /PVC/ dans les /pods/ du déploiement

* /Ingress/
#+BEGIN_warning
Avant tout, lancez la commande =minikube addons enable ingress= qui permet l'utilisation des /Ingress/ dans /minikube/.

N'oubliez pas aussi \\
~export no_proxy="127.0.0.1,.vdn,localhost,10.96.0.0/12,192.168.49.2.nip.io"~ \\

*Attention à ne pas utiliser la commande des précédents TPs car elle ne contient pas l'exclusion pour =192.168.49.2.nip.io=*.
#+END_warning

Déployez maintenant un /Ingress/ permettant l'accès à l'application.

Configurez votre /Ingress/ pour que le chemin =/= arrive sur l'application et le chemin =/api= arrive sur la base de données.

Lors de la configuration de l'/Ingress/, utilisez =192.168.49.2.nip.io= *comme nom de domaine*.
Il s'agit d'un domaine résolvant vers l'adresse =192.168.49.2=, qui est l'adresse de /minikube/ dans votre machine virtuelle.

Vérifiez le fonctionnement avec ces commandes :
#+BEGIN_SRC bash
http 192.168.49.2.nip.io/
http 192.168.49.2.nip.io/api
#+END_SRC

* Déploiement /Canary/
Créez maintenant un déploiement identique à celui de l'application mais qui utilise l'image \\
=evanespen/application:claque= et un nombre de /replicas/ à 1.

Ne changez pas les valeurs de =template.metadata.labels.app= sinon ce nouveau déploiement ne sera pas géré par le /LoadBalancer/.

Ouvrez =192.168.49.2.nip.io= dans un navigateur *dans la machine virtuelle* (donc en vous connectant avec =ssh -X=).
Rechargez la page plusieurs fois, *avec =Ctrl+Shift+R=* pour ignorer le cache, et constatez !

* Aide
Référez vous au cours et à ces documentations pour y parvenir (ce sont bien des liens):
- [[https://kubernetes.io/fr/docs/concepts/services-networking/service/][/Service/]]
- [[https://kubernetes.io/docs/concepts/workloads/pods/][/Pod/]]
- [[https://kubernetes.io/docs/concepts/workloads/controllers/deployment/][/Deployment/]]
- [[https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/][/PV/ et /PVC/]]
- [[https://kubernetes.io/fr/docs/concepts/services-networking/ingress/][/Ingress/]]

Amusez vous bien ;)
