Pesquisa de site

Agendamento dinâmico de cargas de trabalho Tekton usando Triggers


Atualize seu pipeline de CI/CD com este aplicativo nativo do Kubernetes.

Tekton é uma estrutura de integração e entrega contínua (CI/CD) nativa do Kubernetes. Ele permite que você crie cargas de trabalho em contêineres, combináveis e configuráveis de forma declarativa por meio de Definições de recursos personalizados (CRD) do Kubernetes.

Tekton Triggers é um componente Tekton que permite detectar e extrair informações de eventos de várias fontes e executar TaskRuns e PipelineRuns com base nessas informações. Ele também permite passar informações extraídas de eventos para TaskRuns e PipelineRuns.

Este artigo demonstra como o Tekton Triggers se integra a serviços externos, como um repositório Git, usando o GitLab como exemplo.

Pré-requisitos

Se quiser seguir as etapas deste artigo, você deve ter um cluster Kubernetes executando o Kubernetes 1.18 ou superior com um controlador de entrada instalado que possa fornecer um IP externo. Você também deve ter Tekton Pipelines e Tekton Triggers instalados.

Fluxo de gatilhos

Tekton Trigger permite que você crie um recurso especial chamado EventListener, que é um serviço Kubernetes que escuta solicitações HTTP recebidas de diferentes fontes, geralmente um repositório Git, incluindo aqueles hospedados no GitLab, GitHub e outros. Com base nesses eventos, o pod EventListener executa ações e cria recursos Tekton, como TaskRun ou PipelineRun.

Savita Ashture, CC BY-SA 4.0

Todas as definições de recursos Triggers são criadas em YAML, o formato de configuração mais comumente usado no Kubernetes. No entanto, antes de escrever arquivos YAML para definir um Trigger, é importante entender a terminologia do Tekton Triggers.

EventListener

Um EventListener é um serviço Kubernetes que escuta solicitações HTTP recebidas e executa um Trigger. Por exemplo, depois de receber uma solicitação específica, esta definição executa o gatilho 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

Acionar

Um Trigger decide o que fazer com um evento recebido. Ele também define TriggerBinding, TriggerTemplate e interceptores opcionais para execução. Os gatilhos usam interceptores para validar ou modificar as solicitações recebidas antes de prosseguir.

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

Interceptor

Um interceptor é um processador de eventos executado antes do TriggerBinding. Ele também realiza filtragem, verificação (usando um segredo) e transformação de carga útil; define e testa condições de disparo; e implementa outro processamento útil.

Por padrão, quatro interceptores principais são instalados ao instalar Triggers: GitHub, GitLab, Bitbucket e CEL. A instalação também inclui um interceptor Webhook para implementar lógica de negócios personalizada.

Interceptadores GitLab

Os interceptadores GitLab ajudam a validar e filtrar webhooks GitLab e filtrar eventos recebidos por tipo de evento. O interceptor GitLab requer um token secreto. Este token é definido ao criar o webhook no GitLab e é validado pelo interceptor GitLab quando a solicitação chega.

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

Ligação de gatilho

Depois de validar e modificar a solicitação recebida, você precisa extrair valores da solicitação e vinculá-los a variáveis que você pode usar posteriormente em um TriggerTemplate para passar nosso Pipeline.

Para nosso exemplo, você só precisa de uma URL e uma revisão.

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)

Modelo de gatilho

O TriggerTemplate é um blueprint que instancia TaskRun ou PipelineRun quando EventListener detecta um evento.

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)

Observe que o módulo de recursos do pipeline está, no momento da escrita, sendo obsoleto e será substituído por tarefas git-clone, de tektoncd/catalog.

Agende cargas de trabalho dinamicamente configurando um webhook

Primeiro, crie um novo namespace, demo:

$ kubectl create ns demo

Em seguida, antes de aplicar o recurso Triggers, configure o controle de acesso baseado em função (RBAC) necessário:

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

Nota: As configurações do RBAC variam dependendo das permissões.

Aplicar recursos de gatilhos:

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

Após a aplicação, verifique a criação bem-sucedida do objeto EventListener e do pod:

O status READY do objeto EventListener deve ser 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

O status do pod EventListener deve ser Em execução.

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

Crie entrada para obter o IP externo para configurar no webhook do GitLab:

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

Obtenha o IP de entrada:

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

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

Configure um webhook no GitLab. No seu repositório GitLab, vá para Configurações -> Webhooks.

Em seguida, defina os campos abaixo:

  • URL: endereço IP externo do Ingress com caminho /
  • Token secreto: 1234567, que deve corresponder ao valor secreto criado acima no arquivo triggers-resource.yaml

Escolha o tipo de evento na seção Trigger, selecione Push events, desmarque Ativar verificação SSL e clique em Adicionar webhook.

Savita Ashture, CC BY-SA 4.0

Testando eventos do GitLab pressionando PR

Clone seu próprio repositório GitLab, faça alterações e envie por push. Por exemplo:

$ 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

Os eventos serão gerados e enviados para o pod EventListener. Você pode verificar isso fazendo:

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

Verifique a entrega bem-sucedida de eventos executando uma operação get para TaskRun.

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

gitlab-run-hvtll   True        Succeeded   95s         87s

Limpe todos os recursos criados pelos Triggers removendo o namespace demo:

$kubectl delete ns demo

Conclusão

Tekton Triggers é um dos módulos mais úteis que ajuda a agendar cargas de trabalho dinamicamente em resposta a um conjunto de eventos definido pelo usuário. Por causa deste módulo, minha equipe conseguiu alcançar CI/CD de ponta a ponta.

Artigos relacionados: