% Created 2024-06-05 mer. 10:04
% Intended LaTeX compiler: pdflatex
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{capt-of}
\usepackage{hyperref}
\usepackage{minted}
\usepackage[a4paper,margin=0.5in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[inkscapelatex=false]{svg}
\usepackage[sfdefault]{AlegreyaSans}
\usepackage{multicol}
\usepackage{minted}
\usepackage{float}
\usepackage{tikz}
\usetikzlibrary{positioning}
\renewcommand\listingscaption{Exemple de code}
\usepackage[tikz]{bclogo}
\usepackage{tcolorbox}
\tcbuselibrary{skins}
\usepackage{ragged2e}
\usepackage{environ}
\date{}
\title{TP1 - Cours de virtualisation avancée - \emph{Kubernetes}, dernier TP}
\hypersetup{
 pdfauthor={Evrard Van Espen},
 pdftitle={TP1 - Cours de virtualisation avancée - \emph{Kubernetes}, dernier TP},
 pdfkeywords={},
 pdfsubject={},
 pdfcreator={Emacs 30.0.50 (Org mode 9.6.15)}, 
 pdflang={English}}
\begin{document}

\maketitle
\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}%
  }  

\begin{warning}
Comme pour les autres TPs, vous allez travailler dans une machine virtuelle VDN.

\medskip

N'oubliez pas de lancer \\[0pt]
\texttt{export no\_proxy="127.0.0.1,.vdn,localhost,10.96.0.0/12,192.168.49.2.nip.io"} \\[0pt]
à chaque connexion \texttt{ssh} !

\medskip

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

\medskip

N'oubliez pas aussi de laisser un autre terminal tourner avec la commande \texttt{minikube tunnel} ;)
\end{warning}

\begin{warning}
Installez l'outil \texttt{httpie}: \texttt{sudo apt install -y httpie}.

Il s'agit d'un outil similaire à \texttt{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 \emph{API REST} qui reçoit et retourne une liste de films au format \emph{json}.
Voici une commande permettant d'ajouter quelques films à la base:
\begin{minted}[]{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{minted}

\section{Une base de données sans stockage}
\label{sec:orge95a53d}
Déployez le fichier \texttt{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 \emph{pods} sont bien en cours d’exécution.

Ensuite, lancez la commande \texttt{http <external ip>:4000}.
Vous devriez avoir une sortie telle que :
\begin{verbatim}
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{verbatim}

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

Maintenant, lancez les commandes :
\begin{minted}[]{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{minted}

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

Maintenant, relancez la commande \texttt{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 \texttt{POST} ont été dirigées vers différents \emph{pods}.

\section{Votre travail de la semaine dernière}
\label{sec:org59acb8b}
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 \texttt{without\_storage.yaml} et y ajouter :
\begin{itemize}
\item \emph{ConfigMap}
\item \emph{PersistentVolume}
\item \emph{PersistentVolumeClaim}
\item montage du \emph{PVC} dans les \emph{pods} du déploiement
\end{itemize}

\section{\emph{Ingress}}
\label{sec:orgc44da1d}
\begin{warning}
Avant tout, lancez la commande \texttt{minikube addons enable ingress} qui permet l'utilisation des \emph{Ingress} dans \emph{minikube}.

N'oubliez pas aussi \\[0pt]
\texttt{export no\_proxy="127.0.0.1,.vdn,localhost,10.96.0.0/12,192.168.49.2.nip.io"} \\[0pt]

\textbf{Attention à ne pas utiliser la commande des précédents TPs car elle ne contient pas l'exclusion pour \texttt{192.168.49.2.nip.io}}.
\end{warning}

Déployez maintenant un \emph{Ingress} permettant l'accès à l'application.

Configurez votre \emph{Ingress} pour que le chemin \texttt{/} arrive sur l'application et le chemin \texttt{/api} arrive sur la base de données.

Lors de la configuration de l'\emph{Ingress}, utilisez \texttt{192.168.49.2.nip.io} \textbf{comme nom de domaine}.
Il s'agit d'un domaine résolvant vers l'adresse \texttt{192.168.49.2}, qui est l'adresse de \emph{minikube} dans votre machine virtuelle.

Vérifiez le fonctionnement avec ces commandes :
\begin{minted}[]{bash}
http 192.168.49.2.nip.io/
http 192.168.49.2.nip.io/api
\end{minted}

\section{Déploiement \emph{Canary}}
\label{sec:org485e115}
Créez maintenant un déploiement identique à celui de l'application mais qui utilise l'image \\[0pt]
\texttt{evanespen/application:claque} et un nombre de \emph{replicas} à 1.

Ne changez pas les valeurs de \texttt{template.metadata.labels.app} sinon ce nouveau déploiement ne sera pas géré par le \emph{LoadBalancer}.

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

\section{Aide}
\label{sec:orgdbe80a5}
Référez vous au cours et à ces documentations pour y parvenir (ce sont bien des liens):
\begin{itemize}
\item \href{https://kubernetes.io/fr/docs/concepts/services-networking/service/}{\emph{Service}}
\item \href{https://kubernetes.io/docs/concepts/workloads/pods/}{\emph{Pod}}
\item \href{https://kubernetes.io/docs/concepts/workloads/controllers/deployment/}{\emph{Deployment}}
\item \href{https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/}{\emph{PV} et \emph{PVC}}
\item \href{https://kubernetes.io/fr/docs/concepts/services-networking/ingress/}{\emph{Ingress}}
\end{itemize}

Amusez vous bien ;)
\end{document}
