Outils pour les développeurs d'applications exécutées dans Kubernetes

Outils pour les développeurs d'applications exécutées dans Kubernetes

L'approche moderne en matière d'exploitation résout de nombreux problèmes urgents pour les entreprises. Les conteneurs et les orchestrateurs permettent de faire évoluer facilement des projets de toute complexité, facilitent les déploiements de nouvelles versions, les rendant plus fiables, mais en même temps créent également des problèmes supplémentaires pour les développeurs. Ce qui préoccupe principalement un programmeur, c'est son code : l'architecture, la qualité, la performance, l'élégance, et non pas comment cela fonctionnera dans Kubernetes ou comment le tester et le déboguer après avoir effectué même des corrections mineures. Il est donc tout à fait logique que des outils pour Kubernetes se développent activement, aidant à résoudre les problèmes même des développeurs les plus « archaïques » et leur permettant de se concentrer sur l'essentiel.

Cet aperçu présente des informations brèves sur certains outils qui facilitent la vie des programmeurs dont le code s'exécute dans les pods d'un cluster Kubernetes.

Aides simples

Kubectl-debug

  • Essence : ajoutez votre conteneur au pod et voyez ce qui s'y passe.
  • GitHub.
  • Statistiques brèves GH : 715 étoiles, 54 commits, 9 contributeurs.
  • Langage : Go.
  • Licence : Apache License 2.0.

Ce plugin pour kubectl permet de créer à l'intérieur du pod ciblé un conteneur supplémentaire qui partagera l'espace de noms de processus avec les autres conteneurs. Il permet de déboguer le fonctionnement du pod : vérifier le réseau, écouter le trafic réseau, exécuter un strace sur le processus cible, etc.

Vous pouvez également basculer dans le conteneur du processus en exécutant chroot /proc/PID/root — cela peut être très pratique lorsque vous avez besoin d'obtenir un shell root dans un conteneur pour lequel le manifeste est configuré avec securityContext.runAs.

L'outil est simple et efficace, donc il peut être utile à chaque développeur. Nous en avons parlé plus en détail dans un article séparé.

Telepresence

  • Essence : déplacez l'application sur votre ordinateur. Développez et déboguez localement.
  • Site; GitHub.
  • Statistiques brèves GH : 2131 étoiles, 2712 commits, 33 contributeurs.
  • Langage : Python.
  • Licence : Apache License 2.0.

L'idée de cet outil est de lancer un conteneur avec l'application sur l'ordinateur utilisateur local et de faire passer tout le trafic du cluster vers celui-ci et vice versa. Cette approche permet de développer localement simplement en modifiant les fichiers dans votre IDE préféré : les résultats seront disponibles immédiatement.

Les avantages du lancement local incluent la facilité des modifications et le résultat instantané, ainsi que la possibilité de déboguer l'application de manière familière. En revanche, les inconvénients incluent des exigences élevées en matière de vitesse de connexion, ce qui est particulièrement perceptible lorsque l'on travaille avec une application ayant un RPS et un trafic suffisamment élevés. De plus, Telepresence présente des problèmes avec les volumes docker sous Windows, ce qui peut devenir un obstacle décisif pour les développeurs habitués à ce système d'exploitation.

Nous avons déjà partagé notre expérience d'utilisation de Telepresence ici.

Ksync

  • Essence : synchronisation presque instantanée du code avec le conteneur dans le cluster.
  • GitHub.
  • Statistiques brèves de GH : 555 étoiles, 362 commits, 11 contributeurs.
  • Langage : Go.
  • Licence : Apache License 2.0.

Cet utilitaire permet de synchroniser le contenu d'un répertoire local avec le répertoire d'un conteneur exécuté dans le cluster. Cet outil est particulièrement adapté aux développeurs utilisant des langages de script, dont le principal problème est de livrer le code dans un conteneur opérationnel. Ksync est conçu pour éliminer ce tracas.

