Kubernetes 이야기

Tekton Trigger 본문

Kubernetes/devops

Tekton Trigger

kmaster 2022. 9. 14. 23:15
반응형

Tekton Triggers는 이벤트 페이로드에서 추출한 정보를 기반으로 Kubernetes 리소스를 생성할 수 있는 Kubernetes 사용자 지정 리소스 정의 (CRD) 컨트롤러이다.

 

 Tekton Triggers는 다양한 소스의 이벤트에서 정보를 감지 및 추출하고 해당 정보를 기반으로 TaskRun 및 PieplineRun을 실행할 수 있는 Tekton 구성 요소이다. Tekton Trigger는 이벤트에서 추출된 정보를 TaskRuns 및 PipelineRuns로 직접 전달할 수도 있다.

 

Tekton Trigger의 구성도는 다음과 같다.

 

https://github.com/tektoncd/triggers/blob/main/docs/README.md

 

1) Event Listener : EventListener는 GitLab에서 들어오는 HTTP 요청을 수신 대기하고 Trigger를 실행하는 Kubernetes 서비스이다.

2) Trigger : 트리거의 작업은 인터셉터, TriggerBindings 및 TriggerTemplates를 사용하여 요청을 할당하고 처리하는 것을 기반으로 한다.

3) TriggerBinding : 바인딩을 사용하여 요청의 JSON 본문에 액세스하고 git 저장소의 URL 및 분기 이름과 같은 필요한 정보를 추출한다.

4) TriggerTemplate : 이 시점에서 실제 호출이 이루어진다. 즉, 추출된 매개변수가 여기에서 참조되고 PipelineRun과 같은 템플릿에서 사용할 수 있다.

5) Interceptor : 페이로드 필터링 및 비밀을 사용하여 검증을 수행한다. 인터셉터는 TriggerBinding 전에 실행되는 이벤트 프로세서이다.

 

Trigger를 사용해서 다음과 같은 CI/CD 워크플로우를 구현할 수 있다.

 

1) 트리거는 git commit 또는 git pull 요청 이벤트를 수신하여 이벤트가 검출되면 커밋된 코드에 대해 단위 테스트 Pipeline을 실행한다.

2) 트리거는 테스트가 성공적으로 완료되었음을 나타내는 git push 이벤트를 수신한다. 하나를 탐지하면 테스트 결과를 검증하고 테스트된 코드를 빌드하는 파이프라인을 실행한다.

3) 연결된 PipelineRun이 실행을 완료하면 트리거는 빌드 결과를 확인하고, 성공하면 선택한 도커 레지스트리에 빌드 아티팩트를 업로드하는 작업을 실행한다.

4) 마지막으로 Docker 레지스트리는 Pub/Sub에 이벤트를 전송하고, Pipeline은 빌드 아티팩트를 준비 환경으로 푸시한다.

 

Tekton Trigger를 사용하기 위해서는 설치를 먼저 진행해야 한다.

 

설치

Tekton Trigger를 설치한다.

kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml

Trigger에는 Interceptor가 필요하다. 다음과 같이 Interceptor를 설치한다.

kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/interceptors.yaml

설치가 완료되면 아래와 같이 3개의 pod가 실행된다.

tekton-pipelines   pod/tekton-triggers-controller-dbb46c886-bslgn           1/1     Running     0               19m     192.168.166.150   node1    <none>           <none>
tekton-pipelines   pod/tekton-triggers-core-interceptors-57dd764784-m66jq   1/1     Running     0               19m     192.168.166.151   node1    <none>           <none>
tekton-pipelines   pod/tekton-triggers-webhook-587c7b599d-b54m8             1/1     Running     0               19m     192.168.104.36    node2    <none>

 

설치가 완료되었으면 이제 내부 Gitea 를 위한 Trigger 를 설정해 보자.

 

Trigger 설정

1) Gitea 인터셉터를 위해서는 SecretToken 이 필요하다. 이 토큰은 Gitea 에서 웹훅을 생성할 때 설정되며 요청이 도착하면 Gitea 인터셉터에 의해 검증된다.

apiVersion: v1
kind: Secret
metadata:
  name: gitea-secret
type: Opaque
stringData:
  secretToken: "abc123!@#"

 

2) EventListener 생성

apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: gitea-event-listener
spec:
  serviceAccountName: gitlab-listener-sa
  triggers:
    - triggerRef: gitea-listener-trigger
  resources:
    kubernetesResource:
      serviceType: NodePort

 

