Tekton Tutorial - Task와 PipelineRun 다뤄보기!

Overview

이전 포스팅에서는 Tekton이 무엇이고, Tekton의 컴포넌트에 대해서 알아보았습니다.
이번 포스팅에서는 Tekton을 설치해보고, 쿠버네티스 클러스터와 어떻게 상호작용을 할 수 있는지 실습을 진행하겠습니다.

참고 : tekton.dev - getting started

1. Tekton 설치하기

tekton (v0.24.1) 설치

$ kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.24.1/release.yaml

cri-o를 사용하는 OpenShift 4.x 같은 image-reference:tag@digest를 지원하지 않는 경우 :

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

설치 확인:

$ kubectl get pods --namespace tekton-pipelines

NAME                                           READY   STATUS    RESTARTS   AGE
tekton-pipelines-controller-5f88bb8695-r87jh   1/1     Running   0          21s
tekton-pipelines-webhook-77d48dc65c-2snwz      1/1     Running   0          21s

2. Tekton CLI 설치

Tekton CLI는 tekton 컴포넌트들을 쉽게 볼 수 있게 해주는 역할을 합니다.
(그냥 kubectl get task 이런식으로 볼 수도 있음)

먼저 OS에 따라 맞는 버전을 설치해주세요.
tektoncli - releases

저는 리눅스용으로 받았습니다.
rpm으로 설치 :

$ rpm -Uvh https://github.com/tektoncd/cli/releases/download/v0.18.0/tektoncd-cli-0.18.0_Linux-64bit.rpm

Retrieving https://github.com/tektoncd/cli/releases/download/v0.18.0/tektoncd-cli-0.18.0_Linux-64bit.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:cli-0:0.18.0-1                   ################################# [100%]

cli 설치 완료

$ tkn version

Client version: 0.18.0
Pipeline version: v0.24.1

3. Task 돌려보기!

tekton 설치가 완료되었으니 이번엔 tekton으로 돌릴 수 있는 최소단위인 task를 돌려보도록 하겠습니다.

3.1 Task 정의

먼저 아래와 같은 간단한 task를 정의합니다.

$ vim task-hello.yaml

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello
spec:
  steps:
    - name: hello
      image: ubuntu
      command:
        - echo
      args:
        - "Hello World!"

task는 작업하나를 나타내는 step의 집합입니다.
그래서 spec부분에는 각 step들이 정의가 되어있습니다.

예시의 hello라는 step은 ubuntu이미지의 echo커맨드로 "Hello World"라는 문자열을 출력하는 작업입니다.

3.2 Task 배포

task를 Kubernetes 클러스터에 배포:

$ kubectl apply -f task-hello.yaml

배포된 Task를 확인하려면:

$ kubectl get task
NAME    AGE
hello   4s

또는

$ tkn task list
NAME    DESCRIPTION   AGE
hello                 3 minutes ago

3.3 Task 실행

지금은 단순히 작업들의 나열이 클러스터에 배포된 상태입니다.
이 작업들을 실행시키려면 tkn 커맨드를 사용하거나, taskrun파일을 생성하여 실행할 수 있습니다.

tkn start 사용 :

$ tkn task start hello
TaskRun started: hello-run-lzspr

또는 TaskRun파일을 만들어서 실행할수도 있습니다.
위의 명령어에 --dry-run를 붙이면 TaskRun yaml파일을 출력합니다.
이걸 파일로 떨어뜨려서 따로 kubectl create로 실행시키면 끝입니다.

$ tkn task start hello --dry-run

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  creationTimestamp: null
  generateName: hello-run-
  namespace: default
spec:
  resources: {}
  serviceAccountName: ""
  taskRef:
    name: hello
status:
  podName: ""
$ tkn task start hello --dry-run > taskRun-hello.yaml

metadatagenerateName은 yaml파일을 실행할 때마다 새로운 이름을 부여해줍니다.
일반적으로 적는 name대신, generateName{NAME}- 형식으로 적어주면 됩니다.

