Docker Compose vous permet de définir des piles de conteneurs que vous pouvez gérer collectivement. C'est un outil relativement simple qui se concentrait à l'origine sur les installations locales de Docker.
Kubernetes est un orchestrateur de conteneurs fourni avec sa propre chaîne d'outils et ses propres fichiers manifestes. Il est généralement considéré comme plus complexe qu'un flux de travail Docker classique, mais ses fonctionnalités facilitent les déploiements de conteneurs évolutifs en production.
Kompose est un outil qui vous permet de prendre des fichiers Docker Compose et de les déployer sur des clusters Kubernetes. Il est développé dans le cadre du projet Kubernetes.
Les versions actuelles de Kompose sont limitées aux conversions de fichiers YAML. Vous devez appliquer les manifestes de ressources Kubernetes convertis à votre cluster à l'aide d'un outil tel que Kubectl. Les anciennes versions de Kompose avaient un up
intégré commande qui pourrait se déployer directement sur votre cluster sans étape de conversion intermédiaire. Cela a été supprimé en raison de la complexité technique croissante.
Mise en route
Kompose est disponible pour Windows, macOS et les distributions Linux les plus populaires. Des binaires pré-construits sont disponibles à partir de son référentiel GitHub. Téléchargez la dernière version, définissez le bit d'autorisation exécutable et déplacez le binaire dans un répertoire qui se trouve dans votre chemin. Plusieurs gestionnaires de packages sont également pris en charge.
curl -L https://github.com/kubernetes/kompose/releases/download/v1.23.0/kompose-linux-amd64 -o komposechmod +x komposesudo mv ./kompose /usr/local/bin/komposeEssayez d'exécuter
kompose
dans votre borne. Vous verrez des informations de base sur les commandes disponibles. Exécution de lakompose version
vérifie la version de Kompose que vous utilisez.
Maintenant, assurez-vous que vous avez un
docker-compose.yml
dossier disponible. Voici un exemple basique qui configure un serveur Web Apache avec une base de données MySQL :version :"3"services :apache :image :httpd:latest ports :- 80:80 mysql :image :mysql:latest expose :- 3306 volumes :- mysql:/var/lib/mysqlvolumes :mysql :Vous avez également besoin d'un cluster Kubernetes pour effectuer le déploiement. Créez un cluster avec un fournisseur de cloud public ou lancez le vôtre à l'aide d'un projet tel que MicroK8s.
Convertir votre pile
Le
kompose convert
La commande accepte le chemin d'accès à un fichier Docker Compose et émet des manifestes de ressources Kubernetes équivalents. Il utilise ledocker-compose.yml
dans votre répertoire de travail lorsqu'aucun chemin n'est donné. Plusieurs fichiers sont acceptés via le-f
drapeau.compose convert -f docker-compose.yml -f docker-compose-dev.ymlVous verrez quelques lignes de sortie lorsque Kompose écrit des fichiers manifestes pour chacune des ressources de votre pile Compose. Des fichiers individuels sont créés pour chaque composant de votre
docker-compose.yml
. Ils seront placés dans votre répertoire de travail.Voici le résultat de la conversion du
docker-compose.yml
ci-dessus :
Un déploiement et un service Kubernetes ont été créés pour chacun des services Compose. Ces ressources définissent les Pods à créer ainsi que leurs règles de routage réseau.
Un PersistentVolumeClaim existe également pour le conteneur MySQL. Cela représente le volume configuré dans le
docker-compose.yml
, fournissant un stockage persistant pour la base de données MySQL qui dure plus longtemps que n'importe quel pod individuel.Si vous inspectez les fichiers YAML, vous verrez qu'il ne s'agit que de manifestes Kubernetes compatibles avec Kubectl. Voici le
apache-deployment.yaml
converti fichier :apiVersion :apps/v1kind :Deploymentmetadata :annotations :kompose.cmd :kompose convert kompose.version : 1.23.0 (bc7d9f4f) creationTimestamp : null labels :io.kompose.service :apache name :apachespec :répliques :1 sélecteur :matchLabels :io.kompose.service :stratégie apache :{} modèle :métadonnées :annotations :kompose.cmd :kompose convert kompose.version :1.23.0 (bc7d9f4f) creationTimestamp :étiquettes nulles :io.kompose.service :spécification apache :conteneurs :- image :httpd:latest name :apache ports :- containerPort :80 ressources :{} restartPolicy :Alwaysstatus :{}La
spec
du déploiement est assez similaire à la définition du conteneur Apache dans ledocker-compose.yml
d'origine . Dans le cas de ce service simple, il est facilement mappé à un objet Kubernetes. Le reste du fichier consiste principalement à définir des métadonnées, y compris des annotations spécifiques à Kompose qui vous permettent d'identifier les ressources créées avec l'outil.Déploiement sur votre cluster
Déployez l'ensemble des fichiers manifestes de la manière habituelle avec
kubectl apply
. C'est une bonne idée de les stocker dans un répertoire séparé de votredocker-compose.yml
, de sorte quekubectl
n'essaie pas non plus de sélectionner ce fichier incompatible.kubectl appliquer .Les ressources seront provisionnées à l'intérieur de votre cluster. L'exécution de vos services peut prendre quelques minutes. Inspectez votre déploiement avec
kubectl get deployments
. Lorsque leAVAILABLE
la colonne affiche1
, votre charge de travail doit être accessible.
Maintenant, vous pouvez mettre à jour votre déploiement en modifiant les manifestes générés et en réexécutant
kubectl apply
. Si vous vouliez faire évoluer Apache vers trois répliques, vous ouvririezapache-deployment.yaml
, modifiez lesreplicas
champ à3
, et appliquez le manifeste modifié.Vous pouvez également continuer à mettre à jour votre fichier Docker Compose. Exécutez
kompose convert
à nouveau pour obtenir la dernière interprétation Kubernetes de son contenu, puis réappliquez la sortie à votre cluster. Sachez que cela écrasera toutes les modifications que vous avez appliquées manuellement depuis.Limites
Kompose fonctionne généralement bien avec les fichiers Docker Compose en utilisant les fonctionnalités les plus courantes et les meilleures pratiques. Il peut créer des conteneurs, exposer des ports et fournir un stockage persistant via des volumes.
Cependant, toutes les conversions ne seront pas parfaites. Certaines fonctionnalités de composition n'ont pas d'équivalent direct dans le monde Kubernetes, tandis que d'autres seront mappées d'une manière qui pourrait ne pas répondre à vos besoins. L'utilisation de déploiements et de services dans cet exemple en est un. Si vous déployiez directement sur Kubernetes, vous pourriez utiliser une règle Ingress pour exposer votre service, mais cela n'est pas créé par Kompose. Les décisions avisées sont résolues en prenant l'option la plus simple.
Vous rencontrerez également des problèmes de volumes. Les fichiers Docker Compose peuvent lier les fichiers et dossiers de montage de l'hôte dans des conteneurs. Ce n'est pas possible avec Kubernetes, vous aurez donc besoin d'une solution alternative. De plus, bien que Kompose puisse créer des ressources pour PersistentVolumeClaims, il ne créera pas les PersistentVolumes réels. Vous devez disposer d'un volume déjà disponible dans votre cluster avant d'essayer de déployer vos manifestes.
Un tableau complet des fonctionnalités prises en charge et des détails de conversion est proposé dans le cadre de la documentation de Kompose. Il vaut la peine de vérifier que les fonctionnalités de Docker Compose que vous utilisez sont prises en charge avant de commencer tout effort de conversion.
Conclusion
Kompose simplifie la migration de Docker Compose vers un cluster Kubernetes. Il automatise les étapes qui étaient auparavant fastidieuses, chronophages et sujettes aux erreurs. C'est une bonne aide d'assistance, même si ce n'est pas un outil qui devrait être exécuté sans un certain degré de surveillance.
Les conversions Kompose ne sont pas universellement applicables, elles ne conviendront donc pas à tous les environnements. Il est toujours utile de vérifier les manifestes émis avant de les appliquer à votre cluster. Dans certains cas, il est préférable d'utiliser Kompose comme référence - convertissez votre
docker-compose.yml
, voyez le résultat, puis utilisez-le comme point de départ pour créer des manifestes entièrement compatibles avec votre application et votre cluster.