Comment déployer des piles Docker Compose sur Kubernetes avec Kompose –
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 Docker locales.
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 workflow Docker classique, mais ses capacité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
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.
Sommaire
Commencer
Kompose est disponible pour Windows, macOS et les distributions Linux les plus populaires. Les 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 de l’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 kompose chmod +x kompose sudo mv ./kompose /usr/local/bin/kompose
Essayez de courir kompose
dans votre terminal. Vous verrez quelques informations de base sur les commandes disponibles. En cours kompose version
vérifie la version de Kompose que vous utilisez.
Maintenant, assurez-vous d’avoir un docker-compose.yml
fichier disponible. Voici un exemple de base 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/mysql volumes: mysql:
Vous avez également besoin d’un cluster Kubernetes sur lequel effectuer le déploiement. Créez un nouveau cluster avec un fournisseur de cloud public ou créez le vôtre à l’aide d’un projet comme MicroK8s.
Conversion de 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 le docker-compose.yml
dans votre répertoire de travail lorsqu’aucun chemin n’est indiqué. Plusieurs fichiers sont acceptés via le -f
drapeau.
kompose convert -f docker-compose.yml -f docker-compose-dev.yml
Vous verrez quelques lignes de sortie pendant que 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
montré 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 survit à 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 converti apache-deployment.yaml
fichier:
apiVersion: apps/v1 kind: Deployment metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.23.0 (bc7d9f4f) creationTimestamp: null labels: io.kompose.service: apache name: apache spec: replicas: 1 selector: matchLabels: io.kompose.service: apache strategy: {} template: metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.23.0 (bc7d9f4f) creationTimestamp: null labels: io.kompose.service: apache spec: containers: - image: httpd:latest name: apache ports: - containerPort: 80 resources: {} restartPolicy: Always status: {}
Le déploiement spec
est assez similaire à la définition du conteneur Apache dans l’original docker-compose.yml
. 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 de fichiers manifeste de la manière habituelle avec kubectl apply
. C’est une bonne idée de les stocker dans un répertoire séparé de votre docker-compose.yml
, pour que kubectl
n’essaye pas non plus de choisir ce fichier incompatible.
kubectl apply .
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
. Quand le AVAILABLE
la colonne montre 1
, 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 à trois réplicas, vous ouvririez apache-deployment.yaml
, changer la replicas
champ à 3
, et appliquez le manifeste modifié.
Vous pouvez également continuer à mettre à jour votre fichier Docker Compose. Cours 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 Compose 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 exemple : si vous déployiez directement sur Kubernetes, vous pouvez utiliser une règle Ingress pour exposer votre service, mais celle-ci n’est pas créée par Kompose. Les décisions d’opinion sont résolues en prenant l’option la plus simple.
Vous rencontrerez également des problèmes liés aux 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 Kompose. Il vaut la peine de vérifier que les fonctionnalités 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 des étapes qui étaient auparavant fastidieuses, chronophages et sujettes aux erreurs. C’est une bonne aide fonctionnelle, mais ce n’est pas un outil qui devrait être utilisé sans un certain degré de surveillance.
Les conversions Kompose ne sont pas universellement applicables, elles ne conviendront donc pas à tous les environnements. Il vaut toujours la peine 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 quel est 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.