Kubernetes lance les outils de développement d'applications



Une approche moderne de l'exploitation résout de nombreux problèmes commerciaux urgents. Les conteneurs et les orchestrateurs facilitent la mise à l'échelle de projets de toute complexité, simplifient la publication de nouvelles versions, les rendent plus fiables, mais créent en même temps des problèmes supplémentaires pour les développeurs. Le programmeur, tout d'abord, se soucie de son code: architecture, qualité, performances, élégance, et non pas comment il ira à Kubernetes et comment le tester et le déboguer après avoir effectué même les plus petits changements. Par conséquent, il est assez logique que les outils pour Kubernetes se développent activement, aidant à résoudre les problèmes des développeurs même les plus «archaïques» et leur permettant de se concentrer sur l'essentiel.

Cette revue fournit un résumé de certains outils qui facilitent la vie d'un programmeur dont le code tourne dans le cluster pod'ax Kubernetes.

Aides simples


Kubectl-debug


  • L'essentiel: ajoutez votre conteneur au Pod et voyez ce qui s'y passe .
  • Github
  • Brèves statistiques GH: 715 étoiles, 54 commits, 9 contributeurs.
  • Langue: Allez.
  • Licence: Apache License 2.0.

Ce plugin pour kubectl vous permet de créer un conteneur supplémentaire à l'intérieur du pod qui vous intéresse, qui partagera l'espace de noms du processus avec le reste des conteneurs. Il est possible de déboguer le travail du pod en son sein: vérifier le réseau, écouter le trafic réseau, faire un suivi du processus d'intérêt, etc.

Vous pouvez également basculer vers le conteneur de processus en exécutant chroot /proc/PID/root - cela est très pratique lorsque vous devez obtenir le shell racine dans le conteneur pour lequel securityContext.runAs défini dans le manifeste.

L'outil est simple et efficace, il peut donc être utile à tous les développeurs. Nous en avons écrit plus dans un article séparé .

Téléprésence


  • L'essentiel: transférez l'application sur votre ordinateur. Développer et déboguer localement .
  • Site ; Github
  • Statistiques brèves GH: 2131 étoiles, 2712 commits, 33 contributeurs.
  • Langue: Python.
  • Licence: Apache License 2.0.

L'idée de ce composant logiciel enfichable est de lancer le conteneur avec l'application sur l'ordinateur utilisateur local et de proxy tout le trafic du cluster vers lui et vice versa. Cette approche vous permet de mener le développement localement, en changeant simplement les fichiers dans votre IDE préféré: les résultats seront disponibles immédiatement.

Les avantages du lancement local sont la commodité de l'édition et des résultats instantanés, la possibilité de déboguer l'application de la manière habituelle. Parmi les inconvénients est la vitesse exigeante de la connexion, qui est particulièrement visible lorsque vous devez travailler avec une application avec un RPS et un trafic assez élevés. De plus, Telepresence a des problèmes avec les montages de volume sur Windows, ce qui pourrait être un limiteur décisif pour les développeurs habitués à ce système d'exploitation.

Nous avons déjà partagé notre expérience en utilisant la téléprésence ici .

Ksync


  • L'essentiel: une synchronisation de code presque instantanée avec le conteneur du cluster .
  • Github
  • Brèves statistiques GH: 555 étoiles, 362 commits, 11 contributeurs.
  • Langue: Allez.
  • Licence: Apache License 2.0.

L'utilitaire vous permet de synchroniser le contenu du répertoire local avec le répertoire du conteneur exécuté dans le cluster. Un tel outil est parfait pour les développeurs de langages de programmation de script dont le problème principal est de livrer le code à un conteneur de travail. Ksync vise à soulager ce mal de tête.

Une fois initialisé une fois avec la commande ksync init , un ksync init est créé dans le cluster, qui est utilisé pour surveiller l'état du système de fichiers du conteneur sélectionné. Sur son ordinateur local, le développeur exécute la ksync watch , qui surveille les configurations et exécute la synchronisation , qui synchronise directement les fichiers avec le cluster.

Il reste à indiquer à ksync avec quoi se synchroniser et avec quoi. Par exemple, une commande comme celle-ci:

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

... créera un observateur appelé myproject , qui recherchera un pod avec l'étiquette app=backend et essaiera de synchroniser le répertoire local /home/user/myproject/ avec le répertoire /var/www/myproject/ dans le conteneur appelé php .

Problèmes et notes sur ksync d'après notre expérience:

  • Sur les nœuds du cluster Kubernetes, overlay2 doit être utilisé comme pilote de stockage pour Docker. L'utilitaire ne fonctionnera avec aucun autre.
  • Lorsque vous utilisez Windows comme système d'exploitation client, le système de fichiers de surveillance peut ne pas fonctionner correctement. Ce bogue a été remarqué lors de l'utilisation de répertoires volumineux - avec un grand nombre de pièces jointes et de répertoires. Nous avons créé un problème correspondant dans le projet de synchronisation, mais jusqu'à présent, aucun progrès n'a été enregistré (depuis début juillet).
  • Utilisez le fichier .stignore pour spécifier des chemins ou des modèles de fichiers qui n'ont pas besoin d'être synchronisés (par exemple, les .git app/cache et .git ).
  • Par défaut, ksync rechargera le conteneur à chaque modification des fichiers. C'est pratique pour Node.js, mais complètement redondant pour PHP. Il est préférable de désactiver opcache et d'utiliser l'indicateur --reload=false .
  • La configuration peut toujours être corrigée dans $HOME/.ksync/ksync.yaml .

