Kubernetes, c’est quoi et comment ça marche ?

Kubernetes, c’est quoi ? Comment ça marche ? Définition, avantages et inconvénients.
quentin.jpg
Quentin VANDENBOREMis à jour le 8 Juil 2020
Kubernetes définition présentation

Kubernetes, c’est quoi ?

Kubernetes ou K8S, est une solution d’orchestration de conteneurs. Plus précisément, c’est un logiciel d’orchestration qui permet avec des scripts de type YAML, de déployer une application, de la mettre à l’échelle automatiquement, et d’avoir plusieurs possibilités de déploiements dans des environnements différents.

Sur le web, nous retrouvons souvent Kubernetes sous l’acronyme K8S.

Pourquoi utiliser Kubernetes ?

Dans le monde du cloud, le DevOPS est de plus en plus utilisé pour automatiser les déploiements d’applications.

Le but premier de Kubernetes est de pouvoir déployer en quelques clics une infrastructure complète d’une application, en parallèle ou en remplacement d’un déploiement précédent.

De plus, Kubernetes permet de gérer la mise à l’échelle de cette infrastructure et donc, d’optimiser le rendu pour l’utilisateur final à la visite de l’application.

Quand vous templatez en YAML un script Kubernetes, vous pouvez lui dire en fonction de la performance du Node ou du Pod en question : le scaler horizontalement ou sur un autre serveur. 

cluster-autoscaler.png
Concepts - Mettre à l’échelle des applications dans AzureAzure est la plateforme de Cloud de Microsoft....

Qu’est ce qui se cache derrière Kubernetes ?

Il faut savoir que Kubernetes est un logiciel d’orchestration et non un logiciel permettant le lancement de conteneurs ! En d’autres termes, sans un Docker ou un autre logiciel de ce type permettant de créer des conteneurs, Kubernetes ne sert à rien ! 

learning-docker-and-k8s-by-practice.jpg

Docker, c’est quoi ?

Pour rappel, Docker est un logiciel de virtualisation permettant le lancement de conteneurs. On utilise Docker pour éviter d’avoir une adhérence système. En d’autres termes, en utilisant Docker, vous évitez que votre application soit dépendante des mises à jour et des problèmes du système (ex: Debian). Votre application est alors conteneurisée et donc, isolée de l’OS.

La nouvelle voie du DevOPS : faire des conteneurs pour éviter une adhérence système de l’application en déployant une application et ses librairies dans un container (une enveloppe) qui va être complètement abstrait de l’OS de base.

On peut tout aussi bien mettre Docker sur un Windows qu’une Debian, Ubuntu... du moment qu’il y a Docker, les containers seront toujours les mêmes !

Certes, un container est isolé de l’OS, mais il est aussi isolé du réseau ! De base, un container sur Docker n’a aucune adhérence système, c’est à dire qu’il ne va pas reprendre l’IP du système. Il aura une IP interne qu’on pourra exposer sur l’extérieur, ce qui sécurise un peu l’infrastructure.

Kubernetes, comment ça marche ?

Voici le schéma général de l’architecture de Kubernetes que vous retrouverez dans la plupart des projets. Il est composé de deux grandes parties : le master et le worker (ou node). 

architecture kubernetes

Master

C’est dans le Master que toutes les actions vont être effectuées lorsque vous faites des appels REST ou tapez des lignes de commande. Initialement, il n’a pas pour but de faire le travail du Worker.. Mais, dans certaines applications ou dans certains clouds (Google, Azure ou AWS par exemple), on peut déployer des Kubernetes qui permettent de faire d’un Master également un Worker (on ne vous le conseille pas, notamment pour des questions de performances).

Le Master est composé de plusieurs parties :

  • le ETCD : système de fichiers particulier de Kubernetes, c’est un système de fichiers d’utilisation système. (ex : dossier sur un Debian)
  • Controller manager : c’est le superviseur de Kubernetes. C’est lui qui va aller vérifier à chaque fois que vous faites une commande, si elle s’est bien exécutée et comment elle s’est exécutée.
  • API Server : c’est tout ce qui va être exposé pour que vous puissiez faire vos déploiements.
    • Replicaset : mise à l’échelle
    • Pod : ensemble de conteneurs

Tout cela est exposé par une APIUne API est un programme permettant à deux applications distinctes de communiquer entre elles et d’échanger des données. server qui peut être requêtée par ligne de commande ou par rest API.

