You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

504 lines
15 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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