Courge


  • L'essentiel: déboguer les processus directement dans le cluster .
  • Github
  • Brèves statistiques GH: 1154 étoiles, 279 commits, 23 contributeurs.
  • Langue: Allez.
  • Licence: Apache License 2.0.

Cet outil est destiné au débogage des processus directement dans les pods. L'utilitaire est simple et interactif vous permet de sélectionner le débogueur souhaité (voir ci-dessous) et l'espace de noms + pod, dans lequel vous devez intervenir. Actuellement pris en charge:

  • delve - pour les applications sur Go;
  • GDB - à travers la redirection cible + le port;
  • Redirection de port JDWP pour le débogage des applications Java.

De la part de l'IDE, le support n'est disponible que dans VScode (à l'aide d'une extension ), cependant, les plans pour l'année en cours (2019) incluent Eclipse et Intellij.

Pour déboguer des processus, Squash exécute un conteneur privilégié sur les nœuds du cluster, vous devez donc d'abord vous familiariser avec les capacités du mode sans échec afin d'éviter les problèmes de sécurité.

Solutions intégrées


Nous nous tournons vers l'artillerie lourde - des projets plus "à grande échelle" conçus pour combler immédiatement de nombreux besoins des développeurs.

NB : Notre liste a certainement une place dans notre utilitaire Open Source werf (anciennement connu sous le nom de dapp). Cependant, nous en avons écrit et parlé plus d'une fois, et avons donc décidé de ne pas l'inclure dans la revue. Pour ceux qui souhaitent se familiariser avec ses capacités, nous recommandons de lire / écouter le rapport « werf - notre outil pour CI / CD dans Kubernetes ».

Devspace


  • L' essentiel : pour ceux qui veulent commencer à travailler chez Kubernetes, mais ne veulent pas pénétrer profondément dans sa jungle .
  • Github
  • Brèves statistiques GH: 630 étoiles, 1912 commits, 13 contributeurs.
  • Langue: Allez.
  • Licence: Apache License 2.0.

La solution provient d'une entreprise du même nom qui fournit des clusters gérés avec Kubernetes pour le développement d'équipe. L'utilitaire a été créé pour les clusters commerciaux, mais il fonctionne très bien avec les autres.

Lorsque vous exécutez la commande devspace init dans le répertoire avec le projet, ils vous proposeront (en mode interactif):

  • sélectionner un cluster Kubernetes fonctionnel,
  • utiliser le Dockerfile existant (ou en générer un nouveau) pour créer un conteneur à partir de celui-ci,
  • choisissez un référentiel pour stocker les images de conteneurs, etc.

Après toutes ces étapes préparatoires, vous pouvez démarrer le développement en exécutant la commande devspace dev . Il va collecter le conteneur, le télécharger dans le référentiel, déployer le déploiement sur le cluster et démarrer la redirection de port et synchroniser le conteneur avec le répertoire local.

Il sera éventuellement proposé de se rendre au conteneur par le terminal. Vous ne devez pas refuser, car en réalité le conteneur commence par la commande sleep, et pour de vrais tests, l'application doit être démarrée manuellement.

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

La configuration complète du projet est stockée dans le fichier devspace.yaml . En plus des paramètres d'environnement pour le développement, vous y trouverez une description de l'infrastructure, similaire aux manifestes Kubernetes standard, seulement grandement simplifiée.


Architecture et jalons avec DevSpace

De plus, il est facile d'ajouter un composant prédéfini (par exemple, un SGBD MySQL) ou un graphique Helm à un projet. En savoir plus dans la documentation - c'est simple.

Skaffold


  • Site ; Github
  • Brèves statistiques GH: 7423 étoiles, 4173 commits, 136 contributeurs.
  • Langue: Allez.
  • Licence: Apache License 2.0.

Cet utilitaire de Google prétend couvrir tous les besoins d'un développeur dont le code s'exécutera en quelque sorte dans un cluster Kubernetes. Commencer à l'utiliser n'est pas aussi simple que devspace: on ne vous proposera aucune interactivité, définition de langage ou Dockerfile automatique Dockerfile .

Cependant, si cela ne fait pas peur - voici ce que Skaffold vous permet de faire:

  • Suivez les modifications du code source.
  • Synchronisez-le avec le conteneur de pod s'il ne nécessite pas d'assemblage.
  • Collectez les conteneurs avec le code si le langage est interprété, ou compilez des artefacts et placez-les dans des conteneurs.
  • Les images résultantes sont automatiquement vérifiées à l'aide de container-structure-test .
  • Balisez et téléchargez des images dans le Docker Registry.
  • Déployez une application dans un cluster à l'aide de kubectl, Helm ou kustomize.
  • Faites la redirection de port.
  • Déboguer les applications écrites en Java, Node.js, Python.

