Pourquoi apprendre Kubernetes en 2024 ?

Qu'est-ce que le DevOps ?

"Devops" est la concaténation des trois premières lettres du mot anglais development (développement) et de l'abréviation ops du mot anglais operations (exploitation).

C'est un terme qui a été inventé par le belge Patrick Debois en 2007.

Le DevOps est un ensemble de pratiques qui visent à réduire le fossé entre le développement logiciel (Dev) et les opérations informatiques (Ops), d'où le terme.

L'idée est de favoriser une collaboration plus étroite et une meilleure communication entre ces deux entités qui, dans les modèles traditionnels, opèrent souvent de manière isolée.

Les principes clés du DevOps comprennent aujourd'hui :

  • l'intégration continue (CI pour continuous integration en anglais - le code est régulièrement fusionné et testé), 
  • la livraison continue (CD pour continuous delivery - les mises à jour du logiciel sont régulièrement libérées pour la production),
  • l'infrastructure en tant que code (la gestion et la provision des infrastructures informatiques via le code),
  • la surveillance et la journalisation (le suivi en temps réel de la performance et des erreurs du logiciel)
  • la culture de la rétroaction (l'encouragement à l'amélioration constante via les retours d'information)

Le schéma classique est celui-ci :

 

Outils DevOps principaux

1 - Planification et collaboration :

Ces outils permettent de créer des tâches et de gérer un projet. Les plut utilisés sont :

  • Gitlab
  • Github
  • Jira

2 - Gestion du code (développement)

Ces outils permet d'effectuer un contrôle de version du code. Les plus utilisés sont :

  • GitHub
  • GitLab
  • Bitbucket

3 - Intégration Continue / Déploiement Continu (CI/CD) :

Ces outils surveillent les commits dans votre dépôt par exemple Github. Lorsqu'un commit est effectué, ils lancent automatiquement un "pipeline" d'intégration continue qui peut compiler le code, exécuter des tests unitaires, des tests d'intégration, et d'autres types de tests pour s'assurer que les dernières modifications n'ont pas introduit de bugs.

Si tous les tests passent, ces outils peuvent être configurés pour déployer automatiquement les changements sur un environnement de production, de staging ou de test. Cela accélère le processus de livraison de nouvelles fonctionnalités et de corrections de bugs.

Des solutions très connues sont :

  • Jenkins
  • GitLab CI/CD
  • Github actions
  • CircleCI
  • Travis CI

4 - Gestion de l'infrastructure :

Ces outils permettent de faire des choses très différentes mais concernent les serveurs et les clusters.

Nous pouvons citer quelques exemples :

  • Docker : pour créer des images et ensuite les exécuter dans des conteneurs sur un cluster.
  • Docker Hub (ou tout autre Container Registry - il y en a plusieurs dizaines) : plateforme de service cloud qui permet aux développeurs de stocker et d'utiliser des images d'applications conteneurisées.
  • Kubernetes : plateforme qui automatise la déploiement, la mise à l'échelle et la gestion des applications conteneurisées, offrant un cadre pour orchestrer et coordonner des conteneurs au sein d'un environnement de cloud.
  • Terraform : outil d'Infrastructure as Code (IaC) open source qui permet aux développeurs de définir et de fournir des infrastructures de centres de données en utilisant un langage de description déclaratif, facilitant ainsi la gestion et l'orchestration des ressources cloud.
  • Ansible : outil d'automatisation open source qui permet la gestion de configuration, le déploiement d'applications et l'orchestration de tâches sur une variété de systèmes et de plateformes (en résumé permet de configurer et de gérer des serveurs plus simplement).

5 - Surveillance et retour d'information :

Ces outils permettent de surveiller (monitoring) des clusters ou plus généralement des applications exécutées sur des serveurs.

Voici une liste des outils les plus courants :

  • Prometheus : système de surveillance et d'alerte qui collecte et stocke les métriques d'application et de système en temps réel, offrant des fonctionnalités de requête et d'alerte pour aider à la détection et à la résolution des problèmes.
  • Grafana : plateforme pour la visualisation et l'analyse de données, permettant aux utilisateurs de créer des tableaux de bord interactifs et compréhensibles pour surveiller et analyser en temps réel les données provenant de diverses sources, le plus souvent de Prometheus.
  • ELK Stack (Elasticsearch, Logstash, Kibana) : suite d'outils qui fournit des capacités de recherche, d'analyse, de journalisation et de visualisation de données, permettant aux utilisateurs de transformer leurs données en insights précieux.
  • Datadog / Nagios / New Relic / Sentry : plateformes de surveillance et d'analyse des performances en temps réel pour les infrastructures cloud, les applications, les journaux et les métriques, facilitant la détection des problèmes et leur résolution.

Vous pouvez retrouver tous les outils principaux utilisés avec Kubernetes ici. Ne soyez pas découragés, il n'y besoin dans la plupart des projets que de n'en connaitre vraiment que quelques-uns.

Qu’est-ce que Kubernetes ?

Kubernetes, souvent abrégé en K8s (“k-eights”, car il y 8 lettres entre le "K" et le "s". C'est ce qu'on appelle un numéronyme comme par exemple i18n pour internationnalisation), est un système open-source, écrit en Go, puissant et flexible pour l'orchestration de conteneurs.

Il a été conçu par Google sur la base de leur expérience avec leur système d'exploitation interne pour leurs datacenters utilisé depuis 2004, Borg, et a été rendu open-source en 2014. Depuis lors, il a été largement adopté dans l'industrie et est soutenu par la Cloud Native Computing Foundation (CNCF).

Cette organisation est un projet de la fondation Linux pour faire progresser les technologies relatives aux conteneurs. Elle compte plus de 700 membres (par exemple Google, Apple, Microsoft, Amazon, IBM, Docker, Cisco, Twitter, Intel, Huwaei, Alibaba etc. Liste ici). Vous pouvez retrouver la liste des projets ici. Nous en utiliserons d'ailleurs plusieurs dans la formation.

Le nom "Kubernetes" provient du grec ancien κυβερνήτης, qui signifie "pilote" ou "capitaine" (d’où le logo de gouvernail de navire). Cela reflète la capacité de Kubernetes à gérer et à diriger les conteneurs dans un système distribué.

Certains parlent aujourd'hui de "Système d'exploitation du cloud" pour désigner Kubernetes.

Kubernetes est composé d'un ensemble de processus de contrôle qui pilotent l'état courant vers l'état désiré d'un cluster.

Dans les grandes lignes, Kubernetes offre un cadre pour exécuter des applications distribuées résilientes. Il gère l'équilibrage de charge, fournit des capacités de découverte de services, et supervise la santé des applications et des machines. Avec Kubernetes, vous pouvez déployer vos applications rapidement et de manière prévisible, les scaler de manière flexible et les isoler les unes des autres pour améliorer la disponibilité et le développement.

Kubernetes a révolutionné la manière dont les applications sont déployées et gérées à grande échelle, en facilitant l'adoption de modèles d'architecture basés sur des conteneurs et en offrant un ensemble riche de fonctionnalités pour l'automatisation et la gestion des déploiements.

Pourquoi utiliser Kubernetes ?

Nous allons voir les principaux avantages à utiliser Kubernetes :

Automatisation du déploiement, de la mise à l'échelle et des opérations des applications conteneurisées : il permet de gérer l'équilibrage de charge, fournir des environnements de développement, de test et de production identiques, et permettre des déploiements continus de manière sécurisée (rolling updates) et des retours arrière (rollback). Il peut mettre à l'échelle automatiquement à la hausse et à la baisse des services en fonction de la demande (auto-scaling).

Portabilité et flexibilité : vous pouvez exécuter vos clusters sur des machines locales, dans un cloud public, dans un cloud hybride ou dans plusieurs clouds. Vous pouvez facilement changer d'environnement / de fournisseur de cloud.

Service Discovery & Load Balancing : Kubernetes peut exposer un conteneur utilisant le DNS ou sa propre adresse IP. Si le trafic vers un conteneur est élevé, Kubernetes est capable de répartir la charge de réseau afin que le déploiement soit stable.

Gestion du stockage : Kubernetes permet de monter automatiquement le système de stockage de votre choix, que ce soit du stockage local, un fournisseur de cloud public comme GCP ou AWS, ou un réseau de stockage comme NFS, iSCSI, Gluster, Ceph ou Flocker.

Surveillance des services et auto-réparation (auto-healing) : Kubernetes redémarre les conteneurs qui échouent, remplace les conteneurs, détruit les conteneurs qui ne répondent pas à la vérification de l'état définie par l'utilisateur (health checks), et ne les utilise pas tant qu'ils ne sont pas prêts.

Gestion des secrets et de la configuration : Kubernetes vous permet de gérer et de mettre à jour les secrets et la configuration d'application sans reconstruire vos images de conteneur et sans exposer les secrets dans votre stack de configuration.

Utilisations

Kubernetes est largement utilisé par les entreprises de toutes tailles, des startups aux multinationales, pour orchestrer leurs applications conteneurisées. Voici quelques exemples d'entreprises qui utilisent Kubernetes :

Google : le créateur original de Kubernetes, l'utilise pour alimenter certains de ses propres services, et offre également le Google Kubernetes Engine (GKE) - voir plus bas.

Adidas : 100 % du site de commerce électronique d'Adidas fonctionne sur Kubernetes. "Le temps de chargement du site de commerce électronique a été réduit de moitié. Les mises à jour sont passées de 4 à 6 semaines à 3 à 4 fois par jour. Avec 4 000 pods, 200 nœuds et 80 000 builds par mois".

Spotify : a migré son infrastructure vers Kubernetes en 2019, améliorant ainsi sa capacité à évoluer et à déployer de nouvelles fonctionnalités plus rapidement. Son plus grand service actuellement exécuté sur Kubernetes reçoit environ 10 millions de requêtes par seconde en tant que service agrégé et bénéficie grandement de l'autoscaling

Booking.com : utilise Kubernetes depuis 2015 pour plusieurs centaines de services.

Le CERN : "Le temps de déploiement d'un nouveau cluster pour un système de stockage distribué complexe est passé de plus de 3 heures à moins de 15 minutes. L'ajout de nouveaux nœuds à une grappe prenait plus d'une heure, il faut désormais moins de 2 minutes. Le temps nécessaire à la mise à l'échelle automatique des répliques des composants du système est passé de plus d'une heure à moins de 2 minutes. Initialement, la virtualisation entraînait une surcharge de 20 %",

The New York Times : "La vitesse de livraison a augmenté. Certains des anciens déploiements basés sur des VM prenaient 45 minutes ; avec Kubernetes, ce temps n'est plus que de quelques secondes à quelques minutes" et "les équipes qui avaient l'habitude de déployer selon des calendriers hebdomadaires ou qui devaient coordonner les calendriers avec l'équipe d'infrastructure déploient désormais leurs mises à jour de manière indépendante, et peuvent le faire quotidiennement si nécessaire."

BlaBlaCar : "Avant d'utiliser les conteneurs, il fallait parfois un jour, voire deux, pour créer un nouveau service. Avec tous les outils que nous avons créés autour des conteneurs, la copie d'un nouveau service ne prend plus que quelques minutes. C'est vraiment un gain énorme. Nous planifions mieux la capacité de notre centre de données parce que nous avons moins de contraintes grâce à cette abstraction entre les services et le matériel sur lequel nous fonctionnons. Pour les développeurs, cela signifie également qu'ils peuvent se concentrer uniquement sur les fonctionnalités qu'ils développent et non sur l'infrastructure".

Tinder : "Tinder fonctionne exclusivement sur un cluster Kubernetes composé de 200 services, 1 000 nœuds, 15 000 pods et 48 000 conteneurs en cours d'exécution. L'infrastructure n'est plus une tâche réservée à nos équipes d'exploitation. Au lieu de cela, les ingénieurs de toute l'organisation partagent cette responsabilité et ont le contrôle sur la façon dont leurs applications sont construites et déployées avec tout en tant que code."

D'autres exemples d'entreprises qui utilisent largement Kubernetes sont BlackRock, Wikipedia, Capital One, Pinterest, Airbnb, IBM, Slack, Shopify, Robinhood, Walmart etc.

Les services gérés

Les services managés de Kubernetes offrent une plateforme pour automatiser le déploiement, la mise à l'échelle et la gestion des applications conteneurisées. Ces services sont gérés par des fournisseurs de cloud, ce qui signifie que les tâches liées à la configuration, à la gestion et à la maintenance de l'infrastructure sous-jacente sont prises en charge par le fournisseur. 

Voici les principaux services managés de Kubernetes (il y en a beaucoup d’autres) :

Google Kubernetes Engine (GKE) : GKE est le service managé de Kubernetes offert par Google Cloud. Il offre une intégration native avec les autres services de Google Cloud.

Amazon Elastic Kubernetes Service (EKS) : EKS est le service managé de Kubernetes offert par Amazon Web Services (AWS). Il s'intègre avec les autres services d'AWS, comme Elastic Load Balancer (ELB) et Amazon RDS.

Azure Kubernetes Service (AKS) : AKS est le service managé de Kubernetes offert par Microsoft Azure. Il s'intègre avec les autres services d'Azure, comme Azure DevOps et Azure Monitor.

IBM Cloud Kubernetes Service : Ce service managé de Kubernetes est offert par IBM Cloud. Il s'intègre avec les autres services d'IBM Cloud, comme Watson.

DigitalOcean Kubernetes (DOKS) : DOKS est un service managé de Kubernetes offert par DigitalOcean.

Red Hat OpenShift : OpenShift est une plateforme de conteneurs basée sur Kubernetes offerte par Red Hat. Elle comprend un service managé de Kubernetes et offre des fonctionnalités supplémentaires, comme un registre d'images intégré et une prise en charge intégrée pour le développement et le déploiement d'applications.

OVH Service Managed Kubernetes : OVHcloud, un fournisseur de services de cloud computing basé en France, offre également un service managé Kubernetes.

Scaleway Kubernetes Kapsule : service managé Kubernetes de Scaleway, également basé en France.

Scaleway Kubernetes Kosmos : service de Kubernetes managé qui vous permet d’utiliser les ressources de plusieurs fournisseurs cloud. Google propose également Anthos qui fonctionne sur le même principe.

Bien sûr cette liste n'est pas exhaustive car quasiment tous les fournisseurs cloud proposent leur version.

Architecture générale de Kubernetes

Lorsque vous déployez Kubernetes, vous obtenez un cluster.

Un cluster Kubernetes est un ensemble de nœuds (nodes) qui exécutent des applications conteneurisées gérées par Kubernetes.

Un nœud est une machine physique sur laquelle sont installés tous les logiciels nécessaires au fonctionnement de K8s.

Un cluster a au moins un nœud de travail (worker node) et un nœud de contrôle (appelé master node / control node ou control plane).

Le(s) nœud(s) de contrôle est le nœud qui contrôle et gère l'ensemble du cluster Kubernetes. Il est responsable de l'orchestration des nœuds de travail. Il peut y avoir un ou plusieurs nœuds de contrôle comme nous le verrons.

Les nœuds de travail sont les machines où les applications sont déployées. Chaque nœud exécute au moins un Pod.

Un Pod représente un processus en cours d'exécution sur un cluster et peut contenir un ou plusieurs conteneurs.

Description de l'image Kubernetes.png.

Détail des composants de Kubernetes

Voyons maintenant en détail les composants.

Les composants de contrôle

kube-apiserver : le serveur API est un composant du plan de contrôle Kubernetes qui permet d’interagir avec Kubernetes : il expose l'API pour les administrateurs.

etcd : base de données clé-valeur (aussi en Go) consistante et hautement disponible utilisée comme mémoire de sauvegarde pour toutes les données du cluster.

kube-scheduler : composant qui sélectionne les nœuds pour les Pods nouvellement créés sur lesquels ils vont s'exécuter selon un grand nombre de paramètres configurables.

kube-controller-manager : regroupe plusieurs contrôleurs qui sont techniquement des processus distincts, mais pour simplifier, ils sont compilés dans un seul programme et s'exécutent dans un seul processus. Voici un aperçu de quelques-uns des contrôleurs qu'il exécute :

  • Node Controller : surveille les nœuds et agit si un nœud tombe en panne.
  • Replication Controller : veille à ce que le bon nombre de Pods soit maintenu.
  • Endpoints Controller : associe les services et les Pods en remplissant les objets Endpoints.
  • Service Account & Token Controllers : créent des comptes par défaut et des jetons d'accès API pour chaque nouveau namespace.

cloud-controller-manager : permet de relier votre cluster à l'API de votre fournisseur cloud et de séparer les composants qui interagissent avec cette plateforme cloud des composants qui n'interagissent qu'avec votre cluster. Ce gestionnaire n'est utilisé qu'en production. Des exemples de contrôleurs de ce gestionnaire sont :

  • Node Controller : permet de vérifier auprès du fournisseur de cloud si un nœud a été supprimé dans le cloud après qu'il a cessé de répondre.
  • Route Controller : permet de créer des routes dans l'infrastructure cloud.
  • Service Controller : permet de créer, de mettre à jour et de supprimer les équilibreurs de charge du fournisseur de cloud.
  • Volume Controller : même chose mais pour les volumes.

Les composants des nœuds de travail

Ces composants s'exécutent sur chaque nœud du cluster, en maintenant l'exécution des Pods et en fournissant l'environnement d'exécution Kubernetes.

kubelet : s'exécute sur chaque nœud du cluster. Il s'assure que les conteneurs sont en cours d'exécution et en bonne santé dans les Pods

kube-proxy : maintient des règles de réseau sur les nœuds. Ces règles de réseau permettent la communication réseau vers vos Pods à partir de sessions réseau à l'intérieur ou à l'extérieur de votre cluster. 

Container runtime : logiciel responsable de l'exécution des conteneurs. Il en existe plusieurs comme CRI-O et containerd.

Cette leçon est très importante pour comprendre l'évolution des nombreux logiciels et leurs relations.

Historique de Kubernetes

Docker est une plateforme permettant de lancer des applications dans des conteneurs logiciels lancée en 2013.

Kubernetes était à l'origine, lors de son lancement en 2014, un orchestrateur pour DockerKubernetes reposait donc uniquement sur Docker pour gérer les conteneurs. 

Toutefois en 2016, Kubernetes a évolué pour prendre en charge d'autres environnement d’exécution des conteneurs (runtimes), réduisant ainsi sa dépendance à Docker en introduisant une API standardisée appelée CRI (voir plus bas).

Kubernetes utilisait le composant dockershim pour permettre l'intégration avec Docker. Il agissait comme un pont entre le runtime Docker et la nouvelle interface CRI.

En 2020, Kubernetes a annoncé la dépréciation de dockershim pour se concentrer sur d'autres runtimes conformes à CRI, tels que containerd et CRI-O. Cette décision a encouragé les utilisateurs à adopter des runtimes de conteneurs plus légers et plus axés sur la sécurité.

L'initiative OCI

OCI (Open Container Initiative) est une organisation ouverte et collaborative créée en 2015, sous l'égide de la Linux Foundation. Son objectif principal est de développer et de promouvoir des normes ouvertes pour les conteneurs logiciels, afin de garantir la portabilité et l'interopérabilité entre les différentes plateformes de conteneurisation.

L'OCI maintient une spécification standard pour le packaging des images de conteneurs (OCI image-spec) et l'exécution des conteneurs (OCI runtime-spec). Ils maintiennent également une implémentation réelle de la spécification d'exécution : runc (voir plus bas).

L'initiative CRI

CRI (Container Runtime Interface) est une interface standardisée introduite par Kubernetes pour permettre aux différents gestionnaires de conteneurs (tels que containerdCRI-O, etc.) de s'intégrer de manière transparente avec Kubernetes.

Cela permet d'utiliser différents moteurs de conteneurs pour exécuter les conteneurs, en fonction des préférences et des besoins de l'utilisateur.

cri

Environnement d'exécution des conteneurs

Container runtime

Gestion des conteneurs (High-level runtimes)

Le gestionnaire de conteneur va effectuer principalement les tâches suivantes :

  • Gestion des images : il va pull les images à partir d'un registre (Docker Hub ou tout autre registre d'images OCI), de les décompresser et de les stocker sur le système de fichiers de l'hôte. Il est également capable de gérer plusieurs versions d'une même image et de nettoyer les images inutilisées.
  • Gestion du stockage : il gère le stockage des conteneurs sur le système de fichiers de l'hôte, en utilisant des pilotes de stockage pour gérer les couches d'images et les systèmes de fichiers des conteneurs.
  • Création des conteneurs : il pilote runc (ou tout autre implémentation respectant les standards OCI) pour créer les conteneurs à partir des images et les configurer. Il gère tout le cycle de vie des conteneurs.

