Recherche de site Web

Planification dynamique des charges de travail Tekton à l'aide de déclencheurs


Mettez à niveau votre pipeline CI/CD avec cette application native Kubernetes.

Tekton est un framework d'intégration et de livraison continues (CI/CD) natif de Kubernetes. Il vous permet de créer des charges de travail conteneurisées, composables et configurables de manière déclarative via les définitions de ressources personnalisées (CRD) Kubernetes.

Tekton Triggers est un composant Tekton qui vous permet de détecter et d'extraire des informations d'événements provenant de diverses sources et d'exécuter des TaskRuns et PipelineRuns en fonction de ces informations. Il permet également de transmettre les informations extraites aux TaskRuns et PipelineRuns à partir des événements.

Cet article montre comment Tekton Triggers s'intègre à des services externes, tels qu'un référentiel Git, en utilisant GitLab comme exemple.

Conditions préalables

Si vous souhaitez suivre les étapes de cet article, vous devez disposer d'un cluster Kubernetes exécutant Kubernetes 1.18 ou supérieur avec un contrôleur d'entrée installé pouvant vous fournir une adresse IP externe. Vous devez également avoir installé Tekton Pipelines et Tekton Triggers.

Déclenche le flux

Tekton Trigger vous permet de créer une ressource spéciale appelée EventListener, qui est un service Kubernetes qui écoute les requêtes HTTP entrantes provenant de différentes sources, généralement un référentiel Git, y compris celles hébergées sur GitLab, GitHub et autres. Sur la base de ces événements, le pod EventListener effectue des actions et crée des ressources Tekton, telles que TaskRun ou PipelineRun.

Savita Ashture, CC BY-SA 4.0

Toutes les définitions de ressources Triggers sont créées en YAML, le format de configuration le plus couramment utilisé dans Kubernetes. Cependant, avant d'écrire des fichiers YAML pour définir un déclencheur, il est important de comprendre la terminologie des déclencheurs Tekton.

Écouteur d'événements

Un EventListener est un service Kubernetes qui écoute les requêtes HTTP entrantes et exécute un déclencheur. Par exemple, après avoir reçu une requête entrante spécifique, cette définition exécute le déclencheur gitlab-listener-trigger :

apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: gitlab-event-listener
spec:
  serviceAccountName: gitlab-listener-sa
  triggers:
    - triggerRef: gitlab-listener-trigger
  resources:
    kubernetesResource:
      serviceType: NodePort

Déclenchement

Un déclencheur décide quoi faire avec un événement reçu. Il définit également un TriggerBinding, un TriggerTemplate et des intercepteurs facultatifs à exécuter. Les déclencheurs utilisent des intercepteurs pour valider ou modifier les demandes entrantes avant de continuer.

apiVersion: triggers.tekton.dev/v1beta1
kind: Trigger
metadata:
  name: gitlab-listener-trigger
spec:
  interceptors:
    - name: "verify-gitlab-payload"
      ref:
        name: "gitlab"
        kind: ClusterInterceptor
      params:
        - name: secretRef
          value:
            secretName: "gitlab-secret"
            secretKey: "secretToken"
        - name: eventTypes
          value:
            - "Push Hook"
  bindings:
    - ref: binding
  template:
    ref: template

Intercepteur

Un intercepteur est un processeur d'événements qui s'exécute avant le TriggerBinding. Il effectue également le filtrage, la vérification (à l'aide d'un secret) et la transformation des charges utiles ; définit et teste les conditions de déclenchement ; et implémente d'autres traitements utiles.

Par défaut, quatre intercepteurs principaux sont installés lors de l'installation des déclencheurs : GitHub, GitLab, Bitbucket et CEL. L'installation comprend également un intercepteur Webhook pour implémenter une logique métier personnalisée.

Intercepteurs GitLab

Les intercepteurs GitLab aident à valider et filtrer les webhooks GitLab et à filtrer les événements entrants par type d'événement. L'intercepteur GitLab nécessite un jeton secret. Ce jeton est défini lors de la création du webhook dans GitLab et est validé par l'intercepteur GitLab lorsque la requête arrive.

apiVersion: v1
kind: Secret
metadata:
  name: gitlab-secret
type: Opaque
stringData:
  secretToken: "1234567"

Liaison de déclenchement

Après avoir validé et modifié la requête entrante, vous devez extraire les valeurs de la requête et les lier à des variables que vous pourrez ensuite utiliser dans un TriggerTemplate pour transmettre notre Pipeline.

Pour notre exemple, vous avez juste besoin d'une URL et d'une révision.

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
  name: binding
spec:
  params:
    - name: gitrevision
      value: $(body.checkout_sha)
    - name: gitrepositoryurl
      value: $(body.repository.git_http_url)

Modèle de déclencheur