Avec une initialisation unique via la commande ksync init un DaemonSet est créé dans le cluster, utilisé pour suivre l'état du système de fichiers du conteneur sélectionné. Sur son ordinateur local, le développeur exécute la commande ksync watch, qui surveille les configurations et lance syncthing, qui effectue la synchronisation directe des fichiers avec le cluster.

Il ne reste plus qu'à instruire ksync sur ce qu'il faut synchroniser et avec quoi. Par exemple, cette commande :

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

... créera un watcher nommé myproject, qui recherchera un pod avec l'étiquette app=backend et tentera de synchroniser le répertoire local /home/user/myproject/ avec le répertoire /var/www/myproject/ du conteneur nommé php.

Problèmes et remarques sur ksync de notre expérience :

  • Les nœuds du cluster Kubernetes doivent utiliser overlay2 comme driver de stockage pour Docker. Aucun autre utilitaire ne fonctionnera.
  • Lors de l'utilisation de Windows comme système d'exploitation client, un fonctionnement incorrect du watcher du système de fichiers peut survenir. Ce bug a été remarqué lors de la manipulation de grands répertoires — avec un grand nombre de fichiers et de sous-répertoires. Nous avons créé un problème associé dans le projet syncthing, mais il n'y a pas eu de progrès à ce jour (début juillet).
  • Utilisez le fichier .stignore pour spécifier les chemins ou les modèles de fichiers à ne pas synchroniser (par exemple, les répertoires app/cache et .git).
  • Par défaut, ksync redémarrera le conteneur à chaque modification de fichier. Pour Node.js, c'est pratique, mais pour PHP, c'est complètement inutile. Il vaut mieux désactiver opcache et utiliser le drapeau --reload=false.
  • La configuration peut toujours être corrigée dans $HOME/.ksync/ksync.yaml.

Squash

  • Essence : débugger les processus directement dans le cluster.
  • GitHub.
  • Statistiques succinctes de GH : 1154 étoiles, 279 commits, 23 contributeurs.
  • Langage : Go.
  • Licence : Apache License 2.0.

Cet outil est conçu pour le débogage des processus directement dans les pod. L'utilitaire est simple et permet en mode interactif de choisir le débogueur (voir ci-dessous) et l’espace de noms + le pod, dans le processus duquel il faut intervenir. Actuellement, sont pris en charge :

  • delve — pour les applications en Go ;
  • GDB — via target remote + redirection de port ;
  • redirection de port JDWP pour le débogage des applications Java.

Du côté IDE, le support existe seulement dans VScode (avec les extensions), mais pour l'année en cours (2019) sont prévus Eclipse et Intellij.

Pour déboguer des processus, Squash lance un conteneur privilégié sur les nœuds du cluster, il est donc nécessaire de se familiariser d'abord avec les capacités du mode sécurisé afin d'éviter des problèmes de sécurité.

Solutions complexes

Passons à l'artillerie lourde — des projets plus 'scalables' destinés à répondre simultanément à de nombreux besoins des développeurs.

NB: Cette liste inclut sans aucun doute notre utilitaire Open Source werf (anciennement connu sous le nom de dapp). Cependant, nous avons déjà écrit et parlé à plusieurs reprises à son sujet, et nous avons donc décidé de ne pas l'inclure dans cet aperçu. Pour ceux qui souhaitent en savoir plus sur ses fonctionnalités, nous recommandons de lire/écouter la présentation «werf — notre outil pour CI/CD dans Kubernetes».

DevSpace

  • Essence : pour ceux qui souhaitent commencer à travailler avec Kubernetes, mais ne veulent pas s'enfoncer profondément dans ses méandres.
  • GitHub.
  • Statistiques succinctes de GH : 630 étoiles, 1912 commits, 13 contributeurs.
  • Langage : Go.
  • Licence : Apache License 2.0.

Solution de la société éponyme, fournissant des clusters gérés avec Kubernetes pour le développement en équipe. L'utilitaire a été conçu pour des clusters commerciaux, mais fonctionne parfaitement avec n'importe quel autre.

