Aperçu de Skaffold pour le développement sous Kubernetes

Aperçu de Skaffold pour le développement sous 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 le but est de créer un « développement simple et reproductible sous Kubernetes », permettant ainsi aux développeurs de se concentrer sur le développement plutôt que sur l'administration. Qu'est-ce qui rend Skaffold intéressant ? Comme il s'avère, il a plusieurs atouts dans sa manche grâce auxquels il peut devenir un puissant outil pour les développeurs, mais aussi pour les ingénieurs opérationnels. Découvrons le projet et ses fonctionnalités.

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

Théorie. Objectifs et possibilités

Donc, pour faire court, Skaffold résout la tâche d'automatisation du cycle CI/CD (aux étapes de construction, de publication, de déploiement), offrant au développeur des retours rapides, c'est-à-dire la possibilité d'obtenir rapidement le résultat des modifications de code successives — sous la forme d'une application mise à jour fonctionnant dans un cluster Kubernetes. Et cela peut fonctionner dans différents environnements (dev, stage, production…), pour lesquels Skaffold aide à décrire les pipelines correspondants pour le déploiement.

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

Examinons les principales fonctionnalités et caractéristiques. Parmi les premières, on peut citer les suivantes :

  • Skaffold propose des outils pour créer des pipelines CI/CD.
  • Il permet de surveiller en arrière-plan les modifications du code source et de déclencher un processus automatisé de construction de code en images de conteneurs, de publication de ces images dans Docker Registry et de leur déploiement dans un cluster Kubernetes.
  • Il synchronise les fichiers du dépôt avec le répertoire de travail dans le conteneur.
  • Il teste automatiquement à l'aide de container-structure-test.
  • Il transfère des ports.
  • Il lit les journaux de l'application exécutée dans le conteneur.
  • Il aide au débogage d'applications écrites en Java, Node.js, Python, Go.

Maintenant — sur les particularités :

Illustration du dernier point :

  • Au stade de la construction, on peut utiliser :
    • docker build localement, dans un cluster avec kaniko ou dans Google Cloud Build ;
    • Bazel localement ;
    • Jib Maven et Jib Gradle localement ou dans Google Cloud Build ;
    • des scripts de construction personnalisés, exécutés localement. Si vous devez exécuter une autre solution (plus flexible / familière / ...) pour la construction, elle est décrite dans le script pour que Skaffold l'exécute (exemple de la documentation). Cela permet d'utiliser n'importe quel compileur qui peut être appelé par un script ;
  • Au stade des tests, le mentionné container-structure-test;
  • Pour le déploiement, il existe :
    • Kubectl ;
    • Helm ;
    • kustomize.

Grâce à cela, Skaffold peut être qualifié de cadre pour la construction CI/CD. Voici un exemple de workflow lors de son utilisation (tiré de la documentation du projet) :

Aperçu de Skaffold pour le développement sous Kubernetes

À quoi ressemble en gros le fonctionnement de Skaffold ?

  1. L'outil surveille les modifications dans le répertoire avec le code source. Si des modifications sont apportées aux fichiers, elles se synchronisent avec le pod de l'application dans le cluster Kubernetes. Si c'est possible — sans reconstruction de l'image. Sinon, une nouvelle image est créée.
  2. L'image construite 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 — déployée dans le cluster Kubernetes.
  4. Si le lancement a été initialisé avec la commande skaffold dev, alors nous commençons à recevoir des logs de l'application, et Skaffold attend des modifications pour répéter toutes les actions.

Aperçu de Skaffold pour le développement sous Kubernetes
Illustration des principales étapes du fonctionnement de Skaffold

Pratique. Essayons Skaffold

Pour démontrer l'utilisation de Skaffold, je vais prendre un exemple de référentiel GitHub du projet. D'ailleurs, là-bas vous pouvez trouver de nombreux autres exemples, prenant en compte diverses spécificités. Toutes les actions seront effectuées localement dans Minikube. L'installation est simple et prendra quelques minutes, et pour commencer, vous aurez besoin de kubectl.

Installons 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 dépôt de Skaffold avec les exemples nécessaires :

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

J'ai choisi l'exemple avec deux pods, chacun contenant une petite application en Go. Une application est le frontend (leeroy-web) qui redirige les requêtes vers la deuxième application, le backend (leeroy-app). Voyons à quoi cela 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 répertoires, 8 fichiers

leeroy-app et leeroy-web contiennent du code en Go et de simples Dockerfiles pour la compilation locale de ce code :

~/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 fournirai pas le code des applications, il suffit de savoir que leeroy-web accepte des requêtes et les proxy sur leeroy-app. C'est pourquoi dans les fichiers Deployment.yaml il existe un Service uniquement pour app (pour le routage interne). Le port du pod web sera redirigé pour un accès rapide à l'application.

À 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