Exemple : vous demandez le déploiement d’une application. API Server va envoyer le déploiement sur le scheduler pour la mettre dans la file d’attente (si le worker est déjà occupé, on ne peut pas lui demander trop de tâches en parallèle), c’est le scheduler qui va alors dire au worker : tu as l’air d’être prêt, je vais te donner mes instructions de déploiement.

Worker/Node

Sur un environnement Kubernetes, il peut y avoir 1 comme 100 workers.

Le Worker est composé de plusieurs parties :

  • Kubelet : c’est l’orchestreur Kubernetes.
  • Docker
  • Watchendpoint : permet de voir à l’instant T, les logs et les performances de l’application qui vont être exposées par le Kubeproxy. Le KubeProxy va ouvrir sur l’iptable du serveur, les ports qui permettent d’aller voir si oui ou non votre application est up, comment elle est up, et ce qui s’est passé dessus.

Le scheduler dit à Kubelet de déployer les applications dans les conteneurs.

Interaction avec Kubernetes

L’interaction avec Kubernetes se fait par rapport à une API qui est exposée par K8S. Cette API est utilisable soit par le composant KubeCtl (Client Console), soit avec des appels RESTREST (REpresentational State Transfer) est un style d'architecture logicielle qui fonctionne sous un certain nombre de contraintes..

Le plus utilisé reste l’utilisation de KubeCtl ! Pour pouvoir utiliser les appels REST, il faut absolument mettre tous les certificats Kubernetes dans l’API REST. C’est assez compliqué et long à mettre en place, et donc, mise à part certains agents, rare sont les personnes à l’utiliser de cette manière.. On privilégie KubeCtl !

Les différents composants de Kubernetes

K8S utilise un dictionnaire qui lui est propre pour parler des conteneurs. Voici les principaux composants :

  • POD : un pod peut contenir un ou plusieurs conteneurs. Un pod est isolé du réseau, et cette isolation réseau va se répercuter sur le conteneur. Mais, tous les conteneurs d’un même pod peuvent communiquer ensemble, à l’aide de services.
  • NAMESPACE : un namespace est un regroupement d’un ensemble des composants.
  • SERVICE : un service permet d’exposer des ports à l’intérieur d’un pod.
  • INGRESS : un ingress permet d’exposer des ports à l’extérieur d’un pod et/ou d’exposer un service avec un nom de domaine.
  • DEPLOYMENT : un deployment est une description permettant la création d’une infrastructure complète (avec Pod, Service). le fichier Deployment est le plus gros fichier que vous pourriez avoir si vous faites un déploiement sur K8S.
  • CONFIGMAP : un configmap permet d’avoir des configurations (ex : fichier) au sein d’un namespace
  • REPLICASET : un replicaset permet de mettre à l’échelle un déploiement.
  • SECRET : un secret permet de stocker des identifiants de façon sécurisée.

Quelques commandes simples

Voici quelques commandes simples et utiles pour vos premiers pas sur Kubernetes :

  • kubectl get namespaces // Permet de récupérer tous les namespaces du serveurs K8S
  • kubectl get pods // Permet de récupérer tous les pods du namespace par défault
  • kubectl get pods –n axopen // Permet de récupérer tous les pods du namespace axopen
  • kubectl describe pods site-web -n axopen // Permet de décrire de pod site-web du namespace axopen
  • kubectl logs site-web –n axopen // Permet de voir les logs du site-web du namespace axopen
  • kubectl apply –f monfichier.yaml // Permet d’appliquer la configuration du fichier YAML

Avantages de Kubernetes

Voici les principaux avantages de Kubernetes :

  • K8S permet les déploiements automatisés d’applications et le fait bien... et ça, c’est génial !
  • Reste simple d’utilisation, une fois déployé !
  • Grande communauté :)

Inconvénients de Kubernetes

Kubernetes a tout de même quelques inconvénients notables :

  • La rédaction des scripts de déploiement reste fastidieuse, même si elle n’est pas très compliquée
  • Il ne faut prévoir aucune adhérence système dans le code et les librairies utilisées par une application
  • L’installation et la mise en production de Kubernetes est assez complexe

Conclusion

Pour conclure sur ce tour d’horizon de l’outil, nous trouvons que Kubernetes est un super outil et on vous le conseille ! Chez AXOPEN, nous utilisons principalement Kubernetes pour nos déploiements depuis GitLabGitLab, c’est une plateforme permettant d’héberger et de gérer des projets web de A à Z., afin de compiler et de déployer nos applications en recette simplement. Des scripts templates ont été préparés sur GitLab afin de pouvoir simplement construire son déploiement et ainsi, accélérer sa production.

Et vous, comment utilisez-vous Kubernetes ?