EventListeners
EventListener是一个 Kubernetes 对象,它在 Kubernetes 集群上的指定端口监听事件。它公开了一个可寻址接收器,该接收器接收传入事件并指定一个或多个触发器。sink 是一个 Kubernetes 服务,在专用 Pod 中运行 sink 逻辑。
每个 Trigger 反过来允许你指定一个或多个TriggerBindings,允许你从事件有效负载中提取字段及其值,以及一个或多个TriggerTemplates从相应的 TriggerBindings 接收字段值并允许 Tekton 触发器用该数据实例化资源,例如 TaskRuns 和 PipelineRuns。
如果您需要在将事件负载数据传递给TriggerBinding之前对其进行修改、过滤或验证,您可以选择指定一个或多个Interceptors(拦截器)。
EventListener的结构
一个EventListener定义由以下字段组成:
必需的:
apiVersion- 指定目标 API 版本,例如 triggers.tekton.dev/v1alpha1kind- 指定该Kubernetes资源是一个EventListener对象。metadata- 指定唯一标识此EventListener对象的数据,例如一个名称spec- 指定 EventListener 的配置:serviceAccountName- 指定EventListener将用于实例化 Tekton 资源的ServiceAccount
可选的:
triggers- 指定在事件检测时执行的Triggers列表resources- 指定可用于事件侦听服务的资源namespaceSelector- 指定EventListener的命名空间; 这是EventListener查找指定触发器并存储它在事件检测时实例化的 Tekton 对象的地方labelSelector- 指定 EventListener 识别触发器的标签并实例化指定的 Tekton 对象
请参阅我们的Tekton Triggers示例,了解即用型 EventListener定义示例。
指定Kubernetes服务账户
你必须在serviceAccountName字段中指定 Kubernetes 服务帐户,EventListener 将使用该帐户来实例化 Tekton 对象。
Tekton Trigger 在安装时创建了2个集群角色(事件监听所需的必要权限)。你可以直接为你的服务账户创建与clusterroles的绑定。- 一个Kubernetes RoleBinding与tekton-triggers-eventlistener-roles集群角色。- 一个带有tekton-triggers-eventlistener-clusterroles集群角色的Kubernetes集群角色绑定(Kubernetes ClusterRoleBinding)。
如下示例。 - 如果在 EventListener 中使用 namespaceSelectors,则必须使用 tekton-triggers-eventlistener-roles clusterrole 创建一个额外的 ClusterRoleBinding。
apiVersion: v1
kind: ServiceAccount
metadata:
name: tekton-triggers-example-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: triggers-example-eventlistener-binding
subjects:
- kind: ServiceAccount
name: tekton-triggers-example-sa
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-roles
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: triggers-example-eventlistener-clusterbinding
subjects:
- kind: ServiceAccount
name: tekton-triggers-example-sa
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-clusterroles
指定Triggers
你可以选择指定一个或多个Triggers来定义当EventListener检测到符合条件的事件时要执行的操作。您可以指定对外部 Trigger对象的引用,也可以在Trigger定义中引用/定义TriggerBindings、TriggerTemplates和Interceptors。Trigger定义指定以下字段:
name-(可选)唯一标识Trigger的有效Kubernetes名称interceptors-(可选)在将事件负载数据传递给关联的 TriggerBinding 之前处理事件负载数据的拦截器列表bindings-(可选)此 Trigger 的 TriggerBindings 列表;可以引用现有的 TriggerBindings 或直接嵌入它们的定义template-(可选)此 Trigger 的 TriggerTemplate;可以引用现有的 TriggerTemplate 或直接嵌入其定义triggerRef-(可选)对外部Trigger的引用
下面是一个Trigger例子定义,它引用了需要的 TriggerBindings、TriggerTemplates 和 Interceptors:
triggers:
- name: trigger-1
interceptors:
- github:
eventTypes: ["pull_request"]
bindings:
- ref: pipeline-binding # Reference to a TriggerBinding object
- name: message # Embedded Binding
value: Hello from the Triggers EventListener!
template:
ref: pipeline-template
下面是一个 Trigger 定义的例子,它指定了对外部 Trigger 对象的引用:
triggers:
- triggerRef: trigger
下面是一个直接嵌入 triggerTemplate 定义的 Trigger 定义例子:
triggers:
- name: "my-trigger"
template:
spec:
params:
- name: "my-param-name"
resourceTemplates:
- apiVersion: "tekton.dev/v1beta1"
kind: TaskRun
metadata:
generateName: "pr-run-"
spec:
taskSpec:
steps:
- image: ubuntu
script: echo "hello there"
下面是一个为多租户场景量身定制的示例 Trigger 定义,您可能不希望所有 Trigger 对象都具有与 EventListener 相同的权限。 在这种情况下,你可以在Trigger级别指定不同的服务帐户。 此服务帐户会覆盖在 EventListener 中指定的服务帐户。
triggers:
- name: trigger-1
serviceAccountName: trigger-1-sa
interceptors:
- github:
eventTypes: ["pull_request"]
bindings:
- ref: pipeline-binding
- ref: message-binding
template:
ref: pipeline-template
你必须更新分配给EventListener中指定的服务账户的Role,如下所示,以允许它模拟 Trigger中指定的服务账户。
rules:
- apiGroups: [""]
resources: ["serviceaccounts"]
verbs: ["impersonate"]
指定TriggerGroups
TriggerGroups 是一项功能,允许你指定一组拦截器,这些拦截器将在事件侦听处理一组 Trigger 资源之前进行处理。TriggerGroups 允许在调用 Triggers 之前在 EventListenerSpec 中内部定义一组通用拦截器。
TriggerGroups 当前是 alpha 功能。 要使用它,需要使用 v1beta1 API 版本,并将 enable-api-fields 设置为 alpha。
您可以选择指定一个或多个 Triggers 来定义当 EventListener 检测到符合条件的事件时要执行的操作。 您可以指定对外部Trigger对象的引用,也可以在Trigger定义中引用/定义TriggerBindings、TriggerTemplates和Interceptors。TriggerGroup 定义指定以下字段:
name- (可选)唯一标识 TriggerGroup 的有效 Kubernetes 名称interceptors- 在将事件有效负载数据传递给下游触发器之前处理事件负载数据的拦截器列表triggerSelector- KuberneteslabelSelector和namespaceSelector的组合,在本文档后面有定义。这两个字段共同定义了拦截器处理完成后将被处理的Triggers。
下面是一个定义了内联triggerGroup的EventListener的例子:
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: eventlistener
spec:
triggerGroups:
- name: github-pr-group
interceptors:
- name: "validate GitHub payload and filter on eventType"
ref:
name: "github"
params:
- name: "secretRef"
value:
secretName: github-secret
secretKey: secretToken
- name: "eventTypes"
value: ["pull_request"]
triggerSelector:
labelSelector:
matchLabels:
type: github-pr
这个配置将首先处理任何发送到EventListener的事件,并确定它是否符合概述的条件。如果它通过了这些条件,它将使用triggerSelector匹配标准来确定继续处理的目标Trigger资源。
在 triggerGroup 处理期间添加的任何 extensions 字段都将传递给下游 Trigger 执行。这允许在组执行完成后处理的所有触发器之间共享数据。 例如,extensions.myfield 将可用于该组匹配的所有 Trigger 资源:
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: eventlistener
spec:
triggerGroups:
- name: cel-filter-group
interceptors:
- name: "validate body and add field"
ref:
name: "cel"
params:
- name: "filter"
value: "body.action in ['opened', 'reopened']"
- name: "overlays"
value:
- key: myfield
expression: "body.pull_request.head.sha.truncate(7)"
triggerSelector:
namespaceSelector:
matchNames:
- foo
labelSelector:
matchLabels:
type: cel-preprocessed
这时,每个TriggerGroup决定它自己的下游Triggers,所以如果两个独立的组选择相同的下游Trigger资源,它可能被多次执行。如果你使用这个功能,确保Trigger资源被标记为被适当的TriggerGroups集合查询。
指定Resources
你可以选择使用resources字段为你的EventListener自定义接收部署。它接受以下类型的对象:
- 使用
kubernetesResource字段的Kubernetes资源 - 通过
CustomResource字段的自定义资源对象
kubernetesResource 和 CustomResource 字段的 PodSpec 和 Containers 子字段的合法值是:
ServiceAccountName
NodeSelector
Tolerations
Volumes
Containers
Containers 子字段的合法值为:
Resources
VolumeMounts
Env