Le TriggerTemplate est un modèle qui instancie TaskRun ou PipelineRun lorsque EventListener détecte un événement.

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: template
spec:
  params:
    - name: gitrevision
    - name: gitrepositoryurl
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
        generateName: gitlab-run-
      spec:
        taskSpec:
          resources:
            inputs:
              - name: source
                type: git
          steps:
            - image: ubuntu
              script: |
                #! /bin/bash
                ls -al $(inputs.resources.source.path)
        resources:
          inputs:
            - name: source
              resourceSpec:
                type: git
                params:
                  - name: revision
                    value: $(tt.params.gitrevision)
                  - name: url
                    value: $(tt.params.gitrepositoryurl)

Notez que le module de ressources de pipeline est, au moment de la rédaction, obsolète et sera remplacé par des tâches git-clone, de tektoncd/catalog.

Planifiez dynamiquement les charges de travail en configurant un webhook

Tout d'abord, créez un nouvel espace de noms, demo :

$ kubectl create ns demo

Ensuite, avant d'appliquer la ressource Déclencheurs, configurez le contrôle d'accès basé sur les rôles (RBAC) requis :

$ kubectl -n demo apply -f \
"https://gist.githubusercontent.com/savitaashture/596bc4d93ff6b7606fe52aa20ba1ba14/raw/158a5ed0dc30fd1ebdac461147a4079cd6187eac/triggers-rbac.yaml"

Remarque : les configurations RBAC varient en fonction des autorisations.

Appliquer les ressources des déclencheurs :

$ kubectl -n demo apply -f \
"https://gist.githubusercontent.com/savitaashture/8aa013db1cb87f5dd1f2f96b0e121363/raw/f4f592d8c1332938878c5ab9641e350c6411e2b0/triggers-resource.yaml"

Après l'application, vérifiez la création réussie de l'objet et du pod EventListener :

L’état READY de l’objet EventListener doit être True. 

$ kubectl get el -n demo
NAME                    ADDRESS                                                     AVAILABLE REASON              READY             REASON                                                                                                             
gitlab-event-listener   http://el-gitlab-event-listener.demo.svc.cluster.local:8080   True                 MinimumReplicasAvailable   True

L'état du pod EventListener doit être En cours d'exécution.

$ kubectl get pods -n demo
NAME                                       READY          STATUS    RESTARTS              AGE
el-gitlab-event-listener-fb77ff8f7-p5wnv   1/1            Running   0                     4m22s

Créez une entrée pour obtenir l'adresse IP externe à configurer dans le webhook GitLab :

$ kubectl -n demo apply -f \
"https://gist.githubusercontent.com/savitaashture/3b3554810e391477feae21bb8a9af93a/raw/56665b0a31c7a537f9acbb731b68a519be260808/triggers-ingress.yaml"

Obtenez l'adresse IP d'entrée :

$ kubectl get ingress triggers-ingress-resource -n demo

NAME               CLASS    HOSTS     ADDRESS                             PORTS   AGE
ingress-resource   <none>   *         <address>                            80      6s

Configurez un webhook dans GitLab. Dans votre référentiel GitLab, accédez à Paramètres -> Webhooks.

Définissez ensuite les champs ci-dessous :

  • URL : adresse IP externe de l'entrée avec le chemin /
  • Jeton secret : 1234567, qui doit correspondre à la valeur secrète créée ci-dessus à partir du fichier triggers-resource.yaml

Choisissez le type d'événement dans la section Déclencheur, puis sélectionnez simplement Événements push, décochez Activer la vérification SSL et cliquez sur Ajouter un webhook.

Savita Ashture, CC BY-SA 4.0

Tester les événements GitLab en poussant les relations publiques

Clonez votre propre référentiel GitLab, apportez des modifications et effectuez le push. Par exemple:

$ git clone https://gitlab.com/savitaashture1/gitlabtest-triggers
$ cd gitlabtest-triggers
               $ git commit -m "empty-commit" --allow-empty && git push origin main
[main 934ecba] empty-commit
Username for 'https://gitlab.com': savitaashture
Password for 'https://savitaashture@gitlab.com': 
warning: redirecting to https://gitlab.com/savitaashture1/gitlabtest-triggers.git/
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 183 bytes | 183.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://gitlab.com/savitaashture1/gitlabtest-triggers
   ff1d11e..934ecba  main -> main

Les événements seront générés et envoyés au pod EventListener. Vous pouvez le vérifier en faisant :

kubectl get pods -n demo
kubectl logs -f <pod_name> -n demo

Vérifiez la livraison réussie des événements en effectuant une opération get pour TaskRun.

$ kubectl  -n demo get taskruns | grep gitlab-run-

gitlab-run-hvtll   True        Succeeded   95s         87s

Nettoyez toutes les ressources créées par les déclencheurs en supprimant l'espace de noms demo :

$kubectl supprimer la démo ns

Conclusion

Tekton Triggers est l'un des modules les plus utiles qui permettent de planifier les charges de travail de manière dynamique en réponse à un ensemble d'événements défini par l'utilisateur. Grâce à ce module, mon équipe a pu réaliser du CI/CD de bout en bout.

Articles connexes: