Qu'est-ce que Kubernetes ?

Une plateforme DevOps qui facilite le déploiement et la gestion des systèmes distribués

Max Rehkopf Max Rehkopf

Kubernetes est une plateforme open source qui orchestre les systèmes d'exécution de conteneur sur un cluster de ressources matérielles en réseau. Il a été développé à l'origine par Google, qui avait besoin d'une nouvelle manière de gérer des milliards de conteneurs par semaine à grande échelle. À cette fin, Google a développé trois systèmes de gestion de conteneurs différents au fil des ans, le plus récent étant le système open source Kubernetes.

Le mot Kubernetes vient du grec et signifie « timonier » ou « pilote ». Kubernetes est aujourd'hui le leader du marché et l'outil d'orchestration standard pour les conteneurs et le déploiement d'applications distribuées. Kubernetes est la pointe de l'évolution des outils et des systèmes antérieurs que les développeurs ont combinés pour orchestrer les systèmes distribués.

L'évolution de DevOps a commencé à gérer les machines physiques dans les salles de racks de serveurs. Ces machines physiques existent encore, mais sont moins pratiques. Les machines virtuelles et le matériel virtuel ont été la couche suivante d'abstraction exécutée par les hyperviseurs sur les machines physiques. Les développeurs consacraient toujours trop d'efforts pour gérer l'infrastructure et les machines virtuelles sur l'ensemble de l'infrastructure. Les conteneurs ont été développés pour permettre aux développeurs de se concentrer davantage sur le développement d'applications de haut niveau et moins sur l'infrastructure. Kubernetes a ensuite été introduit pour aider à automatiser et gérer les conteneurs dans l'infrastructure cloud.

Kubernetes aide les développeurs à écrire des applications qui s'exécutent dans un cluster, car il est utilisé pour l'orchestration de systèmes d'exécution de conteneur sur un cluster de ressources matérielles en réseau. Comme Google Notes, « l'objectif principal [de Kubernetes] est de faciliter le déploiement et la gestion de systèmes distribués complexes, tout en bénéficiant d'une utilisation optimisée par les conteneurs. »

Kubernetes est parfois appelé K8s ou kube et est maintenant géré par la Cloud Native Computing Foundation.

À quoi sert Kubernetes ?

Kubernetes est essentiellement utilisé pour déployer et gérer un cluster d'applications conteneurisées et peut être utilisé pour établir votre propre plateforme CaaS. Il aide à gérer les architectures d'applications de microservices et est maintenant un outil essentiel pour la construction de pipelines CI/CD Devops modernes robustes.

Pour mieux comprendre la relation entre Kubernetes et les conteneurs, il est important de comprendre les conteneurs. Kubernetes regroupe un ensemble de conteneurs. Parmi les exemples d'ensemble de conteneurs figurent les serveurs d'applications, les caches Redis, les bases de données SQL. Les conteneurs Docker sont un processus par conteneur. Kubernetes place ces conteneurs dans un groupe qu'il gère sur la même machine afin de réduire la surcharge réseau et d'optimiser l'utilisation des ressources.

Kubernetes fournira et gérera les ressources matérielles sous-jacentes indiquées dans votre configuration. Il multipliera et répartira ensuite les conteneurs d'applications sur les ressources matérielles. Cela permet à Kubernetes d'orchestrer des conteneurs sur des machines différentes ou sur la même machine.

Kubernetes favorise également l'optimisation du développement d'applications pour le cloud. La plupart des applications modernes non banales sont composées de plusieurs responsabilités différentes en matière d'analyse de rentabilisation, telles que la gestion des comptes, les paiements et le contenu. Ces responsabilités distinctes conviennent bien à une architecture de microservices. En utilisant Kubernetes dès le début du développement d'un nouveau projet, la conception et l'implémentation de microservices produiront souvent un fort retour sur investissement. À mesure que le projet se développe, il bénéficiera des fonctionnalités de mise à l'échelle automatique, de surveillance et de facilité de déploiement offertes par Kubernetes.