Cette liste n'est pas exhaustive, il fait beaucoup plus de choses que cela, par exemple pour containerd :

architecture

containerd : environnement d'exécution de conteneurs open source le plus utilisé (qui provient à l'origine de Docker et est maintenant également géré par le CNCF) qui met l'accent sur la simplicité, la robustesse et la portabilité. Il gère le cycle de vie complet des conteneurs et comprend un daemon de gestion des conteneurs. Docker lui-même utilise containerd.

CRI-O : autre environnement d'exécution de conteneurs qui implémente l'interface Container Runtime Interface (CRI) de Kubernetes pour permettre l'intégration avec Kubernetes. C'est une option légère qui se concentre uniquement sur l'exécution des conteneurs nécessaires à Kubernetes, sans fonctionnalités supplémentaires.

rkt (prononcé "rocket") : un autre runtime de conteneurs open source, développé par CoreOS. En 2020, le projet rkt a été officiellement archivé par le CNCF, ce qui signifie qu'il n'est plus activement développé et vous pouvez le considéré comme abandonné.

Exécution bas niveau des conteneurs (Low-level runtimes)

runc : implémentation de référence de l'Open Container Initiative (OCI) écrite en Go. Il s'agit d'un outil en ligne de commande pour lancer et gérer des conteneurs conformes à la spécification OCI. À la fois containerd et CRI-O utilisent runc par défaut pour gérer les conteneurs.