Ici sont décrites toutes les étapes mentionnées ci-dessus. En plus de cette config, il existe un fichier avec des paramètres globaux — ~/s.Skaffold/config. Il peut être édité manuellement ou via la CLI — par exemple, comme ceci :

skaffold config set --global local-cluster true

Cette commande définira la variable globale local-cluster à la valeur true, après quoi Skaffold ne tentera pas de pousser les images vers un registre distant. Si vous développez localement, vous pouvez utiliser cette commande pour stocker les images également localement.

Revenons à skaffold.yaml:

  • Au stade build nous indiquons que l'image doit être construite et stockée localement. Après le premier lancement de la build, 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 on peut le voir, Skaffold a automatiquement tagué les images. D'ailleurs, plusieurs politiques de tagging sont supportées.

  • Ensuite, dans la config, il est indiqué context: ./leeroy-app/, c'est-à-dire que le contexte dans lequel l'image est construite est défini.
  • Au stade du déploiement, il est déterminé que nous allons utiliser kubectl et un masque pour les manifestes nécessaires.
  • PortForward: similaire à la façon dont nous redirigeons généralement les ports à l'aide de kubectl port-forward, nous donnons des instructions à Skaffold pour appeler cette commande. Dans ce cas, le port local 9000 est redirigé vers 8080 dans le déploiement nommé leeroy-web.

Il est temps de lancer skaffold dev: la commande créera un « cycle de rétroaction » continu, c'est-à-dire qu'elle ne rassemblera pas seulement tout et ne le déploiera pas dans le cluster, mais elle informera également sur l'état des pods à ce moment-là, surveillera les changements et mettra à jour l'état des pods.

Voici le résultat du lancement skaffold dev --port-forward lors de la reconstruction :

Aperçu de Skaffold pour le développement sous Kubernetes

Tout d'abord, on voit que le cache est utilisé. Ensuite, l'application est construite, déployée, les ports sont redirigés. Puisque --port-forward, Skaffold a redirigé le port jusqu'à web, comme il était demandé, mais là app il a redirigé à sa propre discrétion (a choisi le port libre le plus proche). Après cela, nous obtenons les premiers journaux des applications.

Vérifions la fonctionnalité ?

~\/skaffold\/examples\/microservices # kubectl get po
NOM                           PRÊT   STATUT    REDÉMARRAGES   ÂGE
leeroy-app-6998dfcc95-2nxvf   1\/1     En cours   0          103s
leeroy-web-69f7d47c9d-5ff77   1\/1     En cours   0          103s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy app!!!

Modifions le fichier leeroy-app\/app.go — quelques secondes passent… et :

~\/skaffold\/examples\/microservices # kubectl get po
NOM                          PRÊT   STATUT    REDÉMARRAGES   ÂGE
leeroy-app-ffd79d986-l6nwp    1\/1     En cours   0          11s
leeroy-web-69f7d47c9d-5ff77   1\/1     En cours   0          4m59s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy Habr!!!

De plus, Skaffold a affiché dans la console exactement la même chose que précédemment, sauf pour un petit détail : il a seulement sorti leeroy-app, et non 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 ‘bootstrapées’ à l'aide de la commande init, ce qui est très pratique. De plus, on peut écrire plusieurs configurations : développer avec la configuration par défaut, puis déployer sur staging avec la commande run (le même processus que dev, juste sans surveiller les changements), en utilisant une autre configuration.

Sur katacoda, il y a guide un exemple encore plus simple. Cependant, il propose déjà une sandbox prête avec Kubernetes, une application et Skaffold. Une excellente option si vous souhaitez essayer vous-même les bases.

Un des moyens possibles d'utiliser Skaffold est de mener le développement sur un cluster distant. Tout le monde ne trouve pas pratique de lancer Minikube sur son propre matériel, puis de déployer l'application et d'attendre son bon fonctionnement… Dans ce cas, Skaffold répond parfaitement à la tâche, ce que peuvent confirmer, par exemple, les ingénieurs de Reddit, comme nous l'avons déjà mentionné. ont écrit dans notre blog.

Et dans cet article de Weaveworks, vous pouvez trouver un exemple de création de pipeline pour la production.

Conclusion

Skaffold est un outil pratique pour construire des pipelines destinés au déploiement d'applications dans Kubernetes, orienté principalement vers les besoins des développeurs. Il est assez facile de créer un pipeline "court" qui prend en compte les besoins fondamentaux du développeur, mais si désiré, des processus plus étendus peuvent également être organisés. À titre d'exemple illustratif de l'utilisation de Skaffold dans les processus CI/CD, il est cité . Et pour l'authentification à deux facteurs dans les systèmes d'exploitation Windows, Linux et MacOS, des un projet test composé de 10 microservices, utilisant les fonctionnalité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 somme, à l'heure actuelle, il y a toutes les raisons de croire que le projet continuera à se développer longtemps et heureux.

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