Lors de l'exécution de la commande devspace init dans le répertoire du projet, vous serez invité (en mode interactif) :

  • à choisir un cluster Kubernetes actif,
  • à utiliser l'existant Dockerfile (ou à en générer un nouveau) pour créer un conteneur basé sur celui-ci,
  • à choisir un dépôt pour stocker les images de conteneurs, etc.

Après toutes ces étapes préparatoires, vous pouvez commencer le développement en exécutant la commande devspace dev. Cela rassemblera le conteneur, le téléchargera dans le dépôt, déploiera l'application dans le cluster et lancera le redirectionnement des ports ainsi que la synchronisation du conteneur avec le répertoire local.

Il vous sera proposé en option d'entrer dans le conteneur via le terminal. Il vaut mieux ne pas décliner cette option, car en réalité, le conteneur démarre avec la commande sleep, et pour un test réel, l'application doit être lancée manuellement.

Enfin, la commande devspace deploy déploie l'application et l'infrastructure associée dans le cluster, après quoi tout commence à fonctionner en mode production.

Toute la configuration du projet est sauvegardée dans le fichier devspace.yaml. En plus des réglages de l'environnement de développement, vous y trouverez également une description de l'infrastructure, ressemblant à des manifestes Kubernetes standards, mais fortement simplifiés.

Outils pour les développeurs d'applications exécutées dans Kubernetes
Architecture et étapes clés de travail avec DevSpace

De plus, il est facile d'ajouter un composant prédéfini au projet (comme une base de données MySQL) ou un Helm chart. Pour plus de détails, lisez documentation — ce n'est pas compliqué.

Skaffold

  • Site; GitHub.
  • Statistiques succinctes sur GH : 7423 étoiles, 4173 commits, 136 contributeurs.
  • Langage : Go.
  • Licence : Apache License 2.0.

Cet outil de Google vise à couvrir tous les besoins d'un développeur dont le code sera d'une manière ou d'une autre exécuté dans un cluster Kubernetes. Il n'est pas aussi simple de l'utiliser que devspace : aucune interactivité, pas de définition de langage et pas de création automatique Dockerfile ceci ne vous sera pas proposé ici.

Cependant, si cela ne vous effraie pas, voici ce que Skaffold permet de faire :

  • Surveiller les changements dans le code source.
  • Synchroniser le code avec le conteneur du pod, si une compilation n'est pas nécessaire.
  • Construire des conteneurs avec le code si le langage de programmation est interprété, ou compiler des artefacts et les emballer dans des conteneurs.
  • Vérifier automatiquement les images générées à l'aide de container-structure-test.
  • Taguer et télécharger les images dans le Docker Registry.
  • Déployer l'application dans le cluster en utilisant kubectl, Helm ou kustomize.
  • Faire du redirectionnement de ports.
  • Déboguer des applications écrites en Java, Node.js, Python.