CICD파이프라인의 경우 동일한 파이프라인을 트리거를 통해 자동으로 실행하기 때문에 generateName을 써주는게 일반적입니다.

3.4 실행된 Task 확인하기

실행된 Task들의 리스트를 보려면 :

$ tkn taskrun list

NAME              STARTED          DURATION     STATUS
hello-run-lzspr   14 seconds ago   10 seconds   Succeeded

또는

$ kubectl get taskrun

NAME              SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
hello-run-lzspr   True        Succeeded   88s         78s

3.5 Task 로그 확인

$ tkn tr logs hello-run-lzspr

[hello] Hello World!

--last를 붙이면 가장 최근에 실행한 TaskRun의 로그를 출력합니다.(-f는 끊어지지 않고 계속 출력)

$ tkn tr logs hello-run-lzspr --last -f

[hello] Hello World!

4. Pipeline 돌려보기!

이번엔 task들의 집합인 Pipeline을 만들어서 돌려보도록 하겠습니다.

4.1 task생성 및 배포

위에서 생성한 task와 별개로 새로운 task를 하나 생성해주도록 합시다.

$ vim task-goodbye.yaml

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: goodbye
spec:
  steps:
    - name: goodbye
      image: ubuntu
      script: |
        #!/bin/bash
        echo "Goodbye World!"

아까 task와 유사하게,
ubuntu이미지에서 script를 실행하는데 "Goodbye World"를 출력하는 작업을 합니다.

4.2 Pipeline 생성 및 배포

이제 각 task를 실행할 Pipeline을 생성하겠습니다.

$ vim pipeline.yaml

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: hello-goodbye
spec:
  tasks:
  - name: hello
    taskRef:
      name: hello
  - name: goodbye
    runAfter:
     - hello
    taskRef:
      name: goodbye

Pipeline의 Spec에는 Task들의 나열이 정의되어 있습니다.
이름과 taskRef를 통해 배포된 Task들을 명시할 수 있습니다.

배포:

$ kubectl apply -f pipeline.yaml

pipeline.tekton.dev/hello-goodbye created

4.3 PipelineRun 생성 및 배포

*) task를 실행시킬때와 다르게 Pipeline을 실행시킬 때에는 따로 TaskRun을 만들 필요가 없습니다.

TaskRun과 유사하게 --dry-run을 통해 PipelineRun yaml파일을 얻어낼 수 있습니다.

$ tkn pipeline start hello-goodbye --dry-run

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  creationTimestamp: null
  generateName: hello-goodbye-run-
  namespace: default
spec:
  pipelineRef:
    name: hello-goodbye
status: {}

배포:

$ tkn pipeline start hello-goodbye --dry-run > pipelineRun-hello-goodbye.yaml

$ kubectl create -f pipelineRun-hello-goodbye.yaml

4.4 결과 확인

로그를 출력해보면:

$ tkn pipelinerun logs --last -f

[hello : hello] Hello World!
[goodbye : goodbye] Goodbye World!

두 개의 task가 정상적으로 실행되는 것을 확인할 수 있습니다.

5. [참고] Pipeline에서 parameter 다루기

PipelineRun에서는 Pipeline를 실행시키는 역할을 할 뿐만 아니라 특정 파라미터를 넘길 수 있습니다.

5.1 PipelineRun에서 Pipeline으로 넘길 파라미터 정의

위에서 만들었던 task와 pipeline들을 약간만 수정해보도록 하겠습니다.
원래는 지정된 문장을 출력하는 task였지만, PipelineRun에서 넘겨주는 문장을 출력하도록 바꿔보도록 하겠습니다.

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  creationTimestamp: null
  generateName: hello-goodbye-run-
  namespace: default
spec:
  pipelineRef:
    name: hello-goodbye
  params:
    - name: whatyousay
      value: helllllloooooo

