Revue Skaffold pour le développement de Kubernetes



Il y a un an et demi, le 5 mars 2018, Google a publiĂ© la premiĂšre version alpha de son projet Open Source pour CI / CD appelĂ© Skaffold , dont l'objectif Ă©tait de crĂ©er un «dĂ©veloppement simple et reproductible pour Kubernetes» afin que les dĂ©veloppeurs puissent se concentrer spĂ©cifiquement sur le dĂ©veloppement, et pas sur l'administration. Qu'est-ce qui pourrait intĂ©resser Skaffold? En fin de compte, il a quelques atouts dans sa manche, grĂące auxquels il peut devenir un outil puissant pour un dĂ©veloppeur, et peut-ĂȘtre un ingĂ©nieur d'exploitation. Nous prendrons connaissance du projet et de ses capacitĂ©s.

NB : Au fait, nous avons déjà parlé briÚvement de Skaffold dans notre aperçu général des outils pour les développeurs dont la vie est liée à Kubernetes.

Théorie Objectif et fonctionnalités


Donc, d'une maniÚre générale, Skaffold résout le problÚme de l'automatisation du cycle CI / CD (aux étapes de la construction, de la transmission, du déploiement), en offrant au développeur un retour d'information rapide, c'est-à-dire la possibilité d'obtenir rapidement le résultat des prochaines modifications de code - sous la forme d'une application mise à jour exécutée dans le cluster Kubernetes. Et il peut fonctionner dans différents contours (développement, stade, production ...), pour lesquels Skaffold aide à décrire les pipelines appropriés pour le déploiement.

Le code source de Skaffold est écrit en Go et est distribué sous la licence gratuite Apache 2.0 ( GitHub ).

Considérez les principales fonctions et caractéristiques. Les premiers comprennent les éléments suivants:

  • Skaffold propose des outils pour crĂ©er des pipelines CI / CD.
  • Vous permet de surveiller les modifications du code source en arriĂšre-plan et de dĂ©marrer le processus automatisĂ© de crĂ©ation de code dans des images de conteneur, de publication de ces images dans le Docker Registry et de les dĂ©ployer sur le cluster Kubernetes.
  • Synchronise les fichiers du rĂ©fĂ©rentiel avec le rĂ©pertoire de travail du conteneur.
  • Teste automatiquement Ă  l'aide de container-structure-test.
  • Transmet les ports.
  • Lit les journaux de l'application en cours d'exĂ©cution dans le conteneur.
  • Aide au dĂ©bogage d'applications Ă©crites en Java, Node.js, Python, Go.

Maintenant sur les fonctionnalités:

  • Skaffold lui-mĂȘme n'a pas de composants cĂŽtĂ© cluster . Autrement dit, vous n'avez pas besoin de configurer en plus Kubernetes pour utiliser cet utilitaire.
  • DiffĂ©rents pipelines pour votre application . Besoin de dĂ©ployer le code dans le minikube local pendant que vous dĂ©veloppez, puis sur scĂšne ou en production? Pour ce faire, des profils et des configurations utilisateur, des variables d'environnement et des indicateurs sont fournis, qui vous permettent de dĂ©crire diffĂ©rents pipelines pour une application.
  • CLI Uniquement utilitaire et configurations de console en YAML. Sur le rĂ©seau, vous pouvez trouver des rĂ©fĂ©rences Ă  des tentatives de crĂ©ation d'une interface graphique expĂ©rimentale , mais pour le moment, cela signifie probablement que quelqu'un en a besoin, mais pas vraiment.
  • ModularitĂ© . Skaffold n'est pas une moissonneuse-batteuse indĂ©pendante, mais cherche Ă  utiliser des modules distincts ou des solutions existantes pour des tĂąches spĂ©cifiques.

Illustration de ce dernier:

  • Au stade de l'assemblage, vous pouvez utiliser:
    • docker build localement, dans un cluster utilisant kaniko ou dans Google Cloud Build;
    • Bazel localement;
    • Jib Maven et Jib Gradle localement ou sur Google Cloud Build;
    • les scripts de construction personnalisĂ©s s'exĂ©cutent localement. Si vous devez exĂ©cuter une autre solution (plus flexible / familiĂšre / ...) pour l'assembly, elle est dĂ©crite dans le script afin que Skaffold l'exĂ©cute ( exemple de la documentation ). Cela vous permet d'utiliser n'importe quel collecteur pouvant ĂȘtre appelĂ© Ă  l'aide d'un script;
  • Au stade du test, le test de structure de conteneur dĂ©jĂ  mentionnĂ© est pris en charge;
  • Pour le dĂ©ploiement sont fournis:
    • Kubectl;
    • Helm;
    • kustomize.

GrĂące Ă  cela, Skaffold peut ĂȘtre appelĂ© une sorte de framework pour la construction de CI / CD . Voici un exemple de workflow lors de son utilisation (Ă  partir de la documentation du projet):



