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