GNU/Linux >> Tutoriels Linux >  >> Linux

Introduction à la gestion des conteneurs Linux

Les conteneurs Linux existent depuis un certain temps, mais ils sont devenus largement disponibles lorsqu'ils ont été introduits dans le noyau Linux en 2008. Les conteneurs sont des composants d'application légers et exécutables qui combinent le code source de l'application avec les bibliothèques du système d'exploitation et les dépendances nécessaires pour exécuter le code dans n'importe quel environnement. En outre, ils offrent des technologies de conditionnement et de livraison d'applications tout en tirant parti de l'isolation des applications avec la flexibilité des méthodes de déploiement basées sur l'image.

Les conteneurs Linux utilisent des groupes de contrôle pour la gestion des ressources, des espaces de noms pour l'isolation des processus système, la sécurité SELinux pour permettre une location sécurisée et réduire les menaces ou les exploits de sécurité. Ces technologies fournissent un environnement pour produire, exécuter, gérer et orchestrer des conteneurs.

L'article est un guide d'introduction aux principaux éléments de l'architecture de conteneur Linux, comment les conteneurs se comparent à la virtualisation KVM, aux conteneurs basés sur des images, aux conteneurs Docker et aux outils d'orchestration de conteneurs.

Architecture de conteneur

Un conteneur Linux utilise des éléments clés du noyau Linux tels que les cgroups, SELinux et les espaces de noms. Les espaces de noms assurent l'isolation des processus système tandis que les cgroups (groupes de contrôle), comme leur nom l'indique, sont utilisés pour contrôler les ressources système Linux. SELinux est utilisé pour assurer la séparation entre l'hôte et les conteneurs et entre les conteneurs individuels. Vous pouvez utiliser SELinux pour activer la multilocation sécurisée et réduire le potentiel de menaces et d'exploits de sécurité. Après le noyau, nous avons l'interface de gestion qui interagit avec d'autres composants pour développer, gérer et orchestrer des conteneurs.

SELinux

La sécurité est un composant essentiel de tout système ou architecture Linux. SELinux devrait être la première ligne de défense pour un environnement de conteneur sécurisé. SELinux est une architecture de sécurité pour les systèmes Linux qui donne aux administrateurs système plus de contrôle sur l'accès à l'architecture de votre conteneur. Vous pouvez isoler les conteneurs du système hôte et les autres conteneurs les uns des autres.

Un environnement de conteneurs fiable nécessite un administrateur système pour créer des politiques de sécurité personnalisées. Les systèmes Linux fournissent différents outils comme podman ou udica pour générer des politiques de conteneur SELinux. Certaines stratégies de conteneur contrôlent la manière dont les conteneurs accèdent aux ressources de l'hôte telles que les lecteurs de stockage, les périphériques et les outils réseau. Une telle politique renforcera votre environnement de conteneurs contre les menaces de sécurité et créera un environnement qui maintient la conformité réglementaire.

L'architecture crée une séparation sécurisée qui empêche les processus racine du conteneur d'interférer avec d'autres services s'exécutant en dehors d'un conteneur. Par exemple, un système attribue automatiquement à un conteneur Docker un contexte SELinux spécifié dans la politique SELinux. Par conséquent, SELinux semble toujours être désactivé à l'intérieur d'un conteneur, même s'il s'exécute en mode d'application sur le système d'exploitation ou le système hôte.
Remarque :la désactivation ou l'exécution de SELinux en mode permissif sur une machine hôte ne séparera pas les conteneurs de manière sécurisée. .

Espaces de noms