À quoi ressemble le travail de Skaffold en gĂ©nĂ©ral?

  1. L'utilitaire surveille les modifications dans le répertoire source. Si des modifications sont apportées aux fichiers, elles sont synchronisées avec le module d'application dans le cluster Kubernetes. Si possible, sans remonter l'image. Sinon, une nouvelle image va.
  2. L'image assemblée est vérifiée à l'aide de container-structure-test, étiquetée et envoyée au Docker Registry.
  3. AprÚs cela, l'image est déployée - elle est déployée dans un cluster Kubernetes.
  4. Si le lancement a été initialisé à l'aide de la commande skaffold dev , nous commençons à recevoir des journaux de l'application et Skaffold s'attend à des modifications pour répéter à nouveau toutes les étapes.



Illustration des jalons de l'Ă©chafaudage

Pratique. Essayer Skaffold


Pour démontrer l'utilisation de Skaffold, je vais prendre un exemple du référentiel GitHub du projet . Au fait, vous y trouverez de nombreux autres exemples qui prennent en compte diverses spécificités. Toutes les actions seront effectuées localement dans Minikube. L'installation est simple et prend quelques minutes, et kubectl est requis pour commencer.

Installez Skaffold:

 curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 chmod +x skaffold sudo mv skaffold /usr/local/bin skaffold version v0.37.1 

Clonons le référentiel Skaffold avec les exemples nécessaires:

 git clone https://github.com/GoogleContainerTools/skaffold cd skaffold/examples/microservices 

J'ai choisi un exemple avec deux pods, chacun contenant une petite application sur Go. Une application est le frontend (leeroy-web), une demande de redirection vers la deuxiÚme application est le backend (leeroy-app). Voyons à quoi ça ressemble:

 ~/skaffold/examples/microservices # tree . ├── leeroy-app │ ├── app.go │ ├── Dockerfile │ └── kubernetes │ └── deployment.yaml ├── leeroy-web │ ├── Dockerfile │ ├── kubernetes │ │ └── deployment.yaml │ └── web.go ├── README.adoc └── skaffold.yaml 4 directories, 8 files 

leeroy-app et leeroy-web contiennent du code Go et de simples Dockerfiles pour construire ce code localement:

 ~/skaffold/examples/microservices # cat leeroy-app/Dockerfile FROM golang:1.12.9-alpine3.10 as builder COPY app.go . RUN go build -o /app . FROM alpine:3.10 CMD ["./app"] COPY --from=builder /app . 

Je ne donnerai pas le code de l'application - il suffit de savoir que leeroy-web accepte les requĂȘtes et les leeroy-app procuration Ă  leeroy-app . Par consĂ©quent, dans les fichiers Deployment.yaml , il n'y a de service que pour l' app (pour le routage interne). Le port du pod web nous sera jetĂ© pour un accĂšs rapide Ă  l'application.

A quoi ressemble skaffold.yaml :

 ~/skaffold/examples/microservices # cat skaffold.yaml apiVersion: skaffold/v1beta13 kind: Config build: artifacts: - image: leeroy-web context: ./leeroy-web/ - image: leeroy-app context: ./leeroy-app/ deploy: kubectl: manifests: - ./leeroy-web/kubernetes/* - ./leeroy-app/kubernetes/* portForward: - resourceType: deployment resourceName: leeroy-web port: 8080 localPort: 9000 

Toutes les Ă©tapes mentionnĂ©es ci-dessus sont dĂ©crites ici. En plus de cette configuration, il existe Ă©galement un fichier avec des paramĂštres globaux - ~/.skaffold/config . Il peut ĂȘtre modifiĂ© manuellement ou via la CLI - par exemple, comme ceci:

 skaffold config set --global local-cluster true 

Cette commande définit la variable globale du local-cluster sur true , aprÚs quoi Skaffold ne tentera pas de «pousser» les images dans le registre distant. Si vous développez localement, vous pouvez également utiliser cette commande pour ajouter des images localement.

Retour Ă  skaffold.yaml :

  • Au stade de la build , nous indiquons que vous devez collecter et enregistrer l'image localement. AprĂšs le premier assemblage, nous verrons ce qui suit:

     // .. Minikube      , //   ,    # minikube ssh $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE leeroy-app 7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e 7d55a5080359 4 hours ago 13MB leeroy-app v0.37.1-171-g0270a0c-dirty 7d55a5080359 4 hours ago 13MB leeroy-web 5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681 5063bfb29d98 5 hours ago 13.1MB leeroy-web v0.37.1-171-g0270a0c-dirty 5063bfb29d98 5 hours ago 13.1MB 

    Comme vous pouvez le voir, Skaffold a indépendamment testé les images. Soit dit en passant, plusieurs politiques de marquage sont prises en charge.
  • Ce qui suit est spĂ©cifiĂ© dans le context: ./leeroy-app/ configuration context: ./leeroy-app/ , i.e. Le contexte dans lequel l'image est assemblĂ©e est spĂ©cifiĂ©.
  • Au stade du dĂ©ploiement, il est dĂ©terminĂ© que nous utiliserons kubectl et un masque pour les manifestes souhaitĂ©s.
  • PortForward : similaire Ă  la façon dont nous transmettons habituellement les ports Ă  l'aide de kubectl port-forward , nous donnons Ă  Skaffold des instructions pour appeler cette commande. Dans ce cas, le port local 9000 est transfĂ©rĂ© vers 8080 dans DĂ©ploiement avec le nom leeroy-web .

