Kubernetes semble être axé sur le déploiement de conteneurs sur un nuage de clusters. Cela ne semble pas toucher aux environnements de développement et de mise en scène (ou autres).
Au cours du développement, vous souhaitez être le plus proche possible de l'environnement de production avec des modifications importantes:
De même, on peut souhaiter qu'un environnement non public fasse une intégration continue.
Kubernetes prend-il en charge ce type d’environnement de développement ou faut-il le créer, en espérant qu’il fonctionnera toujours pendant la production?
Mise à jour (2016-07-15)
Avec la sortie de Kubernetes 1.3, Minikube est désormais le moyen recommandé d’exécuter Kubernetes sur votre ordinateur local pour le développement.
Vous pouvez exécuter Kubernetes localement via Docker . Une fois qu'un nœud est en cours d'exécution, vous pouvez lancer un module doté d'un serveur Web simple et monter un volume à partir de votre ordinateur hôte. Lorsque vous appuyez sur le serveur Web, il lit le volume et, si vous avez modifié le fichier sur votre disque local, il peut servir la dernière version.
Nous travaillons sur un outil pour le faire. L'idée de base est que vous avez un cluster Kubernetes distant, un environnement de transfert, puis vous exécutez le code localement et il est envoyé par proxy au cluster distant. Vous obtenez un accès réseau transparent, des variables d’environnement copiées, un accès à des volumes ... aussi proches que possible de l’environnement distant, mais votre code est exécuté localement et sous votre contrôle total.
Ainsi, vous pouvez faire du développement en direct, par exemple. Documents à http://telepresence.io
Nous prévoyons d’ajouter quelque chose comme «rechargement à chaud», mais ce n’est pas aussi facile qu’il pourrait l’être aujourd’hui. Toutefois, si vous vous sentez aventureux, vous pouvez utiliser rsync avec docker exec, kubectl exec ou osc exec (tous à peu près la même chose) pour synchroniser un répertoire local dans un conteneur chaque fois qu'il change. Vous pouvez utiliser rsync avec kubectl ou osc exec comme suit:
# rsync using osc as netcat
$ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder
Je viens de commencer avec Skaffold
Il est vraiment utile d'appliquer automatiquement les modifications du code à un cluster local.
Pour déployer un cluster local, la meilleure solution consiste à Minikube ou simplement à Docker pour Mac et Windows, les deux comprenant une interface Kubernetes.
Un autre bon point de départ est cette configuration vagabonde , esp. si votre système d'exploitation hôte est Windows. Les avantages évidents étant
Les inconvénients - vous avez besoin de beaucoup de RAM, et VirtualBox est VirtualBox ... pour le meilleur ou pour le pire.
Le mappage des fichiers via NFS est un avantage mixte. Dans notre configuration, nous avons créé deux ensembles de définitions RC: l’une qui télécharge simplement une image de menu fixe de nos serveurs d’application; l'autre avec 7 lignes supplémentaires qui configurent le mappage de fichiers à partir de HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes pod; écraser le code source de l’image Docker.
L'inconvénient de ceci est le cache de fichiers NFS - avec cela, c'est problématique, sans cela, c'est lentement problématique. Même régler mount_options: 'nolock,vers=3,udp,noac'
ne résout pas complètement les problèmes de cache, mais cela fonctionne la plupart du temps. Certaines tâches Gulp exécutées dans un conteneur peuvent prendre 5 minutes lorsqu'elles prennent 8 secondes sur le système d'exploitation hôte. Un bon compromis semble être mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'
.
En ce qui concerne le rechargement automatique du code, cela dépend de la langue, mais nous sommes satisfaits du devserver de Django pour Python et de Nodemon pour Node.js. Pour les projets frontaux, vous pouvez bien sûr faire beaucoup avec quelque chose comme gulp + browserSync + watch, mais pour de nombreux développeurs, il n’est pas difficile de servir à partir d’Apache et de simplement effectuer une actualisation dure traditionnelle.
Nous conservons 4 jeux de fichiers yaml pour Kubernetes. Dev, "devstable", scène, prod. Les différences entre celles-ci sont
C'est très utile de créer beaucoup d'alias bash et d'auto-complétion - je peux simplement taper rec users
et il fera kubectl delete -f ... ; kubectl create -f ...
. Si je veux que l'ensemble de la configuration soit démarré, je tape recfo
et il recrée une douzaine de services, en extrayant les dernières images du menu fixe, en important le dernier dump de db depuis Staging env et en nettoyant les anciens fichiers Docker pour économiser de l'espace.
Voir https://github.com/kubernetes/kubernetes/issues/12278 pour savoir comment monter un volume à partir de la machine hôte, l'équivalent de:
docker run -v hostPath:ContainerPath
Avoir une boucle de rétroaction de développement local de Nice est un sujet de développement rapide dans l'écosystème de Kubernetes.
En décomposant cette question, il existe quelques outils qui, à mon avis, appuient bien cet objectif.
Docker pour Mac Kubernetes ( Docker Desktop est le nom générique de plusieurs plates-formes) fournit une excellente option pour le développement local. Pour la virtualisation, il utilise HyperKit , qui repose sur le framework Hypervisor natif de macOS au lieu de VirtualBox.
La fonctionnalité Kubernetes a été publiée pour la première fois en version bêta sur la chaîne Edge en janvier 2018 et a parcouru un long chemin depuis; elle est devenue une certification certifiée Kubernetes en avril 2018 et est passée au canal stable en juillet 2018 .
D'après mon expérience, il est beaucoup plus facile de travailler qu'avec Minikube, en particulier sur macOS, et en particulier lorsqu'il s'agit de problèmes tels que RBAC, Helm, hypervisor, registre privé, etc.
En ce qui concerne la distribution de votre code et l'extraction locale des mises à jour, Helm est l'une des options les plus populaires. Vous pouvez publier vos applications via CI/CD sous forme de graphiques Helm (ainsi que les images Docker sous-jacentes auxquelles elles font référence). Ensuite, vous pouvez extraire ces graphiques de votre registre de cartes Helm localement et les mettre à niveau sur votre cluster local.
Vous pouvez également utiliser un outil tel que Azure Draft pour effectuer de simples déploiements locaux et générer des diagrammes Helm de base à partir de modèles de langage courants, un peu comme des packages de construction, pour automatiser cette pièce du puzzle.
Skaffold est comme Azure Draft mais plus mature, de portée beaucoup plus large, et faite par Google. Il a une architecture très connectable. Je pense qu'à l'avenir, plus de gens l'utiliseront pour le développement d'applications locales pour Kubernetes.
Si vous avez utilisé React, je pense à Skaffold en tant que " Créer une application React pour Kubernetes".
Docker Compose , sans aucun lien avec Kubernetes, est une solution alternative utilisée par certaines entreprises pour fournir un environnement de développement local simple, facile et portable, analogue à l’environnement Kubernetes qu’elles utilisent en production. Cependant, cette voie signifie une divergence entre vos configurations de production et de développement local.
Kompose est un convertisseur Docker Compose to Kubernetes. Cela pourrait être un chemin utile pour quelqu'un qui exécute déjà ses applications en tant que collections de conteneurs localement.
Compose on Kubernetes est une offre récemment ouverte (décembre 2018) de Docker permettant de déployer des fichiers Docker Compose directement sur un cluster Kubernetes via un contrôleur personnalisé.
Kubespary est utile pour configurer des clusters locaux. La plupart du temps, j'ai utilisé un cluster basé sur vagrant sur une machine locale.
Configuration de Kubespray .__ Vous pouvez modifier ces variables pour obtenir la version de kubernetes souhaitée.
Jetez un oeil à https://github.com/okteto/okteto et Okteto Cloud . La proposition de valeur est de disposer de l’expérience de développement classique plutôt que de travailler localement, avant Docker, où vous pouvez effectuer des rechargements à chaud, des versions incrémentielles, des débogueurs, etc. Cependant, toutes vos modifications locales sont immédiatement synchronisées sur un conteneur distant. Les conteneurs distants vous donnent accès à la vitesse du cloud, permettent un nouveau niveau de collaboration et intègrent le développement dans un environnement de production. En outre, il élimine le fardeau des installations locales.
Comme spécifié précédemment par Robert, minikube est la voie à suivre.
Ici est un guide rapide pour démarrer avec minikube. Les étapes générales sont les suivantes:
Installer un minikube
Créer un cluster de minikube (dans une machine virtuelle pouvant être VirtualBox ou Docker pour Mac ou HyperV sous Windows)
Créer une image Docker de votre fichier d'application (à l'aide de Dockerfile)
Exécuter l'image en créant un déploiement
Créez un service qui expose votre application afin que vous puissiez y accéder.
Vous pouvez utiliser "portainer" à des fins de développement. C'est facile et ne nécessite pas de se souvenir de la commande ou du manifeste yaml.
L'inconvénient de l'utilisation de minkube
est qu'il engendre une autre machine virtuelle sur votre machine. De plus, avec la dernière version minikube
, il faut au minimum disposer de 2 processeurs et de RAM sur votre système, ce qui le rend assez lourd si le système ne dispose pas de suffisamment de ressources.
C'est la raison pour laquelle je suis passé à microk8s
pour le développement sur kubernetes et j'adore ça. microk8s
prend en charge le DNS, le stockage local, le tableau de bord, l'istio, l'entrée et bien plus encore, tout ce dont vous avez besoin pour tester vos microservices.
Il est conçu pour être une installation Kubernetes en amont rapide et légère, isolée de votre environnement local. Cet isolement est obtenu en regroupant tous les fichiers binaires de Kubernetes, Docker.io, iptables et CNI dans un seul composant logiciel enfichable.
Un cluster kubernetes à un seul noeud peut être installé en une minute avec une seule commande:
snap install microk8s --classic
Assurez-vous qu'aucun service docker ou kubelet n'est en cours d'exécution sur votre système. Microk8s
installera automatiquement tous les services requis.
Veuillez consulter le lien suivant pour activer d'autres add-ons dans microk8s
.
Vous pouvez vérifier le statut en utilisant:
velotio@velotio-ThinkPad-E470:~/PycharmProjects/k8sClient$ microk8s.status
microk8s is running
addons:
ingress: disabled
dns: disabled
metrics-server: disabled
istio: disabled
gpu: disabled
storage: disabled
dashboard: disabled
registry: disabled
Vous pouvez utiliser un cluster kubernetes distant et configurer vos machines locales pour vous connecter à ce cluster. Utilisez les commandes kubectl cp pour copier le code dans les pods en cours d’exécution afin de le recharger à chaud pendant le développement.