Tekton之EventListeners

原创
半兽人 发表于: 2022-01-25   最后更新时间: 2022-01-30 22:21:04  
{{totalSubscript}} 订阅, 1,440 游览

EventListeners

EventListener是一个 Kubernetes 对象,它在 Kubernetes 集群上的指定端口监听事件。它公开了一个可寻址接收器,该接收器接收传入事件并指定一个或多个触发器。sink 是一个 Kubernetes 服务,在专用 Pod 中运行 sink 逻辑。

每个 Trigger 反过来允许你指定一个或多个TriggerBindings,允许你从事件有效负载中提取字段及其值,以及一个或多个TriggerTemplates从相应的 TriggerBindings 接收字段值并允许 Tekton 触发器用该数据实例化资源,例如 TaskRunsPipelineRuns

如果您需要在将事件负载数据传递给TriggerBinding之前对其进行修改、过滤或验证,您可以选择指定一个或多个Interceptors(拦截器)

EventListener的结构

一个EventListener定义由以下字段组成:

必需的:

  • apiVersion - 指定目标 API 版本,例如 triggers.tekton.dev/v1alpha1
  • kind - 指定该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定义中引用/定义TriggerBindingsTriggerTemplatesInterceptorsTrigger定义指定以下字段:

  • name -(可选)唯一标识Trigger的有效Kubernetes名称
  • interceptors -(可选)在将事件负载数据传递给关联的 TriggerBinding 之前处理事件负载数据的拦截器列表
  • bindings -(可选)此 Trigger 的 TriggerBindings 列表;可以引用现有的 TriggerBindings 或直接嵌入它们的定义
  • template -(可选)此 Trigger 的 TriggerTemplate;可以引用现有的 TriggerTemplate 或直接嵌入其定义
  • triggerRef -(可选)对外部Trigger的引用

下面是一个Trigger例子定义,它引用了需要的 TriggerBindingsTriggerTemplatesInterceptors

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定义中引用/定义TriggerBindingsTriggerTemplatesInterceptorsTriggerGroup 定义指定以下字段:

  • name - (可选)唯一标识 TriggerGroup 的有效 Kubernetes 名称
  • interceptors - 在将事件有效负载数据传递给下游触发器之前处理事件负载数据的拦截器列表
  • triggerSelector - Kubernetes labelSelectornamespaceSelector的组合,在本文档后面有定义。这两个字段共同定义了拦截器处理完成后将被处理的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 字段的自定义资源对象

kubernetesResourceCustomResource 字段的 PodSpecContainers 子字段的合法值是:

ServiceAccountName
NodeSelector
Tolerations
Volumes
Containers

Containers 子字段的合法值为:

Resources
VolumeMounts
Env
更新于 2022-01-30

查看Tekton更多相关的文章或提一个关于Tekton的问题,也可以与我们一起分享文章