使用触发器动态调度 Tekton 工作负载

使用此 Kubernetes 原生应用程序升级您的 CI/CD 管道。
42 位读者喜欢这个。
Parts, modules, containers for software

Opensource.com

Tekton 是一个 Kubernetes 原生的持续集成和交付 (CI/CD) 框架。它允许您通过 Kubernetes 自定义资源定义 (CRD) 以声明方式创建容器化、可组合和可配置的工作负载。

Tekton Triggers 是 Tekton 的一个组件,它允许您检测和提取来自各种来源的事件信息,并根据该信息执行 TaskRunsPipelineRuns。它还支持将从事件中提取的信息传递给 TaskRuns 和 PipelineRuns。

本文演示了 Tekton Triggers 如何与外部服务(例如 Git 存储库)集成,并以 GitLab 为例。

先决条件

如果您想按照本文中的步骤操作,您必须拥有一个运行 Kubernetes 1.18 或更高版本的 Kubernetes 集群,并安装一个可以为您提供外部 IP 的 Ingress 控制器。您还必须安装 Tekton PipelinesTekton Triggers

触发器流程

Tekton Trigger 允许您创建一个名为 EventListener 的特殊资源,它是一个 Kubernetes 服务,用于监听来自不同来源的传入 HTTP 请求,通常是 Git 存储库,包括 GitLab、GitHub 等上托管的存储库。基于这些事件,EventListener Pod 执行操作并创建 Tekton 资源,例如 TaskRun 或 PipelineRun。

所有 Triggers 资源定义都以 YAML 格式创建,YAML 是 Kubernetes 中最常用的配置格式。但是,在编写 YAML 文件来定义 Trigger 之前,了解 Tekton Triggers 术语非常重要。

EventListener

EventListener 是一个 Kubernetes 服务,它监听传入的 HTTP 请求并执行 Trigger。例如,在收到特定的传入请求后,此定义将执行 gitlab-listener-trigger 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

Trigger

Trigger 决定如何处理收到的事件。它还设置 TriggerBinding、TriggerTemplate 和可选的拦截器来运行。Triggers 使用拦截器来验证或修改传入的请求,然后再继续。

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

Interceptor 是在 TriggerBinding 之前运行的事件处理器。它还执行负载过滤、验证(使用密钥)和转换;定义和测试触发条件;并实现其他有用的处理。

默认情况下,安装 Triggers 时会安装四个核心拦截器:GitHub、GitLab、Bitbucket 和 CEL。安装还包括一个 Webhook 拦截器,用于实现自定义业务逻辑。

GitLab 拦截器

GitLab 拦截器有助于验证和过滤 GitLab Webhook,并按事件类型过滤传入事件。GitLab 拦截器需要一个密钥令牌。此令牌在 GitLab 中创建 Webhook 时设置,并在请求到达时由 GitLab 拦截器验证。

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

TriggerBinding

在验证和修改传入的请求后,您需要从请求中提取值,并将它们绑定到您稍后可以在 TriggerTemplate 中使用的变量,以传递我们的 Pipeline。

对于我们的示例,您只需要 URL 和修订版本。

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)

TriggerTemplate

TriggerTemplate 是一个蓝图,当 EventListener 检测到事件时,它会实例化 TaskRunPipelineRun

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)

请注意,管道资源模块在撰写本文时已被弃用,将被 git-clone 任务(来自 tektoncd/catalog)取代。

通过配置 Webhook 动态调度工作负载

首先,创建一个新的命名空间 demo

$ kubectl create ns demo

接下来,在应用 Triggers 资源之前,配置所需的基于角色的访问控制 (RBAC)

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

注意:RBAC 配置因权限而异。

应用 Triggers 资源

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

应用后,验证 EventListener 对象和 Pod 是否成功创建

EventListener 对象 READY 状态应为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

EventListener Pod 状态应为Running。

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

创建 Ingress 以获取外部 IP,以便在 GitLab Webhook 中配置

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

获取 Ingress IP

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

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

在 GitLab 中配置 Webhook。在您的 GitLab 存储库中,转到设置 -> Webhook

然后设置以下字段

  • URL:来自 Ingress 的外部 IP 地址,带有 / 路径
  • 密钥令牌:1234567,应与上面从 triggers-resource.yaml 文件创建的密钥值匹配

从“Trigger”部分选择事件类型,然后仅选择推送事件,取消选中启用 SSL 验证,然后单击添加 Webhook。

通过推送 PR 测试 GitLab 事件

克隆您自己的 GitLab 存储库,进行更改并推送。例如

$ 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

事件将生成并发送到 EventListener Pod。您可以通过执行以下操作来验证这一点

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

通过对 TaskRun 执行 get 操作来验证事件是否成功交付。

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

gitlab-run-hvtll   True        Succeeded   95s         87s

通过删除命名空间 demo 清理 Triggers 创建的所有资源

$ kubectl delete ns demo

结论

Tekton Triggers 是最有用的模块之一,它有助于响应用户定义的一组事件动态调度工作负载。由于这个模块,我的团队能够实现端到端的 CI/CD。

接下来阅读什么

评论已关闭。

© . All rights reserved.