Le flux de travail dans diverses variations est décrit de manière déclarative dans le fichier skaffold.yaml. Pour le projet, plusieurs profils peuvent également être définis, où les étapes de construction et de déploiement peuvent être partiellement ou totalement modifiées. Par exemple, pour le développement, spécifiez une image de base confortable pour le développeur, tandis que pour le staging et la production, une image minimale peut être utilisée (+ utiliser securityContext des conteneurs ou redéfinir le cluster dans lequel l'application sera déployée).

La construction des conteneurs Docker peut être effectuée localement ou à distance : dans Google Cloud Build ou dans un cluster à l'aide de Kaniko. Bazel et Jib Maven/Gradle sont également pris en charge. Pour le tagging, Skaffold supporte de nombreuses stratégies : par hash de commit git, date/heure, somme sha256 des sources, etc.

Il convient également de noter la possibilité de tester les conteneurs. Le framework mentionné précédemment, container-structure-test, propose les méthodes de vérification suivantes :

  • Exécution de commandes dans le contexte du conteneur avec suivi des codes de sortie et vérification de la sortie textuelle de la commande.
  • Vérification de la présence de fichiers dans le conteneur et de la conformité des attributs spécifiés.
  • Contrôle du contenu des fichiers via des expressions régulières.
  • Comparaison des métadonnées de l'image (ENV, ENTRYPOINT, VOLUMES etc.).
  • Vérification de la compatibilité des licences.

La synchronisation des fichiers avec le conteneur n'est pas la méthode la plus optimale : Skaffold crée simplement une archive avec les sources, la copie et la décompresse dans le conteneur (tar doit être installé). Donc, si votre tâche principale est la synchronisation du code, il est préférable de regarder vers une solution spécialisée (ksync).

Outils pour les développeurs d'applications exécutées dans Kubernetes
Les principales étapes de fonctionnement de Skaffold

Dans l'ensemble, l'outil ne permet pas de s'abstraire des manifests Kubernetes et n'a pas d'interactivité, ce qui peut le rendre difficile à maîtriser. Mais c'est également son avantage - une plus grande liberté d'action.

Garden

  • Site; GitHub.
  • Statistiques succinctes sur GH : 1063 étoiles, 1927 commits, 17 contributeurs.
  • Langage : TypeScript (il est prévu de diviser le projet en plusieurs composants, dont certains seront en Go, ainsi que de créer un SDK pour le développement d'extensions en TypeScript/JavaScript et Go).
  • Licence : Apache License 2.0.

Tout comme Skaffold, Garden vise à automatiser les processus de livraison du code de l'application vers le cluster K8s. Pour cela, il est d'abord nécessaire de décrire la structure du projet dans un fichier YAML, puis de lancer la commande garden dev. Cela fera toute la magie :

  • Construire des conteneurs avec différentes parties du projet.
  • Effectuer des tests d'intégration et unitaires, si ceux-ci ont été décrits.
  • Déploie tous les composants du projet dans le cluster.
  • En cas de modification du code source, relancera l'ensemble du pipeline.

L'accent est mis sur le partage collaboratif d'un cluster distant par l'équipe de développeurs lors de l'utilisation de cet outil. Dans ce cas, si certaines étapes de compilation et de test ont déjà été effectuées, cela accélérera considérablement tout le processus, car Garden pourra utiliser les résultats mis en cache.

Le module du projet peut être un conteneur, un conteneur Maven, un chart Helm, un manifeste pour kubectl apply ou même une fonction OpenFaaS. De plus, n'importe quel module peut être tiré d'un référentiel Git distant. Le module peut définir (ou non) des services, des tâches et des tests. Les services et les tâches peuvent avoir des dépendances, ce qui permet de définir l'ordre de déploiement de chaque service, d'organiser le lancement des tâches et des tests.

Garden offre à l'utilisateur un joli tableau de bord (pour l'instant en état expérimental), qui affiche le graphique du projet : les composants, l'ordre de compilation, l'exécution des tâches et des tests, ainsi que leurs relations et dépendances. Dans le navigateur, vous pouvez également consulter les journaux de tous les composants du projet, vérifier ce que renvoie tel ou tel composant via HTTP (s'il y a bien une ressource ingress déclarée pour cela).

Outils pour les développeurs d'applications exécutées dans Kubernetes
Le panneau pour Garden

Cet outil dispose également d'un mode de rechargement à chaud, qui synchronise simplement les modifications des scripts avec le conteneur dans le cluster, accélérant considérablement le processus de débogage de l'application. Garden offre un bon documentation ensemble correct d'exemples , permettant de se familiariser rapidement et de commencer à l'utiliser. D'ailleurs, nous avons tout récemment publiéla traduction d'un article de ses auteurs. Évidemment, cette liste d'outils pour le développement et le débogage d'applications dans Kubernetes n'est pas exhaustive. Il existe encore de nombreux utilitaires très utiles et pratiques, dignes non seulement d'un article à part, mais au minimum d'une mention. Dites-nous quels outils vous utilisez, quels problèmes vous avez rencontrés et comment vous les avez résolus !

Conclusion

Garden v0.10.0 : Votre ordinateur portable n'a pas besoin de Kubernetes

P.S.

Lisez aussi dans notre blog :

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster