main
Evrard Van Espen 6 months ago
parent 7e67134b16
commit a47edd7df6

@ -0,0 +1,137 @@
title = 'Proxmox'
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = "Un système d'exploitation pour serveurs", correct = false },
{ content.Text = 'Une plateforme de virtualisation open-source', correct = true },
{ content.Text = 'Un logiciel de gestion de bases de données', correct = false },
]
title = "Qu'est-ce que Proxmox VE ?"
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = "Un hyperviseur qui s'exécute au-dessus d'un autre système d'exploitation", correct = false },
{ content.Text = "Un hyperviseur qui s'exécute directement sur le hardware", correct = true },
{ content.Text = "Un hyperviseur qui nécessite une machine virtuelle pour fonctionner", correct = false },
{ content.Text = "Un hyperviseur qui est utilisé uniquement pour les conteneurs", correct = false },
]
title = "Qu'est-ce qu'un hyperviseur \"bare metal\" ?"
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = "Ubuntu", correct = false },
{ content.Text = "Fedora", correct = false },
{ content.Text = "Debian", correct = true },
{ content.Text = "Hannah Montana Linux", correct = false },
]
title = "Proxmox est basé sur quelle distribution Linux ?"
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = "KVM et Docker", correct = false },
{ content.Text = "VMware et LXC", correct = false },
{ content.Text = "KVM et LXC", correct = true },
{ content.Text = "VirtualBox et Docker", correct = false },
]
title = 'Quels types de virtualisation sont supportés par Proxmox ?'
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = "La virtualisation permet d'exécuter plusieurs systèmes d'exploitation sur un même matériel physique, tandis que la conteneurisation isole les applications et leurs dépendances.", correct = true },
{ content.Text = "La conteneurisation permet d'exécuter plusieurs systèmes d'exploitation sur un même matériel physique, tandis que la virtualisation isole les applications et leurs dépendances.", correct = false },
{ content.Text = 'La virtualisation et la conteneurisation sont deux termes interchangeables désignant la même technologie.', correct = false },
]
title = 'Quelle est la différence fondamentale entre la virtualisation et la conteneurisation ?'
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = 'Une meilleure isolation des applications', correct = true },
{ content.Text = 'Une utilisation plus efficace des ressources matérielles', correct = true },
{ content.Text = 'Une plus grande compatibilité avec les logiciels existants', correct = false },
]
title = "Quel est l'avantage principal de la virtualisation par rapport à l'installation directe d'un système d'exploitation sur un serveur physique ?"
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = "À connecter plusieurs hyperviseurs entre eux", correct = false },
{ content.Text = "À créer des sauvegardes automatiques", correct = false },
{ content.Text = "À permettre aux VM et CT d'accéder au réseau", correct = true },
{ content.Text = "À gérer les permissions des utilisateurs", correct = false },
]
title = "À quoi sert un \"network bridge\" dans Proxmox ?"
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = "L'image ISO à utiliser", correct = false },
{ content.Text = "Le nombre de sockets et de cœurs", correct = true },
{ content.Text = "L'adresse IP", correct = false },
{ content.Text = "Le mot de passe utilisateur", correct = false },
]
title = "Que peut-on configurer dans l'onglet \"CPU\" lors de la création d'une VM ?"
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = 'Oui', correct = true },
{ content.Text = 'Non', correct = true },
]
title = "Je peux modifier les ressources d'un conteneur à tout moment ?"
[[slides]]
[slides.MultipleChoice]
introduce_question = 3000
time_limit = 30000
points_awarded = 1000
answers = [
{ content.Text = 'Non', correct = true },
{ content.Text = 'Oui', correct = true },
]
title = "Je peux modifier les ressources d'une machine virtuelle à tout moment ?"

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Before

Width:  |  Height:  |  Size: 316 KiB

After

Width:  |  Height:  |  Size: 316 KiB

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 243 KiB

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Before

Width:  |  Height:  |  Size: 261 KiB

After

Width:  |  Height:  |  Size: 261 KiB

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 220 KiB

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 214 KiB

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 285 KiB

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

@ -0,0 +1,4 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{+w}{ }kubectl\PYG{+w}{ }delete\PYG{+w}{ }pods\PYG{+w}{ }profiles\PYGZhy{}app
pod\PYG{+w}{ }\PYG{l+s+s2}{\PYGZdq{}profiles\PYGZhy{}app\PYGZdq{}}\PYG{+w}{ }deleted
\end{Verbatim}

@ -0,0 +1,15 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{n+nn}{\PYGZhy{}\PYGZhy{}\PYGZhy{}}
\PYG{n+nt}{apiVersion}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{v1}
\PYG{n+nt}{kind}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{Pod}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} ici le type est \PYGZdq{}pod\PYGZdq{}}
\PYG{n+nt}{metadata}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{namespace}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{profiles\PYGZhy{}app\PYGZhy{}ns}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} on choisi le namespace}
\PYG{+w}{ }\PYG{n+nt}{name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{profiles\PYGZhy{}app}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} le nom du pod}
\PYG{n+nt}{spec}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} puis ses spécifications}
\PYG{+w}{ }\PYG{n+nt}{containers}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} il contient des conteneurs}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{n+nt}{name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{database}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} nom du conteneur}
\PYG{+w}{ }\PYG{n+nt}{image}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{image:latest}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} l\PYGZsq{}image à utiliser}
\PYG{+w}{ }\PYG{n+nt}{env}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} variables d\PYGZsq{}environnement}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{n+nt}{name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{COULEUR}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} avec un nom}
\PYG{+w}{ }\PYG{n+nt}{value}\PYG{p}{:}\PYG{+w}{ }\PYG{l+s}{\PYGZdq{}rouge\PYGZdq{}}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} et une valeur}
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
kubectl\PYG{+w}{ }apply\PYG{+w}{ }\PYGZhy{}f\PYG{+w}{ }\PYGZlt{}fichier.yaml\PYGZgt{}
\end{Verbatim}

@ -0,0 +1,4 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{+w}{ }kubectl\PYG{+w}{ }logs\PYG{+w}{ }profiles\PYGZhy{}app
...
\end{Verbatim}

@ -0,0 +1,14 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{+w}{ }kubectl\PYG{+w}{ }\PYGZhy{}n\PYG{+w}{ }profiles\PYGZhy{}app\PYG{+w}{ }describe\PYG{+w}{ }pod\PYG{+w}{ }profiles\PYGZhy{}app
Name:\PYG{+w}{ }profiles\PYGZhy{}app
Namespace:\PYG{+w}{ }profiles\PYGZhy{}app
Priority:\PYG{+w}{ }\PYG{l+m}{0}
Service\PYG{+w}{ }Account:\PYG{+w}{ }default
Node:\PYG{+w}{ }minikube/192.168.49.2
Start\PYG{+w}{ }Time:\PYG{+w}{ }Thu,\PYG{+w}{ }\PYG{l+m}{09}\PYG{+w}{ }May\PYG{+w}{ }\PYG{l+m}{2024}\PYG{+w}{ }\PYG{l+m}{17}:35:54\PYG{+w}{ }+0200
Labels:\PYG{+w}{ }\PYG{n+nv}{run}\PYG{o}{=}profiles\PYGZhy{}app
Annotations:\PYG{+w}{ }\PYGZlt{}none\PYGZgt{}
Status:\PYG{+w}{ }Running
IP:\PYG{+w}{ }\PYG{l+m}{10}.244.0.7
...
\end{Verbatim}

@ -0,0 +1,5 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{+w}{ }kubectl\PYG{+w}{ }get\PYG{+w}{ }pods
NAME\PYG{+w}{ }READY\PYG{+w}{ }STATUS\PYG{+w}{ }RESTARTS\PYG{+w}{ }AGE
profiles\PYGZhy{}app\PYG{+w}{ }\PYG{l+m}{3}/3\PYG{+w}{ }Running\PYG{+w}{ }\PYG{l+m}{0}\PYG{+w}{ }22s
\end{Verbatim}

@ -0,0 +1,11 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{n+nn}{\PYGZhy{}\PYGZhy{}\PYGZhy{}}
\PYG{n+nt}{clef}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{valeur}
\PYG{n+nt}{liste\PYGZus{}de\PYGZus{}nombres}\PYG{p}{:}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{1}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{2}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{3}
\PYG{n+nt}{liste\PYGZus{}de\PYGZus{}clefs\PYGZus{}valeurs}\PYG{p}{:}
\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{n+nt}{titre}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{blade\PYGZus{}runner}
\PYG{+w}{ }\PYG{n+nt}{note}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{10}
\end{Verbatim}

@ -0,0 +1,15 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{n+nn}{\PYGZhy{}\PYGZhy{}\PYGZhy{}}
\PYG{n+nt}{apiVersion}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{v1}
\PYG{n+nt}{kind}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{Service}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} ici le type est \PYGZdq{}service\PYGZdq{}}
\PYG{n+nt}{metadata}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{namespace}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{profiles\PYGZhy{}app\PYGZhy{}ns}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} on choisi le namespace}
\PYG{+w}{ }\PYG{n+nt}{name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{my\PYGZhy{}service}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} on choisi un nom pour le service}
\PYG{n+nt}{spec}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{selector}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} règles pour sélectionner le pod}
\PYG{+w}{ }\PYG{n+nt}{app.kubernetes.io/name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{profiles\PYGZhy{}app}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} selection par nom}
\PYG{+w}{ }\PYG{n+nt}{ports}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} on choisi les ports à exposer}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{n+nt}{protocol}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{TCP}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} le protocole}
\PYG{+w}{ }\PYG{n+nt}{port}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{80}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} le port *CIBLE*}
\PYG{+w}{ }\PYG{n+nt}{targetPort}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{9376}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} le port *DU POD*}
\end{Verbatim}

@ -0,0 +1,23 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{n+nt}{apiVersion}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{apps/v1}
\PYG{n+nt}{kind}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{Deployment}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} un nouveau type, \PYGZdq{}Deployment\PYGZdq{}}
\PYG{n+nt}{metadata}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{nginx\PYGZhy{}deployment}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} on lui met un nom}
\PYG{+w}{ }\PYG{n+nt}{labels}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} et des labels}
\PYG{+w}{ }\PYG{n+nt}{app}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{nginx}
\PYG{n+nt}{spec}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{replicas}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{3}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} le nombre de réplications voulues}
\PYG{+w}{ }\PYG{n+nt}{selector}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{matchLabels}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{app}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{nginx}
\PYG{+w}{ }\PYG{n+nt}{template}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} champs qui seront appliqués aux pods}
\PYG{+w}{ }\PYG{n+nt}{metadata}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{labels}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{app}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{nginx}
\PYG{+w}{ }\PYG{n+nt}{spec}\PYG{p}{:}
\PYG{+w}{ }\PYG{n+nt}{containers}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} on spécifie les conteneurs}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{n+nt}{name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{nginx}
\PYG{+w}{ }\PYG{n+nt}{image}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{nginx:1.7.9}
\PYG{+w}{ }\PYG{n+nt}{ports}\PYG{p}{:}
\PYG{+w}{ }\PYG{p+pIndicator}{\PYGZhy{}}\PYG{+w}{ }\PYG{n+nt}{containerPort}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{80}
\end{Verbatim}

@ -0,0 +1,5 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{+w}{ }kubectl\PYG{+w}{ }get\PYG{+w}{ }services
NAME\PYG{+w}{ }TYPE\PYG{+w}{ }CLUSTER\PYGZhy{}IP\PYG{+w}{ }EXTERNAL\PYGZhy{}IP\PYG{+w}{ }PORT\PYG{o}{(}S\PYG{o}{)}\PYG{+w}{ }AGE
profiles\PYGZhy{}app\PYGZhy{}svc\PYG{+w}{ }LoadBalancer\PYG{+w}{ }\PYG{l+m}{10}.97.188.25\PYG{+w}{ }\PYGZlt{}pending\PYGZgt{}\PYG{+w}{ }\PYG{l+m}{8000}:30487/TCP,8001:32451/TCP\PYG{+w}{ }5s
\end{Verbatim}

@ -0,0 +1,7 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{n+nn}{\PYGZhy{}\PYGZhy{}\PYGZhy{}}
\PYG{n+nt}{apiVersion}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{v1}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} nécessaire pour que K8S comprenne}
\PYG{n+nt}{kind}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{Namespace}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} le type de ressource}
\PYG{n+nt}{metadata}\PYG{p}{:}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} les informations de la ressource}
\PYG{+w}{ }\PYG{n+nt}{name}\PYG{p}{:}\PYG{+w}{ }\PYG{l+lScalar+lScalarPlain}{profiles\PYGZhy{}app}\PYG{+w}{ }\PYG{c+c1}{\PYGZsh{} ici, son nom}
\end{Verbatim}

