web-dev-qa-db-fra.com

Comment créer un environnement de développement local pour Kubernetes?

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:

  • Déployé localement (ou au moins quelque part où vous et seulement vous pouvez accéder à)
  • Utilisez latest source code lors de l'actualisation de la page (si c'est un site Web; idéalement, actualisez automatiquement la page lors de l'enregistrement d'un fichier local, ce qui peut être fait si vous montez le code source et utilisez des éléments tels que Yeoman ).

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?

94
Wernight

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. 

58
Robert Bailey

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

7
Itamar

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
5
Clayton

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.

4
Ignacio Millán

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

  • configuration rapide et sans douleur
  • facile à détruire/recréer la machine
  • limite implicite sur les ressources
  • possibilité de tester la mise à l'échelle horizontale en créant plusieurs nœuds

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

  • variables env définissant explicitement l'environnement (dev/stage/prod)
  • nombre de répliques
  • devstable, stage, prod utilise des images docker
  • dev utilise des images fixes et mappe le dossier NFS avec le code source dessus.

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.

4
analytik

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
2
akshayl

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 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.

Barre

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.

Azure Draft

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.

Échafaudage

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".

Kompose ou Compose sur 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é.

2
Taylor Edmiston

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.

1
YAP

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.

1

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.

0
Rafa

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.

0
hk'

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.

https://github.com/ubuntu/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
0
Prafull Ladha

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.

0
Rajith