Le workflow dans diverses variantes est décrit de manière déclarative dans le fichier skaffold.yaml . Pour un projet, vous pouvez également définir plusieurs profils dans lesquels modifier partiellement ou complètement les étapes d'assemblage et de déploiement. Par exemple, pour le développement, spécifiez une image de base qui convient au développeur, ainsi que pour la mise en scène et la production - le minimum (+ utilisez securityContext pour les conteneurs ou redéfinissez le cluster dans lequel l'application sera déployée).

Les conteneurs Docker peuvent être créés 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 balisage, Skaffold prend en charge de nombreuses stratégies: par git commit hash, date / time, sha256 sum of sources, etc.

Séparément, il convient de noter la possibilité de tester les conteneurs. Le cadre de test de structure de conteneur déjà mentionné offre les méthodes de vérification suivantes:

  • Exécution de commandes dans le contexte du conteneur avec suivi des états de sortie et vérification du texte "exhaust" de la commande.
  • Vérification de la présence de fichiers dans le conteneur et des attributs correspondants spécifiés.
  • Contrôle des expressions régulières du contenu des fichiers.
  • Vérification des métadonnées d'image ( ENV , ENTRYPOINT , VOLUMES , etc.).
  • Vérifiez la compatibilité des licences.

Les fichiers ne sont pas synchronisés avec le conteneur de la manière 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é). Par conséquent, si votre tâche principale est de synchroniser le code, il est préférable de rechercher une solution spécialisée (ksync).


Jalons à Skaffold

En général, l'outil ne permet pas l'abstraction des manifestes Kubernetes et n'a aucune interactivité, il peut donc sembler difficile à maîtriser. Mais c'est aussi son plus - une grande liberté d'action.

Jardin


  • Site ; Github
  • Statistiques brèves GH: 1063 étoiles, 1927 commits, 17 contributeurs.
  • Langage: TypeScript (il est prévu de diviser le projet en plusieurs composants, dont certains seront sur Go, ainsi que de créer un SDK pour créer des modules complémentaires sur TypeScript / JavaScript et Go) .
  • Licence: Apache License 2.0.

Comme Skaffold, Garden vise à automatiser le processus de livraison du code d'application au cluster K8s. Pour ce faire, vous devez d'abord décrire la structure du projet dans un fichier YAML, puis exécuter la commande garden dev . Elle fera toute la magie:

  • Collectera des conteneurs avec diverses parties du projet.
  • Effectuer des tests d'intégration et unitaires, le cas échéant.
  • Déploie tous les composants du projet dans le cluster.
  • Si le code source change, il redémarrera tout le pipeline.

Lors de l'utilisation de cet outil, l'objectif principal est le partage d'un cluster distant par une équipe de développeurs. Dans ce cas, si certaines étapes d'assemblage et de test ont déjà été effectuées, cela accélérera considérablement l'ensemble du processus, car Garden pourra utiliser les résultats mis en cache.

Un module de projet peut être un conteneur, un conteneur Maven, un graphique Helm, un manifeste pour kubectl apply ou même une fonction OpenFaaS. Et chacun des modules peut être extrait d'un référentiel Git distant. Un module peut déterminer (ou non) des services, des tâches et des tests. Les services et les tâches peuvent avoir des dépendances, vous pouvez donc déterminer la séquence de déploiement d'un service, organiser le lancement des tâches et des tests.

Garden fournit à l'utilisateur un magnifique tableau de bord (toujours à l' état expérimental ) dans lequel le graphique du projet est affiché: composants, séquence d'assemblage, tâches et tests, leurs relations et dépendances. Directement dans le navigateur, vous pouvez également afficher les journaux de tous les composants du projet, vérifier ce que tel ou tel composant affiche via HTTP (sauf, bien sûr, si la ressource d'entrée est déclarée pour cela).


Panneau pour jardin

Cet outil dispose également d'un mode de rechargement à chaud, qui synchronise simplement les modifications de script avec le conteneur dans le cluster, accélérant plusieurs fois le processus de débogage d'application. Garden a une bonne documentation et un bon ensemble d'exemples pour démarrer rapidement et commencer à utiliser. Soit dit en passant, plus récemment, nous avons publié une traduction de l'article de ses auteurs.

Conclusion


Bien sûr, la liste des outils de développement et de débogage d'applications dans Kubernetes n'est pas limitée. Il existe de nombreux autres utilitaires très utiles et pratiques dignes, sinon d'un article séparé, alors - du moins - mentionnés. Dites-nous ce que vous utilisez, quels problèmes vous avez rencontrés et comment vous les avez résolus!

PS


Lisez aussi dans notre blog:

Source: https://habr.com/ru/post/fr462707/


All Articles