Tekton 是一个 Kubernetes 原生的持续集成和交付 (CI/CD) 框架。它允许您通过 Kubernetes 自定义资源定义 (CRD) 以声明方式创建容器化、可组合和可配置的工作负载。
Tekton Triggers 是 Tekton 的一个组件,它允许您检测和提取来自各种来源的事件信息,并根据该信息执行 TaskRuns 和 PipelineRuns。它还支持将从事件中提取的信息传递给 TaskRuns 和 PipelineRuns。
本文演示了 Tekton Triggers 如何与外部服务(例如 Git 存储库)集成,并以 GitLab 为例。
先决条件
如果您想按照本文中的步骤操作,您必须拥有一个运行 Kubernetes 1.18 或更高版本的 Kubernetes 集群,并安装一个可以为您提供外部 IP 的 Ingress 控制器。您还必须安装 Tekton Pipelines 和 Tekton Triggers。
触发器流程
Tekton Trigger 允许您创建一个名为 EventListener 的特殊资源,它是一个 Kubernetes 服务,用于监听来自不同来源的传入 HTTP 请求,通常是 Git 存储库,包括 GitLab、GitHub 等上托管的存储库。基于这些事件,EventListener Pod 执行操作并创建 Tekton 资源,例如 TaskRun 或 PipelineRun。

Savita Ashture,CC BY-SA 4.0
所有 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 检测到事件时,它会实例化 TaskRun
或 PipelineRun
。
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。

Savita Ashture,CC BY-SA 4.0
通过推送 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。
评论已关闭。