使用 Triggers 动态调度 Tekton 工作负载
Tekton是 Kubernetes 原生的持续集成和交付 (CI/CD) 框架。它允许您通过 Kubernetes 自定义资源定义 (CRD) 以声明方式创建容器化、可组合和可配置的工作负载。
更多关于 Kubernetes
-
什么是 Kubernetes?
-
电子书:Kubernetes 的存储模式
-
试驾 OpenShift 上手
-
电子书:Kubernetes 入门
-
企业级Kubernetes简介
-
如何通俗地解释 Kubernetes
-
电子书:在您的 Raspberry Pi 家庭实验室上运行 Kubernetes
-
Kubernetes 备忘单
-
电子书:面向 SRE 和系统管理员的 Kubernetes 指南
-
Kubernetes 最新文章
Tekton 触发器是一个 Tekton 组件,它允许您从各种来源的事件中检测和提取信息,并根据该信息执行TaskRuns和PipelineRuns。它还允许将提取的信息从事件传递给 TaskRuns 和 PipelineRuns。
本文以 GitLab 为例演示了 Tekton Triggers 如何与外部服务(例如 Git 存储库)集成。
先决条件
如果您想按照本文中的步骤进行操作,您必须有一个运行 Kubernetes 1.18 或更高版本的 Kubernetes 集群,并安装一个可以为您提供外部 IP 的入口控制器。您还必须安装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 中创建的,这是 Kubernetes 中最常用的配置格式。但是,在编写 YAML 文件来定义触发器之前,了解 Tekton 触发器术语很重要。
事件监听器
EventListener是一个 Kubernetes 服务,用于监听传入的 HTTP 请求并执行 Trigger。例如,在接收到特定的传入请求后,此定义执行gitlab-listener-trigger
触发器:
apiVersion:triggers.tekton.dev/v1beta1
种类:事件监听器
元数据:
名称:gitlab-event-listener
规格:
serviceAccountName:gitlab-listener-sa
触发器:
- triggerRef:gitlab-listener-trigger
资源:
Kubernetes资源:
服务类型:节点端口
触发器
触发器决定如何处理接收到的事件。它还设置了 TriggerBinding、TriggerTemplate 和可选的拦截器以运行。触发器在继续之前使用拦截器来验证或修改传入的请求。
apiVersion:triggers.tekton.dev/v1beta1
种类:触发器
元数据:
名称:gitlab-listener-trigger
规格:
拦截器:
- 名称:“验证-gitlab-payload”
参考:
名称:“gitlab”
种类:集群拦截器
参数:
- 名称:secretRef
价值:
秘密名称:“gitlab-秘密”
秘密密钥:“秘密令牌”
- 名称:事件类型
价值:
- “推钩”
绑定:
- 参考:绑定
模板:
参考:模板
拦截器
拦截器是在 TriggerBinding 之前运行的事件处理器。它还执行有效负载过滤、验证(使用秘密)和转换;定义和测试触发条件;并实现其他有用的处理。
默认情况下,安装 Triggers 时会安装四个核心拦截器:GitHub、GitLab、Bitbucket 和 CEL。该安装还包括一个用于实现自定义业务逻辑的 Webhook 拦截器。
GitLab 拦截器
GitLab 拦截器有助于验证和过滤 GitLab webhook 并按事件类型过滤传入事件。 GitLab 拦截器需要一个秘密令牌。此令牌在 GitLab 中创建 webhook 时设置,并在请求到达时由 GitLab 拦截器验证。
api版本:v1
种类:秘密
元数据:
名称:gitlab-secret
类型:不透明
字符串数据:
秘密令牌:“1234567”
触发器绑定
在验证和修改传入请求后,您需要从请求中提取值并将它们绑定到变量,您稍后可以在 TriggerTemplate 中使用这些变量来传递我们的管道。
对于我们的示例,您只需要一个 URL 和一个修订。
apiVersion:triggers.tekton.dev/v1beta1
种类:触发器绑定
元数据:
名称:绑定
规格:
参数:
- 名称:gitrevision
价值:$(body.checkout_sha)
- 名称:gitrepositoryurl
值:$(body.repository.git\http\url)
触发器模板
TriggerTemplate是一个蓝图,它在 EventListener 检测到事件时实例化TaskRun
或PipelineRun
。
apiVersion:triggers.tekton.dev/v1beta1
种类:触发器模板
元数据:
名称:模板
规格:
参数:
-
名称:gitrevision
-
名称:gitrepositoryurl
资源模板:
- api版本:tekton.dev/v1beta1
种类:任务运行
元数据:
生成名称:gitlab-run-
规格:
任务规范:
资源:
输入:
- 名称:来源
类型:git
脚步:
- 图片:免费
脚本:|
#! /bin/bash
ls -al $(inputs.resources.source.path)
资源:
输入:
- 名称:来源
资源规格:
类型:git
参数:
- 名称:修订
价值:$(tt.params.gitrevision)
- 名称:网址
值:$(tt.params.gitrepositoryurl)
请注意,在撰写本文时,管道资源模块已被弃用,并将由tektoncd/catalog中的git-clone任务替换。
通过配置 webhook 动态调度工作负载
首先,创建一个新的命名空间,demo
:
$ kubectl create ns demo
接下来,在应用 Triggers 资源之前,配置所需的基于角色的访问控制 (RBAC):
$ kubectl -n 演示应用 -f \
“https://gist.githubusercontent.com/savitaashture/596bc4d93ff6b7606fe52aa20ba1ba14/raw/158a5ed0dc30fd1ebdac461147a4079cd6187eac/triggers-rbac.yaml”
注意:RBAC 配置因权限而异。
应用触发器资源:
$ kubectl -n 演示应用 -f \
“https://gist.githubusercontent.com/savitaashture/8aa013db1cb87f5dd1f2f96b0e121363/raw/f4f592d8c1332938878c5ab9641e350c6411e2b0/triggers-resource.yaml”
应用后,验证EventListener对象和pod创建成功:
EventListener 对象的 READY 状态应为 True。
$kubectl 获取 el -n 演示
姓名 地址 可用的原因 准备好 原因
gitlab-event-listener http://el-gitlab-event-listener.demo.svc.cluster.local:8080 真
EventListener Pod 状态应为 Running.
$ kubectl 获取 pods -n 演示
姓名 准备好 状态 重新开始 年龄
El-Gitlab-Event-Listener-fb77ff8f7-p5Wnv 1/1运行0 4M22S
创建入口以获取要在 GitLab webhook 中配置的外部 IP:
$ kubectl -n 演示应用 -f \
“https://gist.githubusercontent.com/savitaashture/3b3554810e391477feae21bb8a9af93a/raw/56665b0a31c7a537f9acbb731b68a519be260808/triggers-ingress.yaml”
获取入口 IP:
$ kubectl 获取入口触发器-入口-资源 -n 演示
名称类主机地址端口年龄
入口资源 <none> * <address> 80 6s
在 GitLab 中配置 webhook。在您的 GitLab 存储库中,转到 Settings -> Webhooks。
然后设置以下字段:
-
URL:来自 Ingress 的外部 IP 地址,路径为
/
-
秘密令牌:1234567,它应该与上面从
triggers-resource.yaml
文件中创建的秘密值匹配
从 Trigger 部分选择事件类型,然后只需选择 Push events, 取消选中 Enable SSL verification,然后单击 Add webhook。
图片来源:
Savita Ashture,CC BY-SA 4.0
通过推送 PR 测试 GitLab 事件
克隆您自己的 GitLab 存储库,进行更改并推送。例如:
$ git clone https://gitlab.com/savitaashture1/gitlabtest-triggers
$ cd gitlabtest-触发器
$ git commit -m "empty-commit" --allow-empty && git push origin main
[main 934ecba] 空提交
“https://gitlab.com”的用户名:savitaashture
“https://savitaashture@gitlab.com”的密码:
警告:重定向到 https://gitlab.com/savitaashture1/gitlabtest-triggers.git/
枚举对象:1、完成。
计数对象:100% (1/1),完成。
写入对象:100% (1/1),183 字节 | 183.00 KiB/s,完成。
总计 1(增量 0),重复使用 0(增量 0)
到 https://gitlab.com/savitaashture1/gitlabtest-triggers
ff1d11e..934ecba 主 -> 主
将生成事件并将其发送到 EventListener pod。您可以通过以下方式验证这一点:
kubectl 获取 pods -n 演示
kubectl 日志 -f <pod_name> -n 演示
通过对TaskRun
执行get
操作来验证事件的成功传递。
$ kubectl -n 演示获取任务运行 | grep gitlab-运行-
gitlab-run-hvtll 真 成功 95s 87s
通过删除命名空间demo
来清理由触发器创建的所有资源:
$ kubectl delete ns demo
结论
Tekton Triggers 是最有用的模块之一,可帮助动态调度工作负载以响应用户定义的一组事件。由于这个模块,我的团队能够实现端到端的 CI/CD。
更多推荐
所有评论(0)