Kubernetes peut être utilisé pour planifier des tâches de calcul exigeantes en ressources. Certains projets peuvent nécessiter des charges de travail intensives qui utilisent les ressources de la machine pendant une période prolongée. Imaginez un projet qui exécute une simulation complexe comme le repliement des protéines, l'analyse génétique ou le rendu graphique 3D. Ces types de projets disposent souvent d'un cluster dédié de ressources de calcul pour exécuter la simulation de manière asynchrone. Kubernetes est un outil idéal pour gérer ces clusters.

Provisionner efficacement les ressources dans un cluster peut s'avérer difficile. La quantité de CPU et de mémoire dont les conteneurs ont besoin peut varier en fonction de l'utilisation. Kubernetes dispose de mécanismes de mise à l'échelle horizontale et verticale. Il existe deux types de mise à l'échelle horizontale. Kubernetes peut ajouter et supprimer d'autres pods sur un nœud, ou il ajoutera et supprimera de nouvelles machines au cluster. Pourtant, la mise à l'échelle verticale augmentera ou diminuera les ressources machine locales qu'un conteneur utilise. Kubernetes dispose d'une surveillance intégrée et d'un ensemble de règles configurables qu'il examine pour déterminer s'il doit évoluer vers le haut ou vers le bas.

Kubernetes peut être utilisé conjointement avec certains outils de pipeline DevOps modernes pour créer un pipeline CI/CD, car il contrôle et automatise les déploiements et les mises à jour des applications. Cette automatisation du déploiement associée à une suite de tests automatisés robuste englobe un pipeline CI/CD complet.

Qui devrait utiliser Kubernetes ?

Kubernetes est idéal pour les projets logiciels modernes à haute performance. Cependant, le transfert d'un projet existant vers Kubernetes s'avère coûteux et fastidieux. Dans cette optique, il est souvent mieux adapté pour les premières étapes des projets. Pourtant, le retour sur investissement de la migration d'un système plus ancien établi dans Kubernetes peut être intéressant. Cette décision concernant les coûts d'entreprise d'ingénierie doit être soigneusement réfléchie.

Kubernetes et Docker

Docker est un système d'exécution de conteneur tandis que Kubernetes est une plateforme pour exécuter et gérer des conteneurs à partir de nombreux systèmes d'exécution de conteneurs. Docker est l'un des nombreux systèmes d'exécution de conteneurs pris en charge par Kubernetes. Vous pouvez presque considérer Kubernetes comme un « système d'exploitation » et les conteneurs Docker comme des « applications » que vous installez sur ce « système d'exploitation ».

En soi, Docker est très bénéfique pour le développement d'applications modernes. Il résout le problème classique du « ça fonctionne sur ma machine », mais sur aucune autre ensuite. Docker seul est tout à fait capable de gérer un déploiement de quelques conteneurs. Lorsqu'un système évolue et nécessite l'ajout de nombreux conteneurs mis en réseau les uns avec les autres, Docker seul peut faire face à certaines difficultés croissantes que Kubernetes aide à résoudre.

Les bases de Kubernetes

Kubernetes est constitué de nombreux composants et implique de comprendre certains concepts. Une installation globale de Kubernetes est connue sous le nom de cluster. Tous les clusters Kubernetes ont une instance principale. L'instance principale est responsable de la gestion du cluster. Il s'agit d'un processus démon qui coordonne toutes les activités du cluster, telles que les déploiements, la mise à l'échelle automatique et la surveillance de l'intégrité.

Diagramme illustrant le fonctionnement de Kubernetes, avec l'instance principale, un nœud, un kubelet et un pod.

Le cluster est composé de nœuds. Un nœud est une entité machine telle qu'une machine virtuelle ou un matériel physique qui agit comme une instance de travail dans le cluster Kubernetes. Tous les nœuds contiennent un Kubelet qui est un processus client qui communique avec le processus principal à l'aide du point d'accès Kubernetes. Les nœuds hébergent également un système d'exécution de conteneurs comme Docker.