Les espaces de noms du noyau fournissent une isolation des processus pour les conteneurs Linux. Ils permettent la création d'une abstraction des ressources système où chacune apparaît comme une instance distincte pour les processus au sein d'un espace de noms. Essentiellement, les conteneurs peuvent utiliser les ressources système simultanément sans créer de conflit. Les espaces de noms incluent le réseau, le montage, les espaces de noms UTS, les espaces de noms IPC, les espaces de noms PID.

  • Les espaces de noms de montage isolent les points de montage du système de fichiers disponibles pour un groupe de processus. D'autres services dans un espace de noms de montage différent peuvent avoir des vues alternatives de la hiérarchie du système de fichiers. Par exemple, chaque conteneur de votre environnement peut avoir son propre répertoire /var.
  • Espaces de noms UTS :isolez les identifiants du système de nom de nœud et de nom de domaine. Il permet à chaque conteneur d'avoir un nom d'hôte et un nom de domaine NIS uniques.
  • Les espaces de noms réseau créent une isolation des contrôleurs réseau, des pare-feu et des tables d'adresses IP de routage. Essentiellement, vous pouvez concevoir un environnement de conteneur pour utiliser des piles de réseau virtuel distinctes avec des appareils virtuels ou physiques et même leur attribuer des adresses IP uniques ou des règles iptable.
  • Les espaces de noms PID permettent aux processus système de différents conteneurs d'utiliser le même PID. Essentiellement, chaque conteneur peut avoir un processus init unique pour gérer le cycle de vie du conteneur ou initialiser les tâches système. Chaque conteneur aura son propre répertoire /proc unique pour surveiller les processus en cours d'exécution dans le conteneur. Notez qu'un conteneur n'est conscient que de ses processus/services et ne peut pas voir d'autres processus en cours d'exécution dans différentes parties du système Linux. Cependant, un système d'exploitation hôte est conscient des processus exécutés à l'intérieur d'un conteneur.
  • Espaces de noms IPC :isolez les ressources de communication interprocessus du système (System V, objets IPC, files d'attente de messages POSIX) pour permettre à différents conteneurs de créer des segments de mémoire partagée portant le même nom. Cependant, ils ne peuvent pas interagir avec les segments de mémoire ou la mémoire partagée d'autres conteneurs.
  • Espaces de noms d'utilisateurs :permet à un administrateur système de spécifier des UID d'hôte dédiés à un conteneur. Par exemple, un processus système peut avoir des privilèges root à l'intérieur d'un conteneur, mais de même ne pas être privilégié pour les opérations en dehors du conteneur.

Groupes de contrôle

Les groupes de contrôle du noyau permettent la gestion des ressources système entre différents groupes de processus. Les Cgroups allouent du temps CPU, de la bande passante réseau ou de la mémoire système parmi les tâches définies par l'utilisateur.

Conteneurs VS virtualisation KVM

Les conteneurs et les technologies de virtualisation KVM présentent des avantages et des inconvénients qui guident le cas d'utilisation ou l'environnement à déployer. Pour commencer, les machines virtuelles KVM nécessitent leur propre noyau tandis que les conteneurs partagent le noyau hôte. Ainsi, l'un des principaux avantages des conteneurs est de lancer plus de conteneurs que de machines virtuelles en utilisant les mêmes ressources matérielles.

Conteneurs Linux

Avantages Inconvénients
Conçu pour gérer l'isolement des applications conteneurisées. L'isolation des conteneurs n'est pas au même niveau que la virtualisation KVM.
Les configurations ou modifications de l'hôte à l'échelle du système sont visibles dans chaque conteneur. Plus grande complexité dans la gestion des conteneurs.
Les conteneurs sont légers et offrent une évolutivité plus rapide de votre architecture. Nécessite des compétences d'administrateur système approfondies dans la gestion des journaux, des données persistantes avec les bonnes autorisations de lecture et d'écriture.
Il permet la création et la distribution rapides d'applications.
Il facilite le stockage et les coûts opérationnels en ce qui concerne le développement et l'approvisionnement d'images de conteneurs.

Domaines d'application :

  •  Architecture d'application nécessitant une mise à l'échelle importante.
  • Architecture de microservices
  • Développement d'applications locales.

Virtualisation KVM

Avantages Inconvénients
KVM permet un démarrage complet des systèmes d'exploitation tels que Linux, Unix, macOS et Windows. Nécessite une administration poussée de l'ensemble de l'environnement virtuel
Une machine virtuelle invitée est isolée des changements d'hôte et des configurations système. Vous pouvez exécuter différentes versions d'une application sur l'hôte et la machine virtuelle. La configuration d'un nouvel environnement virtuel peut prendre plus de temps, même avec des outils d'automatisation.
L'exécution de noyaux séparés offre une meilleure sécurité et séparation. Coûts opérationnels plus élevés associés à la machine virtuelle, à l'administration et au développement d'applications
Répartition claire des ressources.

Domaines d'application :

  • Environnements système nécessitant des ressources clairement dédiées
  • Systèmes qui nécessitent un noyau en cours d'exécution indépendant.

Conteneur basé sur une image

Les conteneurs basés sur des images regroupent les applications avec des piles d'exécution individuelles, ce qui rend les conteneurs provisionnés indépendants du système d'exploitation hôte. Essentiellement, vous pouvez exécuter plusieurs instances d'une application, chacune sur une plate-forme différente. Pour rendre une telle architecture possible, vous devez déployer et exécuter le conteneur et l'environnement d'exécution de l'application en tant qu'image.

Une architecture système composée de conteneurs basés sur des images vous permet d'héberger plusieurs instances d'une application avec une surcharge et une flexibilité minimales. Il permet la portabilité des conteneurs qui ne dépendent pas de configurations spécifiques à l'hôte. Les images peuvent exister sans conteneurs. Cependant, un conteneur doit exécuter une image pour exister. Essentiellement, les conteneurs dépendent des images pour créer un environnement d'exécution pour exécuter une application.

Conteneur

Un conteneur est créé sur la base d'une image qui contient les données de configuration nécessaires pour créer un composant actif qui s'exécute en tant qu'application. Le lancement d'un conteneur crée une couche inscriptible au-dessus de l'image spécifiée pour stocker les modifications de configuration.

Image

Une image est un instantané statique des données de configuration d'un conteneur à un moment précis. Il s'agit d'une couche en lecture seule dans laquelle vous pouvez définir tous les changements de configuration dans la couche inscriptible la plus élevée. Vous ne pouvez l'enregistrer qu'en créant une nouvelle image. Chaque image dépend d'une ou plusieurs images parentes.

Plateforme-image

Une image de plate-forme n'a pas de parent. Au lieu de cela, vous pouvez l'utiliser pour définir l'environnement d'exécution, les packages et les utilitaires nécessaires au lancement et à l'exécution d'une application conteneurisée. Par exemple, pour travailler avec des conteneurs Docker, vous extrayez une image de plate-forme en lecture seule. Toutes les modifications définies se reflètent dans les images copiées empilées au-dessus de l'image Docker initiale. Ensuite, il crée une couche d'application qui contient des bibliothèques et des dépendances supplémentaires pour l'application conteneurisée.

Un conteneur peut être très grand ou petit selon le nombre de packages et de dépendances inclus dans la couche application. De plus, une superposition supplémentaire de l'image est possible avec un logiciel tiers indépendant et des dépendances. Ainsi, d'un point de vue opérationnel, il peut y avoir plusieurs couches derrière une Image. Cependant, les couches n'apparaissent que comme un conteneur pour un utilisateur.

Conteneurs Docker

Docker est un environnement virtuel conteneurisé pour développer, maintenir, déployer et orchestrer des applications et des services. Les conteneurs Docker offrent moins de surcharge lors de la configuration ou de la mise en place d'environnements virtuels. Les conteneurs n'ont pas de noyau séparé et s'exécutent directement à partir du système d'exploitation hôte. Il utilise des espaces de noms et des groupes de contrôle pour utiliser efficacement les ressources du système d'exploitation hôte.

Une instance d'un conteneur exécute un processus de manière isolée sans affecter les autres applications. Essentiellement, chaque application conteneurisée possède des fichiers de configuration uniques.

Un démon Docker permet aux conteneurs de renvoyer un ping et alloue des ressources à une application conteneurisée en fonction de la quantité dont elle a besoin pour s'exécuter. Contrairement à un conteneur Linux (LXC), un conteneur Docker est spécialisé dans le déploiement d'applications conteneurisées uniques. Il fonctionne nativement sous Linux, mais prend également en charge d'autres systèmes d'exploitation tels que macOS et Windows.

Principaux avantages des conteneurs Docker

  • Portabilité :- Vous pouvez déployer une application conteneurisée dans n'importe quel autre système sur lequel un moteur Docker est en cours d'exécution, et votre application fonctionnera exactement comme lorsque vous l'avez testée dans votre environnement de développement. En tant que développeur, vous pouvez partager en toute confiance une application Docker sans avoir à installer de packages ou de logiciels supplémentaires, quel que soit le système d'exploitation utilisé par vos équipes. Docker va de pair avec la gestion des versions, et vous pouvez facilement partager des applications conteneurisées sans casser le code.
  • Les conteneurs peuvent s'exécuter n'importe où et sur n'importe quel système d'exploitation pris en charge, comme Windows, les machines virtuelles, macOS, Linux, sur site et dans le cloud public. La popularité généralisée des images Docker a conduit à une large adoption par les fournisseurs de cloud tels qu'Amazon Web Services (AWS), Google Compute Platform (GCP) et Microsoft Azure.
  • Performance :– Les conteneurs ne contiennent pas de système d'exploitation, ce qui crée une empreinte beaucoup plus petite que les machines virtuelles et est généralement plus rapide à créer et à démarrer.
  • Agilité : – Les performances et la portabilité des conteneurs permettent à une équipe de créer un processus de développement agile qui améliore les stratégies d'intégration continue et de livraison continue (CI/CD) afin de fournir le bon logiciel au bon moment.
  • Isolation :- Un conteneur Docker avec une application inclut également les versions pertinentes de toutes les dépendances et logiciels requis par votre application. Les conteneurs Docker sont indépendants les uns des autres, et d'autres conteneurs/applications qui nécessitent différentes versions des dépendances logicielles spécifiées peuvent exister dans la même architecture sans problème. Par exemple, il garantit qu'une application telle que Docker MariaDB n'utilise ses ressources que pour maintenir des performances système cohérentes.
  • Évolutivité :– Docker vous permet de créer de nouveaux conteneurs et applications à la demande.
  • Collaboration :- Le processus de conteneurisation dans Docker vous permet de segmenter un processus de développement d'applications. Il permet aux développeurs de partager, de collaborer et de résoudre rapidement tout problème potentiel sans nécessiter de refonte massive, créant ainsi un processus de développement rentable et rapide.

Orchestration des conteneurs

L'orchestration de conteneurs est le processus d'automatisation du déploiement, de l'approvisionnement, de la gestion, de la mise à l'échelle, de la sécurité, du cycle de vie, de l'équilibrage de charge et de la mise en réseau des services et charges de travail conteneurisés. Le principal avantage de l'orchestration est l'automatisation. L'orchestration prend en charge un processus de développement DevOps ou agile qui permet aux équipes de développer et de déployer dans des cycles itératifs et de publier de nouvelles fonctionnalités plus rapidement. Les outils d'orchestration populaires incluent Kubernetes, Amazon ECR Docker Swarm et Apache Mesos.

L'orchestration de conteneur implique essentiellement un processus en trois étapes dans lequel un développeur écrit un fichier de configuration (YAML ou JSON) qui définit un état de configuration. L'outil d'orchestration exécute ensuite le fichier pour obtenir l'état système souhaité. Le fichier YAML ou JSON définit généralement les composants suivants :

  • Les images de conteneur qui composent une application et le registre d'images.
  • Il provisionne un conteneur avec des ressources telles que le stockage.
  • Troisièmement, il définit les configurations réseau entre les conteneurs.
  • Il spécifie la gestion des versions d'image.

L'outil d'orchestration planifie le déploiement des conteneurs ou des réplicas de conteneur sur l'hôte en fonction de la capacité de processeur disponible, de la mémoire ou d'autres contraintes spécifiées dans le fichier de configuration. Une fois que vous avez déployé des conteneurs, l'outil d'orchestration gère le cycle de vie d'une application en fonction d'un fichier de définition de conteneur (Dockerfile). Par exemple, vous pouvez utiliser un Dockerfile pour gérer les aspects suivants :

  • Gérer l'évolutivité à la hausse ou à la baisse, l'allocation des ressources, l'équilibrage de charge
  • Maintenir la disponibilité et les performances des conteneurs en cas de panne ou de pénurie de ressources système
  • Collecter et stocker les données des journaux pour surveiller l'état et les performances des applications conteneurisées

Kubernetes

Kubernetes est l'une des plates-formes d'orchestration de conteneurs les plus populaires utilisées pour définir l'architecture et les opérations des applications cloud natives afin que les développeurs puissent se concentrer sur le développement de produits, le codage et l'innovation. Kubernetes vous permet de créer des applications qui s'étendent sur plusieurs conteneurs, de les planifier sur un cluster, de les mettre à l'échelle et de gérer leur santé et leurs performances au fil du temps. Essentiellement, il élimine les processus manuels impliqués dans le déploiement et la mise à l'échelle des applications conteneurisées.

Composants clés de Kubernetes

  • Cluster :plan de contrôle avec un ou plusieurs ordinateurs/nœuds.
  • Plan de contrôle :ensemble de processus qui contrôlent différents nœuds.
  • Kubelet :il s'exécute sur des nœuds et garantit que les conteneurs peuvent démarrer et s'exécuter efficacement.
  • Pod :un groupe de conteneurs déployés sur un seul nœud. Tous les conteneurs d'un pod partagent une adresse IP, un nom d'hôte, un IPC et d'autres ressources.

Kubernetes est devenu la norme de l'industrie en matière d'orchestration de conteneurs. Il offre des capacités de conteneur étendues, dispose d'une communauté de contributeurs dynamiques, est hautement extensible et portable. Vous pouvez l'exécuter dans un large éventail d'environnements tels que sur site, public ou cloud et l'utiliser efficacement avec d'autres technologies de conteneurs.

Conclusion

Les conteneurs sont des composants d'application légers et exécutables composés de code source, de bibliothèques de système d'exploitation et de dépendances nécessaires pour exécuter le code dans n'importe quel environnement. Les conteneurs sont devenus largement disponibles en 2013 lorsque la plateforme Docker a été créée. Par conséquent, vous trouverez souvent des utilisateurs dans la communauté Linux qui utilisent indifféremment les conteneurs Docker et les conteneurs pour faire référence à la même chose.

L'utilisation de conteneurs Docker présente plusieurs avantages. Cependant, toutes les applications ne sont pas adaptées à une exécution dans des conteneurs. En règle générale, les applications dotées d'une interface utilisateur graphique ne conviennent pas à une utilisation avec Docker. Par conséquent, les microservices conteneurisés ou les architectures sans serveur sont essentiels pour les applications cloud natives.

L'article vous a donné un guide d'introduction aux conteneurs sous Linux, aux images Docker et aux outils d'orchestration de conteneurs comme Kubernetes. Ce guide s'appuiera sur l'utilisation de conteneurs, de Docker Engine et de Kubernetes, où un développeur peut apprendre à développer et à partager des applications conteneurisées.


Linux
  1. Introduction à Nmap sur Kali Linux

  2. Introduction à la commande alternatives sous Linux

  3. Quelle est la différence entre un conteneur Linux et une image ?

  4. Mes 5 images de conteneurs Linux préférées

  5. Comment créer, répertorier et supprimer des conteneurs Docker sous Linux

Introduction au système de fichiers Linux

Une introduction au navigateur Vivaldi sous Linux

Introduction aux cgroups d'un administrateur système Linux

Une introduction au registre des conteneurs de Quay

Premiers pas avec Buildah pour la gestion des conteneurs Linux

Comment gérer les conteneurs Docker