gVisor : environnement d'exécution de conteneurs développé par Google qui fournit un bac à sable pour isoler les conteneurs de manière plus forte.

Kata Containers : projet open source qui fournit un environnement d'exécution de conteneurs léger, semblable à une machine virtuelle. Il combine la vitesse et l'efficacité des conteneurs avec la sécurité des machines virtuelles, et peut être utilisé comme une alternative à runc pour gérer les conteneurs dans des environnements où la sécurité est une priorité.

Relations entre les éléments

ctr : est le CLI pour utiliser directement containerd. Par exemple, vous pouvez utiliser ctr pour tirer et pousser des images de conteneurs à partir d'un dépôt conforme à l'OCI, comme Docker Hub, tout comme vous le feriez avec la CLI de Docker.

Architecture de Docker

Le fait que Kubernetes 1.24 supprime dockershim et l'environnement d'exécution Docker a fait couler beaucoup d'encre car Docker et une pile de très nombreux logiciels et "Docker" désigne en fait tout un environnement.

Comme nous le voyons dans le schéma ci-dessus, nous avons :

  • le client Docker : accessible notamment avec un terminal mais aussi avec Docker Desktop. Il permet de construire les images selon le standard OCI, il permet d'utiliser une API user-friendly pour effectuer toutes les tâches en interagissant avec le daemon Docker.
  • dockerd : dialogue avec containerd et le problème vient justement qu'il ne respecte pas le standard CRI et devait donc avoir un adaptateur (dockershim).

En définitive il n'y a pas d'incidence car c'est l'environnement de production qui change pour Kubernetes pour gagner en performance et flexibilité, et non l'environnement de développement. Vous créerez toujours vos images de la même façon car elles respectent le standard OCI et peuvent être utilisée sans problème en production par containerd et runc.

Pour en apprendre plus, suivez notre formation, la plus complète sur Kubernetes !