Chaque nœud contient un Kubelet. Le Kubelet est le processus principal responsable de la gestion du nœud et de la communication avec la branche principale. Le Kubelet intègre également un PodSpec qui définit le cycle de vie et la maintenance des conteneurs dans les pods qui lui sont assignés.

Les nœuds contiennent des pods, qui sont la plus petite unité de Kubernetes. Un pod est une abstraction sur un conteneur. Un pod inclura généralement de nombreux conteneurs par application. Il existe également un conteneur caché dans chaque module appelé conteneur « pause » qui contient l'espace de noms réseau que les autres conteneurs du conteneur utilisent pour parler à l'hôte local.

Les services sont des pointeurs statiques vers des pods. Étant donné que les pods sont éphémères, ils ont des adresses IP dynamiques qui peuvent être réassignées si le conteneur est redémarré ou recréé. Cela peut être gênant si vous essayez de connecter un conteneur à l'aide d'une adresse IP. Les services facilitent la connexion en garantissant qu'un pod a une adresse IP statique.

Le contrôleur de réplication (ReplicationController) est un mécanisme qui garantit qu'un nombre donné de pods est en cours d'exécution à tout moment. Le ReplicationController est un élément clé de la fonctionnalité de mise à l'échelle automatique de Kubernetes. Si le nombre de pods est trop important, le contrôleur de réplication les éliminera, et s'il est trop peu élevé, le contrôleur de réplication créera de nouveaux pods. Les ensembles de réplications (ReplicaSets) sont les successeurs du ReplicationController, ils ont essentiellement la même fonction, mais ils disposent d'utilitaires qui facilitent le ciblage d'un ensemble de pods.

Kubectl est l'interface de ligne de commande pour exécuter des commandes sur un cluster Kubernetes. Kubectl dispose d'une liste complète de commandes et d'options disponibles pour gérer Kubernetes.

Kubernetes peut être déployé sur du matériel physique ou virtuel. MiniKube est une version légère de Kubernetes qui est utilisée pour le développement et crée une machine virtuelle sur votre machine locale qui déploie un cluster simple avec un seul nœud.

Comment fonctionne Kubernetes ?

Kubernetes opère sur une boucle triphasée de contrôles. Les trois phases d'une boucle Kubernetes sont les suivantes :

Observer
Pendant la phase d'observation, Kubernetes agrège un instantané de l'état actuel du cluster. Les Kubelets recueillent des informations d'état sur leurs nœuds respectifs et renvoient cet état au processus principal, donnant à la branche principale une vue holistique de l'état actuel des clusters.

Vérifier les différences
L'instantané d'état de la phase d'observation est ensuite comparé aux paramètres de cluster statiques attendus spécifiés dans la configuration Kubernetes. Toute divergence entre l'état actuel et l'état attendu du cluster est identifiée et doit être prise en compte.

Prendre des mesures
Le processus principal émet ensuite des commandes pour ramener le cluster à l'état attendu. Cela peut signifier la suppression ou la création de pods, la mise à l'échelle horizontale ou verticale entre les nœuds, et bien plus encore.

Les trois phases ci-dessus étaient des descriptions générales de la boucle Kubernetes. Cependant, un cluster Kubernetes peut en fait avoir de nombreuses boucles différentes. Ces boucles sont exécutées par des contrôleurs. Le contrôleur ReplicationController suit les phases de boucle. Au cours de la phase de prise d'action, le RC est seul responsable du tri ou de la création de nouveaux Pods gérés par l'ensemble de répliques.

Résumé

Comme Kubernetes est open source, il permet de tirer parti des infrastructures locales, hybrides ou de cloud public. De plus, il vous permet de migrer sans effort les charges de travail là où vous en avez besoin. Kubernetes peut être combiné avec des outils de pipeline modernes tels que JenKinsX pour développer des systèmes CI/CD très Agile et Lean, et devrait être utilisé par toutes les équipes DevOps modernes et hautement performantes.