3) Trigger 생성

apiVersion: triggers.tekton.dev/v1beta1
kind: Trigger
metadata:
  name: gitea-listener-trigger
spec:
  bindings:
    - ref: binding
  template:
    ref: template

 

4) TriggerBinding 생성

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
  name: binding
spec:
  params:
    - name: gitrevision-tag
      value: master

 

5) TriggerTemplate 생성

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: template
spec:
  params:
    - name: gitrevision-tag
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
         generateName: pipeline-run-
      spec:
        serviceAccountName: tekton-sa
        pipelineRef:
          name: pipeline 
        params: 
        - name: gitrevision-tag
          value: master       
        workspaces:  
        - name: shared-data 
          volumeClaimTemplate:
            spec:
              accessModes:
              - ReadWriteOnce
              resources:
                requests:
                  storage: 1Gi

 

6) webhook을 위한 service account와 권한을 설정하자.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab-listener-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: triggers-example-eventlistener-binding
subjects:
- kind: ServiceAccount
  name: gitlab-listener-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: gitlab-listener-sa
  namespace: test
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: tekton-triggers-eventlistener-clusterroles

 

생성된 결과는 다음과 같다.

# k get el -A
NAMESPACE   NAME                   ADDRESS                                                      AVAILABLE   REASON                     READY   REASON
test        gitea-event-listener   http://el-gitea-event-listener.test.svc.cluster.local:8080   True        MinimumReplicasAvailable   True

 

이제, Gitea 에서 webhook을 설정해 보자.

 

이제 소스를 변경하여 push 하면 아래와 같이 push 이벤트가 발생한다.

그리고 el-gitea-event-listener pod에도 정상적으로 webhook이 실행된다.

{"severity":"info","timestamp":"2022-09-14T14:04:02.672Z","logger":"eventlistener","caller":"sink/sink.go:409","message":"ResolvedParams : [{Name:gitrevision-tag Value:master}]","eventlistener":"gitea-event-listener","namespace":"test","/triggers-eventid":"46bd6b1e-e2e8-4e48-9380-aa23d483883c","eventlistenerUID":"d7b572d1-e769-49d4-9cc4-956b7c6e092e","/triggers-eventid":"46bd6b1e-e2e8-4e48-9380-aa23d483883c","/trigger":"gitea-listener-trigger"}
{"severity":"info","timestamp":"2022-09-14T14:04:02.674Z","logger":"eventlistener","caller":"resources/create.go:98","message":"Generating resource: kind: &APIResource{Name:pipelineruns,Namespaced:true,Kind:PipelineRun,Verbs:[delete deletecollection get list patch create update watch],ShortNames:[pr prs],SingularName:pipelinerun,Categories:[tekton tekton-pipelines],Group:tekton.dev,Version:v1beta1,StorageVersionHash:RcAKAgPYYoo=,}, name: pipeline-run-"}
{"severity":"info","timestamp":"2022-09-14T14:04:02.674Z","logger":"eventlistener","caller":"resources/create.go:106","message":"For event ID \"46bd6b1e-e2e8-4e48-9380-aa23d483883c\" creating resource tekton.dev/v1beta1, Resource=pipelineruns"}

최종적으로 파이프라인 성공 메시지를 확인할 수 있다.

 

gitea 로 테스트를 하여 validation 체크나 tag 정보등을 수집하지는 않고 단순히 pipeline만 자동실행 되도록 해 보았다. github나 gitlab은 이미 interceptor가 정의되어 있어 쉽게 페이로드 데이터를 파싱할 수 있으나, gitea는 interceptor를 위한 모듈을 설치해야 한다.

 

다만, 내부망이나 보안 문제로 인해 github나 gitlab으로 이벤트를 수신하기 어려운 곳에서는 interceptor를 설치하여 운영하면 쉽게 연동이 가능하다.

반응형

'Kubernetes > devops' 카테고리의 다른 글

dapr  (0) 2022.09.30
DevSpace  (0) 2022.09.29
Tekton을 이용한 CI/CD  (0) 2022.09.12
Jenkins와 Keycloak을 이용한 OIDC 연동  (0) 2022.09.10
jenkins 를 활용하여 Kubernetes에 이미지 배포 및 모니터링  (0) 2022.09.08
Comments