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
pourcontinuous integration
en anglais - le code est régulièrement fusionné et testé), - la livraison continue (
CD
pourcontinuous 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 uncluster
.Docker Hub
(ou tout autreContainer Registry
- il y en a plusieurs dizaines) : plateforme de servicecloud
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 decloud
.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 ressourcescloud
.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 dePrometheus
.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 infrastructurescloud
, 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.
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 dePods
soit maintenu.Endpoints Controller
: associe lesservices
et lesPods
en remplissant les objetsEndpoints
.Service Account & Token Controllers
: créent des comptes par défaut et des jetons d'accèsAPI
pour chaque nouveaunamespace
.
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 decloud
si un nœud a été supprimé dans lecloud
après qu'il a cessé de répondre.Route Controller
: permet de créer des routes dans l'infrastructurecloud
.Service Controller
: permet de créer, de mettre à jour et de supprimer les équilibreurs de charge du fournisseur decloud
.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 Docker
. Kubernetes
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 containerd
, CRI-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.
Environnement d'exécution des conteneurs
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'imagesOCI
), 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
:
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 avecDocker Desktop
. Il permet de construire les images selon le standardOCI
, il permet d'utiliser uneAPI
user-friendly pour effectuer toutes les tâches en interagissant avec ledaemon Docker
. dockerd
: dialogue aveccontainerd
et le problème vient justement qu'il ne respecte pas le standardCRI
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 !