@ -0,0 +1,102 @@
\makeatletter
\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
\let\PYG@ul=\relax \let\PYG@tc=\relax%
\let\PYG@bc=\relax \let\PYG@ff=\relax}
\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
\def\PYG@toks#1+{\ifx\relax#1\empty\else%
\PYG@tok{#1}\expandafter\PYG@toks\fi}
\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
\PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.61,0.40,0.00}{##1}}}
\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@ne}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.80,0.25,0.22}{##1}}}
\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
\@namedef{PYG@tok@nl}{\def\PYG@tc##1{\textcolor[rgb]{0.46,0.46,0.00}{##1}}}
\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}}
\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.41,0.47,0.13}{##1}}}
\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@nd}{\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@si}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}}
\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.36,0.12}{##1}}}
\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}}
\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.52,0.00}{##1}}}
\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{0.89,0.00,0.00}{##1}}}
\@namedef{PYG@tok@ge}{\let\PYG@it=\textit}
\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf}
\@namedef{PYG@tok@ges}{\let\PYG@bf=\textbf\let\PYG@it=\textit}
\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}}
\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}}
\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cs}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\def\PYGZbs{\char`\\}
\def\PYGZus{\char`\_}
\def\PYGZob{\char`\{}
\def\PYGZcb{\char`\}}
\def\PYGZca{\char`\^}
\def\PYGZam{\char`\&}
\def\PYGZlt{\char`\<}
\def\PYGZgt{\char`\>}
\def\PYGZsh{\char`\#}
\def\PYGZpc{\char`\%}
\def\PYGZdl{\char`\$}
\def\PYGZhy{\char`\-}
\def\PYGZsq{\char`\'}
\def\PYGZdq{\char`\"}
\def\PYGZti{\char`\~}
% for compatibility with earlier versions
\def\PYGZat{@}
\def\PYGZlb{[}
\def\PYGZrb{]}
\makeatother

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 529 KiB

After

Width:  |  Height:  |  Size: 529 KiB

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

@ -469,8 +469,8 @@ b, i {
</section>
<section>
<section id="slide-orgc9c2907">
<h2 id="orgc9c2907"><span class="section-number-2">1.</span> Introduction, les <i>clusters</i></h2>
<section id="slide-orgb7aa0df">
<h2 id="orgb7aa0df"><span class="section-number-2">1.</span> Introduction, les <i>clusters</i></h2>
<ul>
<li>Grappe de serveur</li>
<li>Groupe de machines fonctionnant ensemble</li>
@ -480,10 +480,10 @@ b, i {
</section>
</section>
<section>
<section id="slide-org41b1e06">
<h2 id="org41b1e06"><span class="section-number-2">2.</span> <i>Kubernetes</i></h2>
<section id="slide-org7d5566b">
<h2 id="org7d5566b"><span class="section-number-2">2.</span> <i>Kubernetes</i></h2>
<div id="orge41224c" class="figure">
<div id="org4cb21c6" class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABVQAAAFyAgMAAABn0LmPAAAADFBMVEVHcEwAAAAybOX/////2XfG
AAAAAXRSTlMAQObYZgAAEnxJREFUeNrsnU2SozgQhe2K8Kb2voRP4SN4Ye7TR6llhVhwBO7DZvZ0
BIxsfhIpkVKCdPeU571FtxEyyB+PREoEdcjShzHm6wDp6mKsfh0gTX2ah74PkKYsUphVW9aqMKu6
@ -573,8 +573,8 @@ KFeqmqNcFRrpE+u/7daxEQAACMJA95/a3tp0zwgcl0BWRatkVegKVgtdabXQ1cg/WMmqACtZFWAd
</div>
</section>
<section id="slide-org84a8415">
<h3 id="org84a8415"><span class="section-number-3">2.1.</span> C'est quoi ?</h3>
<section id="slide-orga10d1d5">
<h3 id="orga10d1d5"><span class="section-number-3">2.1.</span> C'est quoi ?</h3>
<ul>
<li>Ancien mot grec signifiant "timonier" (marin qui tient la barre)</li>
<li>Souvent abrégé <i>"K8S"</i></li>
@ -584,8 +584,8 @@ KFeqmqNcFRrpE+u/7daxEQAACMJA95/a3tp0zwgcl0BWRatkVegKVgtdabXQ1cg/WMmqACtZFWAd
</ul>
</section>
<section id="slide-org64ca9d2">
<h3 id="org64ca9d2"><span class="section-number-3">2.2.</span> Origine</h3>
<section id="slide-org4165fe6">
<h3 id="org4165fe6"><span class="section-number-3">2.2.</span> Origine</h3>
<ul>
<li>Lancé par <i>Google</i> en 2014</li>
<li><i>Google</i> s'associe à la <i>Linux Foundation</i> pour créer la <i>CNCF</i> en utilisant <i>K8S</i> comme projet de départ</li>
@ -597,10 +597,10 @@ KFeqmqNcFRrpE+u/7daxEQAACMJA95/a3tp0zwgcl0BWRatkVegKVgtdabXQ1cg/WMmqACtZFWAd
</p>
</section>
<section id="slide-orge4fa580">
<h3 id="orge4fa580"><span class="section-number-3">2.3.</span> Quelques statistiques</h3>
<section id="slide-orgec9ede8">
<h3 id="orgec9ede8"><span class="section-number-3">2.3.</span> Quelques statistiques</h3>
<ul>
<li>66% : c'est le nombre d'entreprises qui utilisent <i>K8S</i> en prod en 2023 [<a href="#/slide-org78c0632">1</a>]</li>
<li>66% : c'est le nombre d'entreprises qui utilisent <i>K8S</i> en prod en 2023 [<a href="#/slide-orge3ccc9b">1</a>]</li>
<li>Entre 2018 et 2020 : <i>K8S</i> top 10 projets les plus actifs <i>Github</i></li>
<li>Le nombre de conteneurs en prod dans le monde est inestimable mais <i>Google</i> estime en lancer <b>2 milliards par semaine</b></li>
@ -609,10 +609,10 @@ KFeqmqNcFRrpE+u/7daxEQAACMJA95/a3tp0zwgcl0BWRatkVegKVgtdabXQ1cg/WMmqACtZFWAd
</section>
</section>
<section>
<section id="slide-orgecd4824">
<h2 id="orgecd4824"><span class="section-number-2">3.</span> Le monde des conteneurs</h2>
<section id="slide-orgd78d7b9">
<h2 id="orgd78d7b9"><span class="section-number-2">3.</span> Le monde des conteneurs</h2>
<div id="org04ef245" class="figure">
<div id="org6183877" class="figure">
<p><img src="data:image/webp;base64,UklGRvCZFwBXRUJQVlA4WAoAAAASAAAA3wEADQEAQU5JTQYAAAD/////AABBTk1GIl4AAAAAAAAA
AN8BAA0BAEIAAAJWUDggCl4AAFBlAZ0BKuABDgE+USSORSOiIRQ6hfA4BQSyth86CBc5fxGgfiVo
b6D8k7u+rnvZ9P8rfcN5F8m/lvkz4pseXo7Nr9r/jv+z6qP+n+0nwC/Sf/W9xr9Vv139d72Yf2D0
@ -27753,10 +27753,10 @@ DYhfWRKkXlK4VkWWI0B4Ht4Coe9aO8l54QOqRNj+9QbZQDKIjCflUUyd1eja/9Hv1n+MQIzp0iNC
</div>
</section>
<section id="slide-org020a17e">
<h3 id="org020a17e"><span class="section-number-3">3.1.</span> Des applications souvent présentes</h3>
<section id="slide-org2a0c78c">
<h3 id="org2a0c78c"><span class="section-number-3">3.1.</span> Des applications souvent présentes</h3>
<div id="org042b13b" class="figure">
<div id="org0dca4d5" class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0cAAAF/CAYAAACCDLJqAAAA0GVYSWZJSSoACAAAAAoAAAEEAAEA
AABHAwAAAQEEAAEAAAB/AQAAAgEDAAMAAACGAAAAEgEDAAEAAAABAAAAGgEFAAEAAACMAAAAGwEF
AAEAAACUAAAAKAEDAAEAAAACAAAAMQECAA0AAACcAAAAMgECABQAAACqAAAAaYcEAAEAAAC+AAAA
@ -29657,9 +29657,9 @@ jgQCgUAgEAgEAoFAyJFAIBAIBAKBQCAQlMP/A/kvuEf1Zo99AAAAAElFTkSuQmCC" />
</div>
</section>
<section id="slide-org020a17e-split">
<section id="slide-org2a0c78c-split">
<div class="smallfont" id="org10c14f3">
<div class="smallfont" id="org3e8480d">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
@ -29724,16 +29724,16 @@ jgQCgUAgEAgEAoFAyJFAIBAIBAKBQCAQlMP/A/kvuEf1Zo99AAAAAElFTkSuQmCC" />
</div>
</section>
<section id="slide-org7e09073">
<h3 id="org7e09073"><span class="section-number-3">3.2.</span> Plusieurs orchestrateurs</h3>
<section id="slide-org7d8d90f">
<h3 id="org7d8d90f"><span class="section-number-3">3.2.</span> Plusieurs orchestrateurs</h3>
<div class="outline-text-3" id="text-3-2">
</div>
</section>
<section id="slide-org9f4301c">
<h4 id="org9f4301c"><span class="section-number-4">3.2.1.</span> <b><i>Kubernetes</i></b></h4>
<div class="imagecol" id="org145039d">
<section id="slide-org77d2781">
<h4 id="org77d2781"><span class="section-number-4">3.2.1.</span> <b><i>Kubernetes</i></b></h4>
<div class="imagecol" id="orgb9657a8">
<div id="org5c37d09" class="figure">
<div id="org7bd5d24" class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV8/pKJVh3YQcchQneyiIo61CkWoEGqFVh1MLv2CJg1Jiouj4Fpw8GOx6uDirKuDqyAI
foA4OzgpukiJ/0sKLWI8OO7Hu3uPu3eAv1llqhlMAKpmGZlUUsjlV4XQKwIIoh+DiEjM1OdEMQ3P
@ -29898,7 +29898,7 @@ YII=" />
</div>
<div class="textcol" id="org26fc21d">
<div class="textcol" id="org81e055f">
<p>
Le plus connu et utilisé, objet de ce cours
</p>
@ -29906,11 +29906,11 @@ Le plus connu et utilisé, objet de ce cours
</div>
</section>
<section id="slide-org423daa3">
<h4 id="org423daa3"><span class="section-number-4">3.2.2.</span> <i><b>Nomad</b></i></h4>
<div class="imagecol" id="orge97c172">
<section id="slide-org86b9cd7">
<h4 id="org86b9cd7"><span class="section-number-4">3.2.2.</span> <i><b>Nomad</b></i></h4>
<div class="imagecol" id="orgc67765b">
<div id="orgea34b16" class="figure">
<div id="orgb8fa389" class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAYAAADbcAZoAACOgklEQVR4AezdB3Qbx7n//ZXk3p3m
lt4T35Lei9KcuCkSyZ1ZkFaundwo5faanpfpN72f9yhN7pJBzCwgUnSUxshWIYmZBSCKcktxjRV3
lahT858FGcdNsQopYoHv3PM5iyQ3hT9JEB7MzPMEDbNYLBaLxWKxWCwWi8VisVis7u7umTlz5ZOE
@ -30558,7 +30558,7 @@ YII=" />
</div>
<div class="textcol" id="org3d841ce">
<div class="textcol" id="org790a22e">
<p>
Proposé par <i>Hashicorp</i>, solution d'orchestration hybride entre conteneurs, machines virtuelles et machines physiques.
</p>
@ -30566,11 +30566,11 @@ Proposé par <i>Hashicorp</i>, solution d'orchestration hybride entre conteneurs
</div>
</section>
<section id="slide-org8e7b0af">
<h4 id="org8e7b0af"><span class="section-number-4">3.2.3.</span> <i><b>Docker Swarm</b></i></h4>
<div class="imagecol" id="orgf5e54ed">
<section id="slide-orgb2c3f00">
<h4 id="orgb2c3f00"><span class="section-number-4">3.2.3.</span> <i><b>Docker Swarm</b></i></h4>
<div class="imagecol" id="org6e3cfca">
<div id="org62f9af6" class="figure">
<div id="org182badb" class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV/TSkUrBe0g4pChOtlFRRxrFYpQIdQKrTqYXPoFTRqSFBdHwbXg4Mdi1cHFWVcHV0EQ
/ABxdnBSdJES/5cWWsR4cNyPd/ced+8AoVFhmhWIA5pum+lkQszmVsXgK/wIoB9hDMrMMuYkKQXP
@ -30623,7 +30623,7 @@ FEVRFEVRFEVRFEVRFEVRFEVRlCrjX6gn/K57o2i6AAAAAElFTkSuQmCC" />
</div>
<div class="textcol" id="org3794de4">
<div class="textcol" id="org077e7f4">
<p>
Proposé par <i>Docker</i>, solution plus simple mais qui ne permet pas une utilisation aussi avancée.
</p>
@ -30631,11 +30631,11 @@ Proposé par <i>Docker</i>, solution plus simple mais qui ne permet pas une util
</div>
</section>
<section id="slide-org39cf71f">
<h4 id="org39cf71f"><span class="section-number-4">3.2.4.</span> <i><b>Rancher</b></i></h4>
<div class="imagecol" id="org8565523">
<section id="slide-org64eb696">
<h4 id="org64eb696"><span class="section-number-4">3.2.4.</span> <i><b>Rancher</b></i></h4>
<div class="imagecol" id="orgf00bf41">
<div id="orgd19e5d7" class="figure">
<div id="orge1260ea" class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ8AAAB4CAMAAADboYfBAAAAhFBMVEUkU/////8TSv9hfv+Inf9e
ev/o6/8VTP8cT/9AZ/8AQf8ARP/09v8gUf/8/f/Y4P+jsv91i/9pg/+Xp/+9yP/i5/8AN/8AO//u
8f/S2f+wu/8IR/9uhv+3w/+ntf+0v//I0P+Dl/8sWP82Xf97kf9Mbf9Ucv+drf9RZf+Qov88Yv8A
@ -30676,7 +30676,7 @@ HeJtvRXM0+2tjjgI+bxn+3841aReLNGiWwAAAABJRU5ErkJggg==" />
</div>
<div class="textcol" id="org949f52b">
<div class="textcol" id="orgbffe6d0">
<p>
Une surcouche à <i>Kubernetes</i> qui permet de simplifier son utilisation à grande échelle.
</p>
@ -30684,8 +30684,8 @@ Une surcouche à <i>Kubernetes</i> qui permet de simplifier son utilisation à g
</div>
</section>
<section id="slide-org31d3b32">
<h3 id="org31d3b32"><span class="section-number-3">3.3.</span> Solutions à louer</h3>
<section id="slide-orge6cdd52">
<h3 id="orge6cdd52"><span class="section-number-3">3.3.</span> Solutions à louer</h3>
<p>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo
AAB1MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAD/AP8A/6C9p5MAAAAHdElNRQfoBQkJFSyJl0LN
@ -31497,10 +31497,10 @@ MDC0bXzLAAAAAElFTkSuQmCC" />
</section>
</section>
<section>
<section id="slide-org391500f">
<h2 id="org391500f"><span class="section-number-2">4.</span> Pourquoi un orchestrateur</h2>
<section id="slide-orgefdbe1d">
<h2 id="orgefdbe1d"><span class="section-number-2">4.</span> Pourquoi un orchestrateur</h2>
<div id="org6fdfefa" class="figure">
<div id="orgc0d8127" class="figure">
<p><img src="data:image/gif;base64,R0lGODlh4AFoAffzAAkBAgwKDBEGBRILDBYNDBoTERoWExsPDhwNCRwXGCEUESIdISMYFCQaGSUc
GyYlJiYrRycfGycpLycwXSgsOCkrNCogICsjIi5Nbi8jITArMjFmOjIpJzIwPTM9PTQhGzQoIzQ0
RDUXFzUdGTVLcDY2Pjg0MjkoIDkpHDozTTo2ZTpFWDszVztCQDtEQDtNcTw2Rj0sLj5HPz8rIz8t
@ -69470,7 +69470,7 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</div>
</section>
<section id="slide-org391500f-split">
<section id="slide-orgefdbe1d-split">
<ul>
<li>Déploiement et mise à l'échelle automatique</li>
@ -69481,8 +69481,8 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</ul>
</section>
<section id="slide-org347bcac">
<h3 id="org347bcac"><span class="section-number-3">4.1.</span> Déploiement et mise à l'échelle automatique</h3>
<section id="slide-orge0b3174">
<h3 id="orge0b3174"><span class="section-number-3">4.1.</span> Déploiement et mise à l'échelle automatique</h3>
<ul>
<li>Déploiement via de la <i>CI</i></li>
<li>Mises à jours automatiques des conteneurs</li>
@ -69491,8 +69491,8 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</ul>
</section>
<section id="slide-org6c6f81d">
<h3 id="org6c6f81d"><span class="section-number-3">4.2.</span> Haute disponibilité</h3>
<section id="slide-org6ef9380">
<h3 id="org6ef9380"><span class="section-number-3">4.2.</span> Haute disponibilité</h3>
<ul>
<li>Réplication des applications
<ul>
@ -69505,8 +69505,8 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</ul>
</section>
<section id="slide-org1ac2e7d">
<h3 id="org1ac2e7d"><span class="section-number-3">4.3.</span> Optimisation des ressources</h3>
<section id="slide-org5e23900">
<h3 id="org5e23900"><span class="section-number-3">4.3.</span> Optimisation des ressources</h3>
<ul>
<li>Utilisation de conteneurs</li>
<li>Choix des cibles de déploiement en fonction de leur usage et occupation</li>
@ -69515,8 +69515,8 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</ul>
</section>
<section id="slide-org2036f00">
<h3 id="org2036f00"><span class="section-number-3">4.4.</span> Supervision et journalisation</h3>
<section id="slide-orgfcd9781">
<h3 id="orgfcd9781"><span class="section-number-3">4.4.</span> Supervision et journalisation</h3>
<ul>
<li>Gestion unifiée des journaux</li>
<li>Outils automatisés</li>
@ -69526,13 +69526,13 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</section>
</section>
<section>
<section id="slide-org7ada860">
<h2 id="org7ada860"><span class="section-number-2">5.</span> <i>Kubernetes</i></h2>
<section id="slide-orgc333a0a">
<h2 id="orgc333a0a"><span class="section-number-2">5.</span> <i>Kubernetes</i></h2>
<div class="outline-text-2" id="text-5">
</div>
</section>
<section id="slide-org52efc40">
<h3 id="org52efc40"><span class="section-number-3">5.1.</span> Terminologie et concepts</h3>
<section id="slide-org3d07dff">
<h3 id="org3d07dff"><span class="section-number-3">5.1.</span> Terminologie et concepts</h3>
<dl>
<dt><i>Namespace</i></dt><dd><ul>
<li>Un "espace de noms"</li>
@ -69541,7 +69541,7 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</ul>
</section>
<section id="slide-org1e8d841-split"></dd>
<section id="slide-orgafe170e-split"></dd>
<dt><i>Pod</i></dt><dd><a href="https://kubernetes.io/fr/docs/concepts/workloads/pods/pod-overview/">doc</a>
<ul>
@ -69554,7 +69554,7 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</dl>
</section>
<section id="slide-org52efc40-split">
<section id="slide-org3d07dff-split">
<dl>
<dt><i>Service</i></dt><dd><a href="https://kubernetes.io/fr/docs/concepts/services-networking/service/">doc</a>
@ -69568,7 +69568,7 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</dl>
</section>
<section id="slide-org52efc40-split">
<section id="slide-org3d07dff-split">
<dl>
<dt><i>Volume</i></dt><dd><a href="https://kubernetes.io/fr/docs/concepts/storage/volumes/">doc</a>
@ -69581,7 +69581,7 @@ joAHaXAGFHEEVUAHkzA4WxYH4SpGG0EKJZI/Wx2eAQEAOw==" />
</dl>
</section>
<section id="slide-org52efc40-split">
<section id="slide-org3d07dff-split">
<p>
Il reste encore une multitudes de concepts et de termes propres à <i>Kubernetes</i>.
@ -69589,10 +69589,10 @@ Je vous invite donc à consulter cette page: <a href="https://kubernetes.io/fr/d
</p>
</section>
<section id="slide-org161e8b9">
<h3 id="org161e8b9"><span class="section-number-3">5.2.</span> Architecture</h3>
<section id="slide-orgc762ada">
<h3 id="orgc762ada"><span class="section-number-3">5.2.</span> Architecture</h3>
<div id="orgca7ac8e" class="figure">
<div id="org790dfdb" class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaEAAALCCAYAAADH+R8pAAAgAElEQVR4Xux9B2Acxd39u37qxZaL
3HsF2xibasDg0GOH3mscekkhyUfPny8JkHyh1wCBgCGAKQkQusHGdBuwMca9d8vqOl2/+7/f7K2u
6KQ7WXIBzSZC1t3u7Ozb2dnfvHnzfpYoN+hNI6AR0AhoBDQCGgGNgEZAI6AR0AhoBDQCGgGNgEZA
@ -79103,7 +79103,7 @@ rqv/Dz8GEh2zzZPTAAAAAElFTkSuQmCC" />
</div>
</section>
<section id="slide-org161e8b9-split">
<section id="slide-orgc762ada-split">
<ul>
<li>Composé de plusieurs nœuds</li>
@ -79112,8 +79112,8 @@ rqv/Dz8GEh2zzZPTAAAAAElFTkSuQmCC" />
</ul>
</section>
<section id="slide-org5718d97">
<h4 id="org5718d97"><span class="section-number-4">5.2.1.</span> Nœud de gestion</h4>
<section id="slide-org53d53a1">
<h4 id="org53d53a1"><span class="section-number-4">5.2.1.</span> Nœud de gestion</h4>
<ul>
<li>Aussi appelé <i>"control plane"</i> dans la terminologie <i>K8S</i></li>
<li>Composant principal</li>
@ -79123,7 +79123,7 @@ rqv/Dz8GEh2zzZPTAAAAAElFTkSuQmCC" />
</ul>
</section>
<section id="slide-org5718d97-split">
<section id="slide-org53d53a1-split">
<dl>
<dt><i>etcd</i></dt><dd>stocke les éléments de configuration</dd>
@ -79134,8 +79134,8 @@ rqv/Dz8GEh2zzZPTAAAAAElFTkSuQmCC" />
</dl>
</section>
<section id="slide-orga44c5fb">
<h4 id="orga44c5fb"><span class="section-number-4">5.2.2.</span> Nœud de travail</h4>
<section id="slide-org3a8ec5e">
<h4 id="org3a8ec5e"><span class="section-number-4">5.2.2.</span> Nœud de travail</h4>
<ul>
<li>C'est sur ces nœuds que les conteneurs sont déployés</li>
<li>Cela peut être des machines physiques ou virtuelles</li>
@ -79143,7 +79143,7 @@ rqv/Dz8GEh2zzZPTAAAAAElFTkSuQmCC" />
</ul>
</section>
<section id="slide-orga44c5fb-split">
<section id="slide-org3a8ec5e-split">
<dl>
<dt><i>kubelet</i> ou <i>node manager</i></dt><dd><ul>
@ -79165,18 +79165,31 @@ rqv/Dz8GEh2zzZPTAAAAAElFTkSuQmCC" />
</section>
</section>
<section>
<section id="slide-orgf74acd9">
<h2 id="orgf74acd9"><span class="section-number-2">6.</span> Prise en main</h2>
<section id="slide-orgd78dd6e">
<h2 id="orgd78dd6e"><span class="section-number-2">6.</span> Prise en main</h2>
<ul>
<li>Les interactions avec <i>K8S</i> se font via la commande <code>kubectl</code>.</li>
<li>Quelques interactions sont aussi possible via le <i>dashboard</i> mais ce dernier est limité et ne sera pas abordé pendant ce cours.</li>
</ul>
</section>
<section id="slide-org18fb458">
<h3 id="org18fb458"><span class="section-number-3">6.1.</span> Appliquer une configuration</h3>
<p>
Cela se fait avec la commande
</p>
<div class="org-src-container">
<pre class="src src-bash" ><code trim>kubectl apply -f &lt;fichier.yaml&gt;
</code></pre>
</div>
</section>
<section id="slide-org2181907">
<h3 id="org2181907"><span class="section-number-3">6.1.</span> Lister des ressources</h3>
<div class="NOTE" id="org94b797a">
<section id="slide-orgb51784c">
<h3 id="orgb51784c"><span class="section-number-3">6.2.</span> Lister des ressources</h3>
<div class="NOTE" id="org5246715">
<p>
Syntaxe:
</p>
@ -79204,9 +79217,9 @@ profiles-app-svc LoadBalancer 10.97.188.25 &lt;pending&gt; 8000:30487/
</div>
</section>
<section id="slide-org6fc631e">
<h3 id="org6fc631e"><span class="section-number-3">6.2.</span> Lire les journaux d'un <i>pod</i></h3>
<div class="NOTE" id="org776833c">
<section id="slide-org5d8194b">
<h3 id="org5d8194b"><span class="section-number-3">6.3.</span> Lire les journaux d'un <i>pod</i></h3>
<div class="NOTE" id="org9fb682c">
<p>
Syntaxe:
</p>
@ -79225,9 +79238,9 @@ Syntaxe:
</div>
</section>
<section id="slide-org7c58ae4">
<h3 id="org7c58ae4"><span class="section-number-3">6.3.</span> Supprimer une ressource</h3>
<div class="NOTE" id="org39fc4dc">
<section id="slide-orgdc8a9bb">
<h3 id="orgdc8a9bb"><span class="section-number-3">6.4.</span> Supprimer une ressource</h3>
<div class="NOTE" id="org092ab89">
<p>
Syntaxe:
</p>
@ -79236,6 +79249,14 @@ Syntaxe:
<code>kubectl delete &lt;type ressource&gt; &lt;nom ressource&gt;</code>
</p>
<p>
ou
</p>
<p>
<code>kubectl delete -f &lt;fichier.yaml&gt;</code>
</p>
</div>
<div class="org-src-container">
@ -79246,9 +79267,9 @@ pod <span style="color: #f1fa8c;">"profiles-app"</span> deleted
</div>
</section>
<section id="slide-orge3a348a">
<h3 id="orge3a348a"><span class="section-number-3">6.4.</span> Décrire une ressource</h3>
<div class="NOTE" id="org4a9f053">
<section id="slide-org6656135">
<h3 id="org6656135"><span class="section-number-3">6.5.</span> Décrire une ressource</h3>
<div class="NOTE" id="orgb02201a">
<p>
Syntaxe:
</p>
@ -79277,9 +79298,14 @@ IP: 10.244.0.7
</div>
</section>
<section id="slide-orgbd65b01">
<h3 id="orgbd65b01"><span class="section-number-3">6.5.</span> Créer des ressources</h3>
<div class="smallfont" id="org998ad49">
<section id="slide-org88fffa8">
<h3 id="org88fffa8"><span class="section-number-3">6.6.</span> Créer des ressources</h3>
<div class="outline-text-3" id="text-6-6">
</div>
</section>
<section id="slide-org81474d6">
<h4 id="org81474d6"><span class="section-number-4">6.6.1.</span> Le <i>YAML</i></h4>
<div class="smallfont" id="org330cf5a">
<p>
Dans <i>K8S</i> les ressources se créent depuis des fichiers <i>YAML</i> décrivant la ressource en question et ses paramètres.
</p>
@ -79312,16 +79338,122 @@ Exemple de fichier <i>YAML</i>:
</code></pre>
</div>
</section>
<section id="slide-orgbf641f7">
<h3 id="orgbf641f7"><span class="section-number-3">6.7.</span> Types de ressources et exemples</h3>
<div class="outline-text-3" id="text-6-7">
</div>
</section>
<section id="slide-org0c8b267">
<h4 id="org0c8b267"><span class="section-number-4">6.7.1.</span> <i>Namespace</i></h4>
<p>
<a href="https://kubernetes.io/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace">doc</a>
</p>
<div class="org-src-container">
<pre class="src src-yaml" ><code trim><span style="color: #6272a4;">---</span>
<span style="color: #ffc9e8;">apiVersion</span>: v1 <span style="color: #6272a4;"># </span><span style="color: #6272a4;">n&#233;cessaire pour que K8S comprenne</span>
<span style="color: #ffc9e8;">kind</span>: Namespace <span style="color: #6272a4;"># </span><span style="color: #6272a4;">le type de ressource</span>
<span style="color: #ffc9e8;">metadata</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">les informations de la ressource</span>
<span style="color: #ffc9e8;">name</span>: profiles-app <span style="color: #6272a4;"># </span><span style="color: #6272a4;">ici, son nom</span>
</code></pre>
</div>
</section>
<section id="slide-org33e336b">
<h4 id="org33e336b"><span class="section-number-4">6.7.2.</span> <i>Pod</i></h4>
<p>
<a href="https://kubernetes.io/fr/docs/concepts/workloads/pods/pod-overview/">doc</a>
</p>
<div class="org-src-container">
<pre class="src src-yaml" ><code trim><span style="color: #6272a4;">---</span>
<span style="color: #ffc9e8;">apiVersion</span>: v1
<span style="color: #ffc9e8;">kind</span>: Pod <span style="color: #6272a4;"># </span><span style="color: #6272a4;">ici le type est "pod"</span>
<span style="color: #ffc9e8;">metadata</span>:
<span style="color: #ffc9e8;">namespace</span>: profiles-app-ns <span style="color: #6272a4;"># </span><span style="color: #6272a4;">on choisi le namespace</span>
<span style="color: #ffc9e8;">name</span>: profiles-app <span style="color: #6272a4;"># </span><span style="color: #6272a4;">le nom du pod</span>
<span style="color: #ffc9e8;">spec</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">puis ses sp&#233;cifications</span>
<span style="color: #ffc9e8;">containers</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">il contient des conteneurs</span>
- <span style="color: #ffc9e8;">name</span>: database <span style="color: #6272a4;"># </span><span style="color: #6272a4;">nom du conteneur</span>
<span style="color: #ffc9e8;">image</span>: image:latest <span style="color: #6272a4;"># </span><span style="color: #6272a4;">l'image &#224; utiliser</span>
<span style="color: #ffc9e8;">env</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">variables d'environnement</span>
- <span style="color: #ffc9e8;">name</span>: COULEUR <span style="color: #6272a4;"># </span><span style="color: #6272a4;">avec un nom</span>
<span style="color: #ffc9e8;">value</span>: <span style="color: #f1fa8c;">"rouge"</span> <span style="color: #6272a4;"># </span><span style="color: #6272a4;">et une valeur</span>
</code></pre>
</div>
</section>
<section id="slide-org67edaa7">
<h4 id="org67edaa7"><span class="section-number-4">6.7.3.</span> <i>Deployment</i></h4>
<p>
<a href="https://kubernetes.io/fr/docs/concepts/workloads/controllers/deployment/">doc</a>
</p>
<div class="org-src-container">
<pre class="src src-yaml" ><code trim><span style="color: #ffc9e8;">apiVersion</span>: apps/v1
<span style="color: #ffc9e8;">kind</span>: Deployment <span style="color: #6272a4;"># </span><span style="color: #6272a4;">un nouveau type, "Deployment"</span>
<span style="color: #ffc9e8;">metadata</span>:
<span style="color: #ffc9e8;">name</span>: nginx-deployment <span style="color: #6272a4;"># </span><span style="color: #6272a4;">on lui met un nom</span>
<span style="color: #ffc9e8;">labels</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">et des labels</span>
<span style="color: #ffc9e8;">app</span>: nginx
<span style="color: #ffc9e8;">spec</span>:
<span style="color: #ffc9e8;">replicas</span>: 3 <span style="color: #6272a4;"># </span><span style="color: #6272a4;">le nombre de r&#233;plications voulues</span>
<span style="color: #ffc9e8;">selector</span>:
<span style="color: #ffc9e8;">matchLabels</span>:
<span style="color: #ffc9e8;">app</span>: nginx
<span style="color: #ffc9e8;">template</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">champs qui seront appliqu&#233;s aux pods</span>
<span style="color: #ffc9e8;">metadata</span>:
<span style="color: #ffc9e8;">labels</span>:
<span style="color: #ffc9e8;">app</span>: nginx
<span style="color: #ffc9e8;">spec</span>:
<span style="color: #ffc9e8;">containers</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">on sp&#233;cifie les conteneurs</span>
- <span style="color: #ffc9e8;">name</span>: nginx
<span style="color: #ffc9e8;">image</span>: nginx:1.7.9
<span style="color: #ffc9e8;">ports</span>:
- <span style="color: #ffc9e8;">containerPort</span>: 80
</code></pre>
</div>
</section>
<section id="slide-orgd80cdc0">
<h4 id="orgd80cdc0"><span class="section-number-4">6.7.4.</span> <i>Service</i></h4>
<p>
<a href="https://kubernetes.io/fr/docs/concepts/services-networking/service/">doc</a>
</p>
<div class="org-src-container">
<pre class="src src-yaml" ><code trim><span style="color: #6272a4;">---</span>
<span style="color: #ffc9e8;">apiVersion</span>: v1
<span style="color: #ffc9e8;">kind</span>: Service <span style="color: #6272a4;"># </span><span style="color: #6272a4;">ici le type est "service"</span>
<span style="color: #ffc9e8;">metadata</span>:
<span style="color: #ffc9e8;">namespace</span>: profiles-app-ns <span style="color: #6272a4;"># </span><span style="color: #6272a4;">on choisi le namespace</span>
<span style="color: #ffc9e8;">name</span>: my-service <span style="color: #6272a4;"># </span><span style="color: #6272a4;">on choisi un nom pour le service</span>
<span style="color: #ffc9e8;">spec</span>:
<span style="color: #ffc9e8;">selector</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">r&#232;gles pour s&#233;lectionner le pod</span>
<span style="color: #ffc9e8;">app.kubernetes.io/name</span>: profiles-app <span style="color: #6272a4;"># </span><span style="color: #6272a4;">selection par nom</span>
<span style="color: #ffc9e8;">ports</span>: <span style="color: #6272a4;"># </span><span style="color: #6272a4;">on choisi les ports &#224; exposer</span>
- <span style="color: #ffc9e8;">protocol</span>: TCP <span style="color: #6272a4;"># </span><span style="color: #6272a4;">le protocole</span>
<span style="color: #ffc9e8;">port</span>: 80 <span style="color: #6272a4;"># </span><span style="color: #6272a4;">le port *CIBLE*</span>
<span style="color: #ffc9e8;">targetPort</span>: 9376 <span style="color: #6272a4;"># </span><span style="color: #6272a4;">le port *DU POD*</span>
</code></pre>
</div>
</section>
</section>
<section>
<section id="slide-org73310c1">
<h2 id="org73310c1"><span class="section-number-2">7.</span> Aller plus loin</h2>
<section id="slide-orga775bc9">
<h2 id="orga775bc9"><span class="section-number-2">7.</span> Aller plus loin</h2>
<ul>
<li><a id="org78c0632"></a> <a href="https://www.cncf.io/reports/cncf-annual-survey-2023/">https://www.cncf.io/reports/cncf-annual-survey-2023/</a></li>
<li>[1] <a id="orge3ccc9b"></a> <a href="https://www.cncf.io/reports/cncf-annual-survey-2023/">https://www.cncf.io/reports/cncf-annual-survey-2023/</a></li>
<li><i>Services</i>: <a href="https://kubernetes.io/fr/docs/concepts/services-networking/service/">https://kubernetes.io/fr/docs/concepts/services-networking/service/</a></li>
<li><i>Pods</i>: <a href="https://kubernetes.io/docs/concepts/workloads/pods/">https://kubernetes.io/docs/concepts/workloads/pods/</a></li>
<li><i>Deployments</i>: <a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/">https://kubernetes.io/docs/concepts/workloads/controllers/deployment/</a></li>
</ul>
</section>

@ -2,6 +2,7 @@
#+OPTIONS: toc:nil date:nil author:nil reveal_single_file:t timestamp: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}
@ -64,6 +65,7 @@
** Plusieurs orchestrateurs
*** */Kubernetes/*
#+BEGIN_imagecol
#+ATTR_LATEX: :width 2cm
[[file:./images/k8s_logo.png]]
#+END_imagecol
@ -73,6 +75,7 @@ Le plus connu et utilisé, objet de ce cours
*** /*Nomad*/
#+BEGIN_imagecol
#+ATTR_LATEX: :width 2cm
[[file:./images/nomad_logo.png]]
#+END_imagecol
@ -82,6 +85,7 @@ Proposé par /Hashicorp/, solution d'orchestration hybride entre conteneurs, mac
*** /*Docker Swarm*/
#+BEGIN_imagecol
#+ATTR_LATEX: :width 2cm
[[file:./images/swarm_logo.png]]
#+END_imagecol
@ -91,6 +95,7 @@ Proposé par /Docker/, solution plus simple mais qui ne permet pas une utilisati
*** /*Rancher*/
#+BEGIN_imagecol
#+ATTR_LATEX: :width 2cm
[[file:./images/rancher_logo.png]]
#+END_imagecol
@ -99,8 +104,11 @@ Une surcouche à /Kubernetes/ qui permet de simplifier son utilisation à grande
#+END_textcol
** Solutions à louer
#+ATTR_LATEX: :width 2cm
[[file:./images/eks_logo.png]]
#+ATTR_LATEX: :width 2cm
[[file:./images/aks_logo.png]]
#+ATTR_LATEX: :width 2cm
[[file:./images/gke_logo.png]]
* Pourquoi un orchestrateur
@ -209,6 +217,13 @@ Je vous invite donc à consulter cette page: [[https://kubernetes.io/fr/docs/con
- Les interactions avec /K8S/ se font via la commande =kubectl=.
- Quelques interactions sont aussi possible via le /dashboard/ mais ce dernier est limité et ne sera pas abordé pendant ce cours.
** Appliquer une configuration
Cela se fait avec la commande
#+BEGIN_SRC bash
kubectl apply -f <fichier.yaml>
#+END_SRC
** Lister des ressources
#+BEGIN_NOTE
Syntaxe:
@ -246,6 +261,10 @@ Syntaxe:
Syntaxe:
=kubectl delete <type ressource> <nom ressource>=
ou
=kubectl delete -f <fichier.yaml>=
#+END_NOTE
#+BEGIN_SRC bash
@ -299,8 +318,8 @@ liste_de_clefs_valeurs:
note: 10
#+END_SRC
*** Types de ressources et exemples
**** /Namespace/
** Types de ressources et exemples
*** /Namespace/
[[https://kubernetes.io/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace][doc]]
#+BEGIN_SRC yaml
---
@ -310,27 +329,75 @@ metadata: # les informations de la ressource
name: profiles-app # ici, son nom
#+END_SRC
**** /Pod/
*** /Pod/
[[https://kubernetes.io/fr/docs/concepts/workloads/pods/pod-overview/][doc]]
#+BEGIN_SRC yaml
---
apiVersion: v1
kind: Pod # ici le type est "pod"
kind: Pod # ici le type est "pod"
metadata:
namespace: profiles-app-ns # on choisi le namespace
name: profiles-app # le nom du pod
spec: # puis ses spécifications
containers: # il contient des conteneurs
- name: database # nom du conteneur
image: image:latest # l'image à utiliser
env: # variables d'environnement
- name: COULEUR # avec un nom
value: "rouge" # et une valeur
#+END_SRC
*** /Deployment/
[[https://kubernetes.io/fr/docs/concepts/workloads/controllers/deployment/][doc]]
#+BEGIN_SRC yaml
apiVersion: apps/v1
kind: Deployment # un nouveau type, "Deployment"
metadata:
namespace: profiles-app # on choisi le namespace
name: profiles-app # le nom du pod
spec: # puis ses spécifications
containers: # il contient des conteneurs
- name: database # nom du conteneur
image: image:latest # l'image à utiliser
env: # on peux mettre des variables d'environnement
- name: COULEUR # avec un nom
value: "rouge" # et une valeur
name: nginx-deployment # on lui met un nom
labels: # et des labels
app: nginx
spec:
replicas: 3 # le nombre de réplications voulues
selector:
matchLabels:
app: nginx
template: # champs qui seront appliqués aux pods
metadata:
labels:
app: nginx
spec:
containers: # on spécifie les conteneurs
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
#+END_SRC
*** /Service/
[[https://kubernetes.io/fr/docs/concepts/services-networking/service/][doc]]
#+BEGIN_SRC yaml
---
apiVersion: v1
kind: Service # ici le type est "service"
metadata:
namespace: profiles-app-ns # on choisi le namespace
name: my-service # on choisi un nom pour le service
spec:
selector: # règles pour sélectionner le pod
app.kubernetes.io/name: profiles-app # selection par nom
ports: # on choisi les ports à exposer
- protocol: TCP # le protocole
port: 80 # le port *CIBLE*
targetPort: 9376 # le port *DU POD*
#+END_SRC
* Aller plus loin
- [1] <<source:cncf_survey>> [[https://www.cncf.io/reports/cncf-annual-survey-2023/][https://www.cncf.io/reports/cncf-annual-survey-2023/]]
- /Services/: https://kubernetes.io/fr/docs/concepts/services-networking/service/
- /Pods/: https://kubernetes.io/docs/concepts/workloads/pods/
- /Deployments/: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

Binary file not shown.

@ -0,0 +1,503 @@
% 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}
\date{}
\title{Cours de virtualisation avancée: \emph{Kubernetes}, introduction}
\hypersetup{
pdfauthor={Evrard Van Espen},
pdftitle={Cours de virtualisation avancée: \emph{Kubernetes}, introduction},
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 30.0.50 (Org mode 9.6.15)},
pdflang={English}}
\begin{document}
\maketitle
\section{Introduction, les \emph{clusters}}
\label{sec:orgc3a168b}
\begin{itemize}
\item Grappe de serveur
\item Groupe de machines fonctionnant ensemble
\end{itemize}
\section{\emph{Kubernetes}}
\label{sec:org2a25d0e}
\begin{center}
\includegraphics[width=.9\linewidth]{./images/kube_logo.png}
\end{center}
\subsection{C'est quoi ?}
\label{sec:org21cf649}
\begin{itemize}
\item Ancien mot grec signifiant "timonier" (marin qui tient la barre)
\item Souvent abrégé \emph{"K8S"}
\item Système \emph{open-source} pour le \textbf{déploiement}, la \textbf{mise à léchelle} et \textbf{gestion} de conteneurs
\item Configuration via des fichiers \emph{YAML}
\end{itemize}
\subsection{Origine}
\label{sec:org25e70dd}
\begin{itemize}
\item Lancé par \emph{Google} en 2014
\item \emph{Google} s'associe à la \emph{Linux Foundation} pour créer la \emph{CNCF} en utilisant \emph{K8S} comme projet de départ
\end{itemize}
\emph{CNCF}: \emph{Cloud Native Computer Foundation}
\subsection{Quelques statistiques}
\label{sec:org84a3abf}
\begin{itemize}
\item 66\% : c'est le nombre d'entreprises qui utilisent \emph{K8S} en prod en 2023 [\ref{org0ea15b0}]
\item Entre 2018 et 2020 : \emph{K8S} top 10 projets les plus actifs \emph{Github}
\item Le nombre de conteneurs en prod dans le monde est inestimable mais \emph{Google} estime en lancer \textbf{2 milliards par semaine}
\end{itemize}
\section{Le monde des conteneurs}
\label{sec:org5ecc774}
\url{./images/containers.webp}
\subsection{Des applications souvent présentes}
\label{sec:org943bbce}
\begin{center}
\includegraphics[width=.9\linewidth]{./images/top_container_images.png}
\end{center}
\begin{smallfont}
\begin{center}
\begin{tabular}{ll}
\textbf{Redis} & BDD clef-valeur\\[0pt]
\textbf{ElasticSearch} & NOSQL / moteur de recherche\\[0pt]
\textbf{Postgresql} & base de données SQL\\[0pt]
\textbf{RabbitMQ} & agent de message\\[0pt]
\textbf{Kafka} & agent de message / événements\\[0pt]
\textbf{Vault} & BDD sécurisés\\[0pt]
\textbf{Mongo} & BDD NOSQL\\[0pt]
\textbf{Nginx} & serveur web\\[0pt]
\textbf{Consul} & gestion de réseau\\[0pt]
\textbf{MySql} & BDD SQL\\[0pt]
\end{tabular}
\end{center}
\end{smallfont}
\subsection{Plusieurs orchestrateurs}
\label{sec:orgbfed1cc}
\subsubsection{\textbf{\emph{Kubernetes}}}
\label{sec:orgc08bdad}
\begin{imagecol}
\begin{center}
\includegraphics[width=2cm]{./images/k8s_logo.png}
\end{center}
\end{imagecol}
\begin{textcol}
Le plus connu et utilisé, objet de ce cours
\end{textcol}
\subsubsection{\emph{\textbf{Nomad}}}
\label{sec:org753a09f}
\begin{imagecol}
\begin{center}
\includegraphics[width=2cm]{./images/nomad_logo.png}
\end{center}
\end{imagecol}
\begin{textcol}
Proposé par \emph{Hashicorp}, solution d'orchestration hybride entre conteneurs, machines virtuelles et machines physiques.
\end{textcol}
\subsubsection{\emph{\textbf{Docker Swarm}}}
\label{sec:org806b74c}
\begin{imagecol}
\begin{center}
\includegraphics[width=2cm]{./images/swarm_logo.png}
\end{center}
\end{imagecol}
\begin{textcol}
Proposé par \emph{Docker}, solution plus simple mais qui ne permet pas une utilisation aussi avancée.
\end{textcol}
\subsubsection{\emph{\textbf{Rancher}}}
\label{sec:org992d269}
\begin{imagecol}
\begin{center}
\includegraphics[width=2cm]{./images/rancher_logo.png}
\end{center}
\end{imagecol}
\begin{textcol}
Une surcouche à \emph{Kubernetes} qui permet de simplifier son utilisation à grande échelle.
\end{textcol}
\subsection{Solutions à louer}
\label{sec:org51e50a2}
\begin{center}
\includegraphics[width=2cm]{./images/eks_logo.png}
\end{center}
\begin{center}
\includegraphics[width=2cm]{./images/aks_logo.png}
\end{center}
\begin{center}
\includegraphics[width=2cm]{./images/gke_logo.png}
\end{center}
\section{Pourquoi un orchestrateur}
\label{sec:org43da0e2}
\url{./images/why.gif}
\begin{itemize}
\item Déploiement et mise à l'échelle automatique
\item Haute disponibilité / réplication
\item Optimisation des ressources
\item Supervision et journalisation
\end{itemize}
\subsection{Déploiement et mise à l'échelle automatique}
\label{sec:orgc07e292}
\begin{itemize}
\item Déploiement via de la \emph{CI}
\item Mises à jours automatiques des conteneurs
\item Allocation automatique des ressources
\end{itemize}
\subsection{Haute disponibilité}
\label{sec:orga8c0f71}
\begin{itemize}
\item Réplication des applications
\begin{itemize}
\item Pour les performances
\item Pour la sécurité
\end{itemize}
\item Tolérance aux pannes de machines
\end{itemize}
\subsection{Optimisation des ressources}
\label{sec:org8d7c148}
\begin{itemize}
\item Utilisation de conteneurs
\item Choix des cibles de déploiement en fonction de leur usage et occupation
\item Dé-allocation des ressources en cas de baisse de charge
\end{itemize}
\subsection{Supervision et journalisation}
\label{sec:orgaa33e66}
\begin{itemize}
\item Gestion unifiée des journaux
\item Outils automatisés
\end{itemize}
\section{\emph{Kubernetes}}
\label{sec:orgc3a6b2f}
\subsection{Terminologie et concepts}
\label{sec:org98aabf4}
\begin{description}
\item[{\emph{Namespace}}] \begin{itemize}
\item Un "espace de noms"
\item Permet de regrouper les ressources pour s'y retrouver et simplifier la gestion
\end{itemize}
\item[{\emph{Pod}}] \href{https://kubernetes.io/fr/docs/concepts/workloads/pods/pod-overview/}{doc}
\begin{itemize}
\item La plus petite unité d'exécution
\item C'est dans ces éléments que sont présents les conteneurs
\item Réseau local entre les conteneurs d'un même \emph{pod}
\end{itemize}
\end{description}
\begin{description}
\item[{\emph{Service}}] \href{https://kubernetes.io/fr/docs/concepts/services-networking/service/}{doc}
\begin{itemize}
\item Une manière d'exposer une application s'exécutant sur un ensemble de \emph{pods} en tant que service réseau
\item Possède une adresse \emph{IP} et un nom \emph{DNS}
\item Permet l'équilibration de la charge
\end{itemize}
\end{description}
\begin{description}
\item[{\emph{Volume}}] \href{https://kubernetes.io/fr/docs/concepts/storage/volumes/}{doc}
\begin{itemize}
\item Permet le stockage des fichiers d'un \emph{pod} (sinon fichiers perdu lors de la destruction du \emph{pod})
\item Permet de partager des fichiers entre des conteneurs au sein d'un \emph{pod}
\end{itemize}
\end{description}
Il reste encore une multitudes de concepts et de termes propres à \emph{Kubernetes}.
Je vous invite donc à consulter cette page: \href{https://kubernetes.io/fr/docs/concepts/}{https://kubernetes.io/fr/docs/concepts/}.
\subsection{Architecture}
\label{sec:org679afa4}
\begin{center}
\includegraphics[width=.9\linewidth]{./images/k8s_cluster.png}
\end{center}
\begin{itemize}
\item Composé de plusieurs nœuds
\item Au moins 1 nœud de gestion et 1 nœud de travail
\end{itemize}
\subsubsection{Nœud de gestion}
\label{sec:orgcd1d45e}
\begin{itemize}
\item Aussi appelé \emph{"control plane"} dans la terminologie \emph{K8S}
\item Composant principal
\item Gestion de la charge de travail
\item Services qui contrôlent le \emph{cluster}
\end{itemize}
\begin{description}
\item[{\emph{etcd}}] stocke les éléments de configuration
\item[{\emph{API server}}] reçoit et traite les requêtes de gestion. Vérifie en permanence que l'état du \emph{cluster} correspond aux configurations stockées dans \texttt{etcd}
\item[{\emph{Scheduler}}] se charge de la répartition de la charge
\item[{\emph{Controller manager}}] applique les actions requises à la gestion du \emph{cluster}
\end{description}
\subsubsection{Nœud de travail}
\label{sec:org7ef6e06}
\begin{itemize}
\item C'est sur ces nœuds que les conteneurs sont déployés
\item Cela peut être des machines physiques ou virtuelles
\end{itemize}
\begin{description}
\item[{\emph{kubelet} ou \emph{node manager}}] \begin{itemize}
\item Se charge de la gestion des \emph{pods} sur le nœud
\item Reçoit ses ordres du \emph{control plane}
\item Informe le \emph{control plane} de l'état du nœud
\end{itemize}
\item[{\emph{kube-proxy}}] \begin{itemize}
\item Se charge de la gestion du réseau
\end{itemize}
\item[{\emph{container runtime}}] L'environnement dexécution des conteneurs, souvent \emph{Docker}
\end{description}
\section{Prise en main}
\label{sec:org41ca293}
\begin{itemize}
\item Les interactions avec \emph{K8S} se font via la commande \texttt{kubectl}.
\item Quelques interactions sont aussi possible via le \emph{dashboard} mais ce dernier est limité et ne sera pas abordé pendant ce cours.
\end{itemize}
\subsection{Appliquer une configuration}
\label{sec:org1cffc4a}
Cela se fait avec la commande
\begin{minted}[]{bash}
kubectl apply -f <fichier.yaml>
\end{minted}
\subsection{Lister des ressources}
\label{sec:orgb66e506}
\begin{NOTE}
Syntaxe:
\texttt{kubectl get <ressource>}
\end{NOTE}
\begin{minted}[]{bash}
kubectl get pods
NAME READY STATUS RESTARTS AGE
profiles-app 3/3 Running 0 22s
\end{minted}
\begin{minted}[]{bash}
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
profiles-app-svc LoadBalancer 10.97.188.25 <pending> 8000:30487/TCP,8001:32451/TCP 5s
\end{minted}
\subsection{Lire les journaux d'un \emph{pod}}
\label{sec:org366f208}
\begin{NOTE}
Syntaxe:
\texttt{kubectl logs <nom ressource>}
\end{NOTE}
\begin{minted}[]{bash}
kubectl logs profiles-app
...
\end{minted}
\subsection{Supprimer une ressource}
\label{sec:orgf9e8dd4}
\begin{NOTE}
Syntaxe:
\texttt{kubectl delete <type ressource> <nom ressource>}
ou
\texttt{kubectl delete -f <fichier.yaml>}
\end{NOTE}
\begin{minted}[]{bash}
kubectl delete pods profiles-app
pod "profiles-app" deleted
\end{minted}
\subsection{Décrire une ressource}
\label{sec:org0573c54}
\begin{NOTE}
Syntaxe:
\texttt{kubectl describe <type ressource> <nom ressource>}
\end{NOTE}
\begin{minted}[]{bash}
kubectl -n profiles-app describe pod profiles-app
Name: profiles-app
Namespace: profiles-app
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
Start Time: Thu, 09 May 2024 17:35:54 +0200
Labels: run=profiles-app
Annotations: <none>
Status: Running
IP: 10.244.0.7
...
\end{minted}
\subsection{Créer des ressources}
\label{sec:orgb64ac81}
\subsubsection{Le \emph{YAML}}
\label{sec:org9988630}
\begin{smallfont}
Dans \emph{K8S} les ressources se créent depuis des fichiers \emph{YAML} décrivant la ressource en question et ses paramètres.
Le language \emph{YAML} est un language de sérialisation semblale à \emph{JSON}.
L'extension de fichier est \texttt{.yaml} ou \texttt{.yml}.
Exemple de fichier \emph{YAML}:
\end{smallfont}
\begin{minted}[]{yaml}
---
clef: valeur
liste_de_nombres:
- 1
- 2
- 3
liste_de_clefs_valeurs:
- titre: blade_runner
note: 10
\end{minted}
\subsection{Types de ressources et exemples}
\label{sec:orge9534e4}
\subsubsection{\emph{Namespace}}
\label{sec:org462bf90}
\href{https://kubernetes.io/docs/tasks/administer-cluster/namespaces/\#creating-a-new-namespace}{doc}
\begin{minted}[]{yaml}
---
apiVersion: v1 # nécessaire pour que K8S comprenne
kind: Namespace # le type de ressource
metadata: # les informations de la ressource
name: profiles-app # ici, son nom
\end{minted}
\subsubsection{\emph{Pod}}
\label{sec:org39c1bdd}
\href{https://kubernetes.io/fr/docs/concepts/workloads/pods/pod-overview/}{doc}
\begin{minted}[]{yaml}
---
apiVersion: v1
kind: Pod # ici le type est "pod"
metadata:
namespace: profiles-app-ns # on choisi le namespace
name: profiles-app # le nom du pod
spec: # puis ses spécifications
containers: # il contient des conteneurs
- name: database # nom du conteneur
image: image:latest # l'image à utiliser
env: # variables d'environnement
- name: COULEUR # avec un nom
value: "rouge" # et une valeur
\end{minted}
\subsubsection{\emph{Deployment}}
\label{sec:org598f74f}
\href{https://kubernetes.io/fr/docs/concepts/workloads/controllers/deployment/}{doc}
\begin{minted}[]{yaml}
apiVersion: apps/v1
kind: Deployment # un nouveau type, "Deployment"
metadata:
name: nginx-deployment # on lui met un nom
labels: # et des labels
app: nginx
spec:
replicas: 3 # le nombre de réplications voulues
selector:
matchLabels:
app: nginx
template: # champs qui seront appliqués aux pods
metadata:
labels:
app: nginx
spec:
containers: # on spécifie les conteneurs
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
\end{minted}
\subsubsection{\emph{Service}}
\label{sec:org70f82f6}
\href{https://kubernetes.io/fr/docs/concepts/services-networking/service/}{doc}
\begin{minted}[]{yaml}
---
apiVersion: v1
kind: Service # ici le type est "service"
metadata:
namespace: profiles-app-ns # on choisi le namespace
name: my-service # on choisi un nom pour le service
spec:
selector: # règles pour sélectionner le pod
app.kubernetes.io/name: profiles-app # selection par nom
ports: # on choisi les ports à exposer
- protocol: TCP # le protocole
port: 80 # le port *CIBLE*
targetPort: 9376 # le port *DU POD*
\end{minted}
\section{Aller plus loin}
\label{sec:org09845a1}
\begin{itemize}
\item\relax [1] \label{org0ea15b0} \href{https://www.cncf.io/reports/cncf-annual-survey-2023/}{https://www.cncf.io/reports/cncf-annual-survey-2023/}
\item \emph{Services}: \url{https://kubernetes.io/fr/docs/concepts/services-networking/service/}
\item \emph{Pods}: \url{https://kubernetes.io/docs/concepts/workloads/pods/}
\item \emph{Deployments}: \url{https://kubernetes.io/docs/concepts/workloads/controllers/deployment/}
\end{itemize}
\end{document}

@ -0,0 +1,10 @@
# Installation de minikube
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
# Initialisation de minikube
./minikube start --driver=docker
# Installation du client kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl

@ -0,0 +1,27 @@
---
apiVersion: v1
kind: Pod
metadata:
name: hello-world
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: kicbase/echo-server:1.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
selector:
app: hello-world
ports:
- protocol: TCP
port: 4242
targetPort: 8080
nodePort: 30000

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
git\PYG{+w}{ }clone\PYG{+w}{ }https://codefirst.iut.uca.fr/git/evrard.van\PYGZus{}espen/cours\PYGZus{}virtualisation\PYGZus{}avancee\PYGZus{}ETUD.git
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
curl\PYG{+w}{ }http://10.109.243.202:30000
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
./kubectl\PYG{+w}{ }get\PYG{+w}{ }namespaces
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
vdn\PYGZhy{}ssh\PYG{+w}{ }test@debian\PYGZhy{}1
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
./minikube\PYG{+w}{ }tunnel
\end{Verbatim}

@ -0,0 +1,8 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{c+c1}{\PYGZsh{} Installation de minikube}
curl\PYG{+w}{ }\PYGZhy{}Lo\PYG{+w}{ }minikube\PYG{+w}{ }https://storage.googleapis.com/minikube/releases/latest/minikube\PYGZhy{}linux\PYGZhy{}amd64
chmod\PYG{+w}{ }+x\PYG{+w}{ }minikube
\PYG{c+c1}{\PYGZsh{} Initialisation de minikube}
./minikube\PYG{+w}{ }start\PYG{+w}{ }\PYGZhy{}\PYGZhy{}driver\PYG{o}{=}docker
\end{Verbatim}

@ -0,0 +1,4 @@
\begin{Verbatim}[commandchars=\\\{\}]
git\PYG{+w}{ }clone\PYG{+w}{ }\PYG{l+s+se}{\PYGZbs{}}
\PYG{+w}{ }https://codefirst.iut.uca.fr/git/evrard.van\PYGZus{}espen/cours\PYGZus{}virtualisation\PYGZus{}avancee\PYGZus{}ETUD.git
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
vdn\PYGZhy{}start\PYG{+w}{ }\PYGZhy{}t\PYG{+w}{ }\PYGZhy{}n\PYG{+w}{ }docker\PYG{+w}{ }debian\PYGZhy{}1
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
curl\PYG{+w}{ }http://\PYGZlt{}external\PYG{+w}{ }ip\PYGZgt{}
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
./minikube\PYG{+w}{ }status
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{n+nb}{export}\PYG{+w}{ }\PYG{n+nv}{no\PYGZus{}proxy}\PYG{o}{=}\PYG{l+s+s2}{\PYGZdq{}127.0.0.1,.vdn,localhost,192.168.49.1/24\PYGZdq{}}
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
passwd\PYG{+w}{ }\PYG{n+nb}{test}
\end{Verbatim}

@ -0,0 +1,4 @@
\begin{Verbatim}[commandchars=\\\{\}]
git\PYG{+w}{ }clone\PYG{+w}{ }\PYG{l+s+se}{\PYGZbs{}}
https://codefirst.iut.uca.fr/git/evrard.van\PYGZus{}espen/cours\PYGZus{}virtualisation\PYGZus{}avancee\PYGZus{}ETUD.git
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
vdn\PYGZhy{}ssh\PYG{+w}{ }root@debian\PYGZhy{}1
\end{Verbatim}

@ -0,0 +1,3 @@
\begin{Verbatim}[commandchars=\\\{\}]
minikube\PYG{+w}{ }status
\end{Verbatim}

@ -0,0 +1,102 @@
\makeatletter
\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
\let\PYG@ul=\relax \let\PYG@tc=\relax%
\let\PYG@bc=\relax \let\PYG@ff=\relax}
\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
\def\PYG@toks#1+{\ifx\relax#1\empty\else%
\PYG@tok{#1}\expandafter\PYG@toks\fi}
\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
\PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.61,0.40,0.00}{##1}}}
\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@ne}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.80,0.25,0.22}{##1}}}
\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
\@namedef{PYG@tok@nl}{\def\PYG@tc##1{\textcolor[rgb]{0.46,0.46,0.00}{##1}}}
\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}}
\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.41,0.47,0.13}{##1}}}
\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@nd}{\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@si}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}}
\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.36,0.12}{##1}}}
\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}}
\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.52,0.00}{##1}}}
\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{0.89,0.00,0.00}{##1}}}
\@namedef{PYG@tok@ge}{\let\PYG@it=\textit}
\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf}
\@namedef{PYG@tok@ges}{\let\PYG@bf=\textbf\let\PYG@it=\textit}
\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}}
\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}}
\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\@namedef{PYG@tok@cs}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
\def\PYGZbs{\char`\\}
\def\PYGZus{\char`\_}
\def\PYGZob{\char`\{}
\def\PYGZcb{\char`\}}
\def\PYGZca{\char`\^}
\def\PYGZam{\char`\&}
\def\PYGZlt{\char`\<}
\def\PYGZgt{\char`\>}
\def\PYGZsh{\char`\#}
\def\PYGZpc{\char`\%}
\def\PYGZdl{\char`\$}
\def\PYGZhy{\char`\-}
\def\PYGZsq{\char`\'}
\def\PYGZdq{\char`\"}
\def\PYGZti{\char`\~}
% for compatibility with earlier versions
\def\PYGZat{@}
\def\PYGZlb{[}
\def\PYGZrb{]}
\makeatother

@ -0,0 +1,253 @@
#+TITLE: TP1 - Cours de virtualisation avancée - /Kubernetes/, introduction
#+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
L'objectif de ce TP est de découvrir l'orchestrateur /"Kubernetes"/.
Pour cela, vous allez déployer quelques conteneurs et lancer des commandes pour découvrir le fonctionnement de /Kubernetes/.
Ces conteneurs auront été configurés par mes soins et vous n'aurez donc pas de fichier à éditer.
Pour les TPs de /Kubernetes/, vous allez utiliser un outil nommé /"minikube"/.
Cet outil permet la mise en place de /"clusters"/ /K8S/ dédiés aux tests.
Ce ne sont pas des /clusters/ utilisables sereinement en production mais conçus pour permettre la découverte et les tests sans devoir sembarrasser d'un "vrai" /cluster/, compliqué à mettre en place soit même.
* Mise en place
Vous allez travailler dans une machine virtuelle /VDN/.
De cette façon, vous pourrez utiliser /Docker/, ce qui est nécessaire pour les TPs.
\medskip
Commencez par lancer une machine virtuelle /VDN/:
#+BEGIN_SRC bash
vdn-start -t -n docker debian-1
#+END_SRC
#+BEGIN_warning
À chaque fois que vous vous connectez à la machine virtuelle, n'oubliez pas de lancer la commande suivante, sinon vous ne pourrez pas utiliser l'outil =kubectl= qui est l'outil de gestion de /K8S/ !
~export no_proxy="127.0.0.1,.vdn,localhost,192.168.49.1/24,10.96.0.0/12"~
#+END_warning
*Dans un autre terminal*, connectez vous à la machine virtuelle en =root=:
#+BEGIN_SRC bash
vdn-ssh root@debian-1
#+END_SRC
Puis ajouter l'utilisateur =test= au /sudoers/ pour lui permettre de lancer des commandes en tant que =root=.
Pour cela, ajoutez à la fin du fichier =/etc/sudoers= la ligne:
#+begin_example
test ALL=(ALL:ALL) ALL
#+end_example
Puis changez le mot de passe de l'utilisateur =test= *et mémorisez ce mot de passe, vous en aurez besoin*:
#+BEGIN_SRC bash
passwd test
#+END_SRC
\bigskip
Ensuite, *dans un autre terminal*, connectez-vous via /SSH/ à cette machine virtuelle:
#+BEGIN_SRC bash
vdn-ssh test@debian-1
#+END_SRC
Clonez le dépôt du TP dans la machine virtuelle:
#+BEGIN_SRC bash
git clone \
https://codefirst.iut.uca.fr/git/evrard.van_espen/cours_virtualisation_avancee_ETUD.git
#+END_SRC
Ensuite, lancez le script =01_init.sh= présent dans le dépôt pour installer /minikube/.
Une fois que le script est fini et que /minikube/ a fini de démarrer, lancez cette commande:
#+BEGIN_SRC bash
./minikube status
#+END_SRC
Le résultat de la commande doit être:
#+begin_example
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
#+end_example
Puis lancez:
#+BEGIN_SRC bash
./kubectl get namespaces
#+END_SRC
Le résultat de la commande doit être:
#+begin_example
NAME STATUS AGE
default Active 11m
kube-node-lease Active 11m
kube-public Active 11m
kube-system Active 11m
#+end_example
Enfin, *dans un autre terminal*, lancez:
#+BEGIN_SRC bash
./minikube tunnel
#+END_SRC
Cela va vous demander le mot de passe que vous avez attribué à l'utilisateur =test=.
Ce terminal doit afficher:
#+begin_example
Status:
machine: minikube
pid: 10418
route: 10.96.0.0/12 -> 192.168.49.2
minikube: Running
services: [hello-world]
errors:
minikube: no errors
router: no errors
loadbalancer emulator: no errors
#+end_example
Laissez ce terminal tourner, *n'y touchez plus !*
#+BEGIN_good
Si tout s'est déroulé comme il faut, cela veut dire que tout est installé correctement et que vous pourrez faire les TPs comme il faut.
#+END_good
* Votre mission
Vous allez découvrir comment gérer /K8S/ au moyen de son outil ligne de commande =kubectl=.
Vous allez donc devoir déployer des ressources et vérifier leur fonctionnement.
** Déployer et vérifier les ressources
Les ressources sont configurées dans le fichier du dépôt =02_ressources/01_all.yaml=, jetez-y un œil ;)
Ce fichier défini un /pod/ et un /service/ permettant l'accès au service présent dans le /pod/.
L'accès se fait via un /NodePort/, qui permet l'ouverture d'un port local sur la machine à destination du service /HTTP/ présent dans le /pod/.
Cependant, ce n'est pas une belle manière de faire les choses, vous changerez cela dans la seconde partie de ce TP.
Pour commencer, appliquez les configurations du fichier.
Ensuite, listez les /pods/, vous devez obtenir un résultat similaire à:
#+begin_example
NAME READY STATUS RESTARTS AGE
hello-world-6cffc7d974-5pgc8 1/1 Running 0 9m38s
#+end_example
Puis listez les services, vous devez obtenir un résultat similaire à:
#+begin_example
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world NodePort 10.109.243.202 <none> 4242:30000/TCP 8s
#+end_example
Si c'est le cas, bravo, vous avez déployé vos premiers /pods/ et /services/.
Vous pouvez tentez de communiquer avec le service en tapant:
#+BEGIN_SRC bash
curl http://10.109.243.202:30000
#+END_SRC
#+BEGIN_warning
Attention à changer l'adresse /IP/ de la commande =curl= avec celle qui est présente lorsque vous listez les services, sinon cela ne fonctionnera évidemment pas ;)
#+END_warning
Si tout s'est bien passé, vous devriez avoir un résultat tel que:
#+begin_example
Request served by hello-world-bdd88c654-kcg8p
HTTP/1.1 GET /
Host: 10.96.123.46
Accept: */*
User-Agent: curl/7.88.1
#+end_example
** Maintenant, à vous de jouer
À présent, vous allez devoir modifier la configuration pour rendre tout cela un peu plus "propre".
Tâches à réaliser:
- ne plus utiliser un simple /Pod/ mais plutôt un /Deployment/ avec un nombre de /replicas/ à 3;
- ne pas utiliser un /NodePort/ mais plutôt un /LoadBalancer/ qui redirigea le trafic sur les différents /Pods/ du /Deployment/.
Pour vérifier le bon fonctionnement du /LoadBalancer/, commencez par récupérer son adresse "externe" et vous pourrez faire:
#+BEGIN_SRC bash
curl http://<external ip>
#+END_SRC
Cela vous donnera une sortie telle que:
#+begin_example
Request served by hello-world-<PARTIE QUI CHANGE>
HTTP/1.1 GET /
Host: 10.101.132.184
Accept: */*
User-Agent: curl/7.88.1
#+end_example
Si =<PARTIE QUI CHANGE>= est différente d'une requête à l'autre, c'est que votre mission est réussie !
* À laide !
Basez-vous sur le cours ainsi que les documentations suivantes pour y parvenir:
- https://kubernetes.io/fr/docs/concepts/services-networking/service/
- https://kubernetes.io/docs/concepts/workloads/pods/
- https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

Binary file not shown.

@ -0,0 +1,256 @@
% Created 2024-05-20 lun. 18:34
% 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}, introduction}
\hypersetup{
pdfauthor={Evrard Van Espen},
pdftitle={TP1 - Cours de virtualisation avancée - \emph{Kubernetes}, introduction},
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}%
}
L'objectif de ce TP est de découvrir l'orchestrateur \emph{"Kubernetes"}.
Pour cela, vous allez déployer quelques conteneurs et lancer des commandes pour découvrir le fonctionnement de \emph{Kubernetes}.
Ces conteneurs auront été configurés par mes soins et vous n'aurez donc pas de fichier à éditer.
Pour les TPs de \emph{Kubernetes}, vous allez utiliser un outil nommé \emph{"minikube"}.
Cet outil permet la mise en place de \emph{"clusters"} \emph{K8S} dédiés aux tests.
Ce ne sont pas des \emph{clusters} utilisables sereinement en production mais conçus pour permettre la découverte et les tests sans devoir sembarrasser d'un "vrai" \emph{cluster}, compliqué à mettre en place soit même.
\section{Mise en place}
\label{sec:orgad1b4be}
Vous allez travailler dans une machine virtuelle \emph{VDN}.
De cette façon, vous pourrez utiliser \emph{Docker}, ce qui est nécessaire pour les TPs.
\medskip
Commencez par lancer une machine virtuelle \emph{VDN}:
\begin{minted}[]{bash}
vdn-start -t -n docker debian-1
\end{minted}
\begin{warning}
À chaque fois que vous vous connectez à la machine virtuelle, n'oubliez pas de lancer la commande suivante, sinon vous ne pourrez pas utiliser l'outil \texttt{kubectl} qui est l'outil de gestion de \emph{K8S} !
\texttt{export no\_proxy="127.0.0.1,.vdn,localhost,192.168.49.1/24,10.96.0.0/12"}
\end{warning}
\textbf{Dans un autre terminal}, connectez vous à la machine virtuelle en \texttt{root}:
\begin{minted}[]{bash}
vdn-ssh root@debian-1
\end{minted}
Puis ajouter l'utilisateur \texttt{test} au \emph{sudoers} pour lui permettre de lancer des commandes en tant que \texttt{root}.
Pour cela, ajoutez à la fin du fichier \texttt{/etc/sudoers} la ligne:
\begin{verbatim}
test ALL=(ALL:ALL) ALL
\end{verbatim}
Puis changez le mot de passe de l'utilisateur \texttt{test} \textbf{et mémorisez ce mot de passe, vous en aurez besoin}:
\begin{minted}[]{bash}
passwd test
\end{minted}
\bigskip
Ensuite, \textbf{dans un autre terminal}, connectez-vous via \emph{SSH} à cette machine virtuelle:
\begin{minted}[]{bash}
vdn-ssh test@debian-1
\end{minted}
Clonez le dépôt du TP dans la machine virtuelle:
\begin{minted}[]{bash}
git clone \
https://codefirst.iut.uca.fr/git/evrard.van_espen/cours_virtualisation_avancee_ETUD.git
\end{minted}
Ensuite, lancez le script \texttt{01\_init.sh} présent dans le dépôt pour installer \emph{minikube}.
Une fois que le script est fini et que \emph{minikube} a fini de démarrer, lancez cette commande:
\begin{minted}[]{bash}
./minikube status
\end{minted}
Le résultat de la commande doit être:
\begin{verbatim}
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
\end{verbatim}
Puis lancez:
\begin{minted}[]{bash}
./kubectl get namespaces
\end{minted}
Le résultat de la commande doit être:
\begin{verbatim}
NAME STATUS AGE
default Active 11m
kube-node-lease Active 11m
kube-public Active 11m
kube-system Active 11m
\end{verbatim}
Enfin, \textbf{dans un autre terminal}, lancez:
\begin{minted}[]{bash}
./minikube tunnel
\end{minted}
Cela va vous demander le mot de passe que vous avez attribué à l'utilisateur \texttt{test}.
Ce terminal doit afficher:
\begin{verbatim}
Status:
machine: minikube
pid: 10418
route: 10.96.0.0/12 -> 192.168.49.2
minikube: Running
services: [hello-world]
errors:
minikube: no errors
router: no errors
loadbalancer emulator: no errors
\end{verbatim}
Laissez ce terminal tourner, \textbf{n'y touchez plus !}
\begin{good}
Si tout s'est déroulé comme il faut, cela veut dire que tout est installé correctement et que vous pourrez faire les TPs comme il faut.
\end{good}
\section{Votre mission}
\label{sec:org8018d95}
Vous allez découvrir comment gérer \emph{K8S} au moyen de son outil ligne de commande \texttt{kubectl}.
Vous allez donc devoir déployer des ressources et vérifier leur fonctionnement.
\subsection{Déployer et vérifier les ressources}
\label{sec:org4910932}
Les ressources sont configurées dans le fichier du dépôt \texttt{02\_ressources/01\_all.yaml}, jetez-y un œil ;)
Ce fichier défini un \emph{pod} et un \emph{service} permettant l'accès au service présent dans le \emph{pod}.
L'accès se fait via un \emph{NodePort}, qui permet l'ouverture d'un port local sur la machine à destination du service \emph{HTTP} présent dans le \emph{pod}.
Cependant, ce n'est pas une belle manière de faire les choses, vous changerez cela dans la seconde partie de ce TP.
Pour commencer, appliquez les configurations du fichier.
Ensuite, listez les \emph{pods}, vous devez obtenir un résultat similaire à:
\begin{verbatim}
NAME READY STATUS RESTARTS AGE
hello-world-6cffc7d974-5pgc8 1/1 Running 0 9m38s
\end{verbatim}
Puis listez les services, vous devez obtenir un résultat similaire à:
\begin{verbatim}
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world NodePort 10.109.243.202 <none> 4242:30000/TCP 8s
\end{verbatim}
Si c'est le cas, bravo, vous avez déployé vos premiers \emph{pods} et \emph{services}.
Vous pouvez tentez de communiquer avec le service en tapant:
\begin{minted}[]{bash}
curl http://10.109.243.202:30000
\end{minted}
\begin{warning}
Attention à changer l'adresse \emph{IP} de la commande \texttt{curl} avec celle qui est présente lorsque vous listez les services, sinon cela ne fonctionnera évidemment pas ;)
\end{warning}
Si tout s'est bien passé, vous devriez avoir un résultat tel que:
\begin{verbatim}
Request served by hello-world-bdd88c654-kcg8p
HTTP/1.1 GET /
Host: 10.96.123.46
Accept: */*
User-Agent: curl/7.88.1
\end{verbatim}
\subsection{Maintenant, à vous de jouer}
\label{sec:org986a403}
À présent, à vous de déployer un simple serveur \emph{nginx} dans \emph{Kubernetes}.
Basez-vous sur le cours ainsi que les documentations suivantes pour y parvenir:
\begin{itemize}
\item \url{https://kubernetes.io/fr/docs/concepts/services-networking/service/}
\item \url{https://kubernetes.io/docs/concepts/workloads/pods/}
\item \url{https://kubernetes.io/docs/concepts/workloads/controllers/deployment/}
\end{itemize}
\end{document}

@ -1,50 +0,0 @@
% 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[utf8]{inputenc}
\usepackage[inkscapelatex=false]{svg}
\usepackage[sfdefault]{AlegreyaSans}
\usepackage{multicol}
\usepackage{minted}
\usepackage{float}
\usepackage{tikz}
\usetikzlibrary{positioning}
\renewcommand\listingscaption{Exemple de code}
\date{}
\title{Cours de virtualisation avancée: \emph{Proxmox}}
\hypersetup{
pdfauthor={Evrard Van Espen},
pdftitle={Cours de virtualisation avancée: \emph{Proxmox}},
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 30.0.50 (Org mode 9.6.15)},
pdflang={English}}
\begin{document}
\maketitle
\begin{center}
\includegraphics[width=.9\linewidth]{./images/k8s_logo.png}
\end{center}
\section{\emph{Kubernetes}}
\label{sec:orga8614f4}
\begin{leftcol}
toto
\end{leftcol}
\begin{rightcol}
titi
\end{rightcol}
\end{document}

@ -1,158 +0,0 @@
\mode<presentation>
% Requirement
\RequirePackage{tikz}
\RequirePackage{etoolbox}
\useinnertheme{rectangles}
\setbeamertemplate{background canvas}{\includegraphics[width=\paperwidth,height=\paperheight]{../common/bg.pdf}}
\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{itemize item}[triangle]
%\setbeamertemplate{itemize subitem}[circle]
\setbeamertemplate{itemize subitem}{$\rhd$}
\setbeamertemplate{itemize subsubitem}[circle]
%colortheme
\definecolor{iut}{RGB}{149,193,31}
\definecolor{gris}{RGB}{89,89,89}
\definecolor{ficelle}{RGB}{205,200,191}
\definecolor{attention}{RGB}{214,141,123}
\definecolor{code highlight}{RGB}{239,233,228}%
\setbeamercolor*{palette primary}{fg=iut,bg=gris}
\setbeamercolor*{title}{fg=iut, bg=white}
\setbeamercolor*{subtitle}{fg=gris, bg=white}
\setbeamercolor*{title page header}{fg=iut, bg=white}
\setbeamercolor*{subtitle page header}{fg=gris, bg=white}
\setbeamercolor*{foot}{fg=white, bg=iut}
\setbeamercolor*{foot number}{fg=gris, bg=white}
\setbeamercolor{part title}{fg=iut}
\setbeamercolor{structure}{fg=iut}
%\setbeamercolor{itemize item}{fg=iut}
%\setbeamercolor{itemize subitem}{fg=iut}
%\setbeamercolor{itemize subsubitem}{fg=iut}
%\setbeamercolor{enumerate item}{fg=iut}
%\setbeamercolor{enumerate subitem}{fg=iut}
%\setbeamercolor{enumerate subsubitem}{fg=iut}
%\setbeamercolor{item projected}{fg=white, bg=iut}
%\setbeamercolor{subitem projected}{fg=white, bg=iut}
%\setbeamercolor{subsubitem projected}{fg=white, bg=iut}
\setbeamercolor{alerted text}{fg=iut}
\setbeamercolor{example text}{fg=ficelle}
\setbeamercolor{block title}{use=palette primary, fg=white, bg=palette primary.fg}
\setbeamercolor{block body}{use=palette primary, bg=palette primary.fg!7}
\setbeamercolor{block title example}{fg=white, bg=ficelle}
\setbeamercolor{block body example}{parent=normal text, bg=ficelle!10!white}
\setbeamercolor{block title alerted}{fg=white,bg=attention}
\setbeamercolor{block body alerted}{parent=normal text, bg=attention!10!white}
\AtBeginEnvironment{alertblock}{\setbeamercolor{alerted text}{fg=attention}}
%fonttheme
\setbeamerfont{title}{size=\LARGE,series=\bfseries}
\setbeamerfont{subtitle}{size=\large,shape=\scshape,series=\bfseries}
\setbeamerfont{date}{size=\footnotesize}
\setbeamerfont{frame title}{size=\Large,series=\bfseries}
\setbeamerfont{frame subtitle}{size=\normalsize,shape=\scshape,series=\bfseries}
%%innertheme
\defbeamertemplate*{title page}{IUT}[1][]{
\vfill
\begin{beamercolorbox}[wd=.9\paperwidth, sep=5pt, center, #1]{title page header}
\usebeamerfont{title}\inserttitle\par%
\ifx\insertsubtitle\@empty%
\else%
\vskip.3em%
{\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle\par}%
\fi%
\end{beamercolorbox}
\vskip1.5em\par
\begin{beamercolorbox}[sep=8pt,center,#1]{author}
\usebeamerfont{author}\mdseries\large\insertauthor
\end{beamercolorbox}
\vfill
\begin{beamercolorbox}[sep=8pt,center,#1]{institute}
\insertinstitute
\end{beamercolorbox}
\begin{beamercolorbox}[sep=8pt,center,#1]{date}
\usebeamerfont{date}\insertdate
\end{beamercolorbox}
\vfill
}
%outertheme
\defbeamertemplate*{frametitle}{IUT}[1][]{
\begin{beamercolorbox}[wd=\paperwidth, sep=10pt, #1, ignorebg]{title page header}
\usebeamerfont{frame title}\insertframetitle\par%
\end{beamercolorbox}%
\ifx\insertframesubtitle\@empty%
\else%
\nointerlineskip%
\begin{beamercolorbox}[wd=\paperwidth, sep=2pt, #1, leftskip=25pt, ignorebg]{subtitle page header}
\usebeamerfont{frame subtitle}\usebeamercolor[fg]{subtitle page header}\insertframesubtitle\par%
\end{beamercolorbox}%
\fi%
\vspace{-1em}
}
\defbeamertemplate*{footline}{IUT}{
\leavevmode
\begin{tikzpicture}[overlay, every node/.style={scale=.8, transform shape}]
\usebeamercolor[bg]{foot}
\draw[fill] (8ex,3ex) circle (4.8ex);
\usebeamercolor[fg]{foot}
\draw[fill] (8ex,3ex) circle (4ex);
\usebeamercolor[fg]{foot number}
\node[scale=1.5] at (8ex,3ex) {$^\text{\insertframenumber}/_\text{\insertmainframenumber}$};
\end{tikzpicture}
\raisebox{3ex}{\hspace*{15ex}\insertsection}
}
\let\oldtt\texttt
\renewcommand{\texttt}[1]{\colorbox{code highlight}{\oldtt{#1}}}
\AtBeginSection[]{
\begin{frame}
\vfill
\begin{center}
\begin{tikzpicture}
\fill[iut, rounded corners] (-4,-1.5) rectangle (4,1.5);
\node[white, font=\huge, text width=7cm, align=center] at (0,0) {\insertsectionhead};
\end{tikzpicture}
\end{center}
\vfill
\end{frame}
}
\mode<all>
\newcommand{\colorExtract}[3]{
\usebeamercolor{#1}
\definecolor{#2}{named}{fg}
\definecolor{#3}{named}{bg}
}
\colorExtract{palette primary}{iut}{gris}

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

@ -1,17 +0,0 @@
from: markdown
to: latex
standalone: true
pdf-engine: xelatex
number-sections: true
variables:
lang: fr
papersize: a4
mainfont: CharisSIL-Regular.ttf
mainfontoptions:
- BoldFont=CharisSIL-Bold.ttf
- ItalicFont=CharisSIL-Italic.ttf
- BoldItalicFont=CharisSIL-BoldItalic.ttf
include-in-header:
- ${.}/tdtp_header.tex

@ -1,48 +0,0 @@
\usepackage{graphicx}
%\usepackage[left=2cm,right=2cm,top=1cm,bottom=2cm]{geometry}
\usepackage{fullpage}
\setlength\textheight{24.6cm}
\usepackage{hyperref}
\hypersetup{
colorlinks = true,
urlcolor = gray,
breaklinks,
pdfborder = 0 0 0,
pdfpagemode = UseNone,
pdfstartpage = 1,
pdfcreator = {XeLaTeX},
bookmarksopen = true,
pdfauthor = {IUT Clermont Auvergne},
pdftitle = {Développement Orienté Objet - C++},
pdfsubject = {TD/TP C++},
pdfkeywords = {POO, C++, BUT 1A, IUT}
}
\AddToHook{shipout/firstpage}{%
\makebox[\textwidth]{%
\raisebox{-3ex}{\includegraphics[height=22mm]{logo-IUT-CA}}%
\hfill \large BUT 1A}}
\makeatletter
\def\@maketitle{%
\newpage%
\null%
\vskip 2em%
\begin{center}%
\let \footnote \thanks%
{\LARGE \@title \par}%
\vskip 1.5em%
% {\large%
% \lineskip .5em%
% \begin{tabular}[t]{c}%
% \@author%
% \end{tabular}\par}%
% \vskip 1em%
% {\large \@date}%
\end{center}%
\par%
% \vskip 1.5em
}
\makeatother
Loading…
Cancel
Save