Il est temps de commencer le développement de skaffold dev : l'équipe créera une «boucle de rétroaction» continue, c'est-à-dire non seulement recueille tout et installe dans un cluster, mais indique également le statut des pods en ce moment, surveillera les modifications et mettra à jour le statut des pods.

Voici le résultat de l'exécution de skaffold dev --port-forward lors du remontage:



PremiĂšrement, il est clair que le cache est utilisĂ©. Ensuite - l'application est assemblĂ©e, dĂ©ployĂ©e, les ports sont transfĂ©rĂ©s. Étant donnĂ© que --port-forward est spĂ©cifiĂ©, Skaffold a transfĂ©rĂ© le port sur le web , comme demandĂ©, mais il a transfĂ©rĂ© l' app Ă  sa discrĂ©tion (il a choisi la plus proche gratuite). AprĂšs cela, nous obtenons les premiers journaux des applications.

VĂ©rifiez les performances?

 ~/skaffold/examples/microservices # kubectl get po NAME READY STATUS RESTARTS AGE leeroy-app-6998dfcc95-2nxvf 1/1 Running 0 103s leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 103s ~/skaffold/examples/microservices # curl localhost:9000 leeroooooy app!!! 

Modifiez le leeroy-app/app.go - cela prend quelques secondes ... et:

 ~/skaffold/examples/microservices # kubectl get po NAME READY STATUS RESTARTS AGE leeroy-app-ffd79d986-l6nwp 1/1 Running 0 11s leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 4m59s ~/skaffold/examples/microservices # curl localhost:9000 leeroooooy Habr!!! 

En mĂȘme temps, Skaffold lui-mĂȘme a apportĂ© Ă  la console la mĂȘme chose qu'auparavant, Ă  l'exception d'un point: il n'a dĂ©ployĂ© que l' leeroy-app , et pas tout Ă  la fois.

Plus de pratique


Il convient de mentionner que lors de la crĂ©ation d'un nouveau projet, les configurations pour Skaffold peuvent ĂȘtre amorcĂ©es Ă  l'aide de la commande init , ce qui est trĂšs pratique. De plus, vous pouvez Ă©crire plusieurs configurations: dĂ©veloppez sur la configuration par dĂ©faut, puis run Ă  l'Ă©tape avec la commande run (le mĂȘme processus que dev , ne suit tout simplement pas les modifications), en utilisant une configuration diffĂ©rente.

Katacoda a un tutoriel avec un exemple encore plus simple. Mais il propose un bac Ă  sable prĂȘt Ă  l'emploi avec Kubernetes, l'application et Skaffold. Une excellente option si vous ĂȘtes intĂ©ressĂ© Ă  essayer vous-mĂȘme les bases.

Un cas d'utilisation possible pour Skaffold est de mener le développement sur un cluster distant. Tout le monde n'est pas à l'aise d'exécuter Minikube sur son propre matériel, puis de déployer l'application et d'attendre son bon fonctionnement ... Dans ce cas, Skaffold résout parfaitement la tùche, ce que, par exemple, les ingénieurs de Reddit peuvent confirmer, comme nous l'avons déjà écrit dans notre blog.

Et dans cette publication de Weaveworks, vous pouvez trouver un exemple de création d'un pipeline pour la production.

Conclusion


Skaffold est un outil pratique pour la construction de pipelines qui impliquent le déploiement d'applications sur Kubernetes et sont principalement axés sur les besoins de développement. Avec lui, il est assez simple de créer un pipeline «court» qui prend en compte les besoins de base du développeur, mais si vous le souhaitez, vous pouvez organiser des processus plus ambitieux. L'un des exemples illustratifs d'utilisation de Skaffold dans les processus CI / CD est un projet de test de 10 microservices qui utilise les capacités de Kubernetes, gRPC, Istio et OpenCensus Tracing.

Skaffold a déjà reçu prÚs de 8000 étoiles sur GitHub, est développé par Google et fait partie de GoogleContainerTools - en général, pour le moment, il y a tout lieu de croire que le projet se développera avec bonheur pour toujours.

PS


Lisez aussi dans notre blog:

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


All Articles