spec의 params에서 변수이름과 값을 정의

5.2 Pipeline에서 task로 넘길 파라미터 정의

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: hello-goodbye
spec:
  params:
    - name: whatyousay
      type: string
      description: ddd
      default: byebye
  tasks:
  - name: hello
    taskRef:
      name: hello
    params:
      - name: whatyousay
        value: "$(params.whatyousay)"

spec.params에서 PipelineRun에서 넘어올 변수의 이름과 type, description, 넘어올 값이 없을 경우의 default값을 정의

task로 넘길 변수는 taskstask아래 params에 정의

5.3 받아온 파라미터를 어떻게 사용할 지 task에 정의

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello
spec:
  params:
    - name: whatyousay
      type: string
  steps:
    - name: hello
      image: ubuntu
      command:
        - echo
      args:
        - "$(params.whatyousay)"

Pipeline과 마찬가지로 어떤 변수를 사용할건지 spec.params에 선언

steps에 받아온 파라미터를 어떻게 사용할 건지 정의

5.4 로그 확인

$ tkn pr logs hello-goodbye-run-fk6gf

[hello : hello] helllllloooooo

파이프라인을 실행 후, 로그를 확인해보니 정상적으로 PipelineRun에서 받아온 변수를 출력하는 것을 확인할 수 있습니다.

6. Tekton Dashboard

image

참고 : Tekton.dev -Dashboard

지금까지는 CLI환경에서 Tekton을 다뤄봤습니다.
아직 기능이 많지는 않지만 Tekton에서는 자체 Dashboard도 제공하고 있습니다.

근데 Dashboard 버전별로 호환 가능한 Tekton Pipeline버전이 있으니 아래 링크를 참고하여 맞는 버전을 설치하면 됩니다.
Tekton Dashboard - Which version should I use?

Version Docs Pipelines Triggers
HEAD Docs @ HEAD v0.20.x - v0.24.x v0.10.x - 0.14.x
v0.17.0 Docs @ v0.17.0 v0.20.x - v0.24.x v0.10.x - 0.14.x
v0.16.1 Docs @ v0.16.1 v0.20.x - v0.23.x v0.10.x - 0.13.x
v0.15.0 Docs @ v0.15.0 v0.20.x - v0.22.x v0.10.x - 0.12.x
v0.14.0 Docs @ v0.14.0 v0.11.x - v0.20.x v0.5.x - 0.11.x
v0.13.0 Docs @ v0.13.0 v0.11.x - v0.20.x v0.5.x - 0.10.x
v0.12.0 Docs @ v0.12.0 v0.11.x - v0.19.x v0.5.x - 0.10.x
v0.11.1 Docs @ v0.11.1 v0.11.x - v0.18.x v0.5.x - 0.9.x
v0.10.2 Docs @ v0.10.2 v0.11.x - v0.17.x v0.5.x - 0.9.x
v0.9.0 Docs @ v0.9.0 v0.11.x - v0.15.x v0.5.x - 0.7.x
v0.8.2 Docs @ v0.8.2 v0.11.x - v0.14.x v0.5.x - 0.6.x
v0.7.1 Docs @ v0.7.1 v0.11.x - v0.13.x v0.5.x - 0.6.x
v0.6.1.5 Docs @ v0.6.1.5 v0.11.x - v0.12.x v0.4.x

이 포스팅에서는 Tekton Pipeline v0.24.1을 사용하고 있으니, 현재(21.06.13)가장 최신인 Dashboard v0.17.0을 설치해보겠습니다.

$ kubectl apply --filename https://github.com/tektoncd/dashboard/releases/download/v0.17.0/tekton-dashboard-release.yaml

Tekton Dashboard Release -versions

서비스를 외부에 노출시킨 뒤, 접속해보면 다음과 같은 GUI 화면을 확인할 수 있습니다.

image
image


댓글남기기