tekton은 Cloud 기반 CI/CD 툴로, Kubernetes 위에 설치된다.
Jenkins 나 CircleCI 같은 툴과는 달리 Kubernetes 기반으로 나온 툴이기 때문에 대부분의 기능들이 Kubernetes 기반으로 동작한다. 당연히 각 Workflow들은 Pod 기반으로 동작한다. 개발 중인 Application이 Kubernetes에 올라가는 것을 전제로 한다면 여러가지로 실 환경에 가깝게 구성해볼 수 있다는 장점이 있다.
Prerequisites
(https://tekton.dev/docs/getting-started/)
- A Kubernetes cluster version 1.15 or higher for Tekton Pipelines v0.11.0 or higher, or a Kubernetes cluster version 1.11 or higher for Tekton releases before v0.11.0.
- Enable Role-Based Access Control (RBAC) in the cluster.
- Grant current user the cluster-admin role.
v0.11.0 버전 이상에서는 최소 K8s 1.15 버전 이상, v0.11.0 이전 버전에서는 K8s 1.11 버전 이상이 필요하다
설치 방법
아래 커맨드를 입력한다.
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
다른 CI/CD 툴들과 마찬가지로 서빙을 위한 작업을 명세해줄 Pipeline 부분과 이 pipeline이 트리거되기 위한 trigger를 제공한다.
pipeline 구성요소들의 목록은 아래와 같다.(https://github.com/tektoncd/pipeline/blob/main/docs/README.md)
Task | Defines a series of steps which launch specific build or delivery tools that ingest specific inputs and produce specific outputs. |
TaskRun | Instantiates a Task for execution with specific inputs, outputs, and execution parameters. Can be invoked on its own or as part of a Pipeline. |
Pipeline | Defines a series of Tasks that accomplish a specific build or delivery goal. Can be triggered by an event or invoked from a PipelineRun. |
PipelineRun | Instantiates a Pipeline for execution with specific inputs, outputs, and execution parameters. |
PipelineResource | Defines locations for inputs ingested and outputs produced by the steps in Tasks. |
Run (alpha) | Instantiates a Custom Task for execution when specific inputs. |
각 Task, Pipeline을 구성한 후 TaskRun, PipelineRun을 생성하여 동작시킬 수 있다.
Pipeline의 경우 Jenkins의 그 Pipeline과 유사한 단위로 볼 수 있고, Task는 Jenkins pipeline내 각 Stage와 유사한 단위라고 볼 수 있다. Task 내에도 step으로 여러 동작을 나눠 동작시킬 수 있다.
이 때 Pipeline은 Kubernetes에서 여러 개의 Pod로 구성되고, 1개의 Task는 1개의 Pod로 구성된다. 또한 Task내의 각 Step들은 Pod 내의 Container로 동작한다. 따라서 Task 1개 안에 여러 개의 Step이 있을 경우, 여러개의 컨테이너를 가진 Pod로 Task가 구성된다.
그렇기 때문에 각 Step 별로 필요한 이미지들을 다 다르게 사용할 수 있고, Container 들로 구성되었기 때문에 Pod 내 Network namespace를 공유한다. 대체로 다른 CI/CD 툴이 그렇듯 Container 단위로 Step이 구성된 경우 결과물을 서로 공유하고 싶다면 Volume을 Mount시켜서 결과물을 전달시키는 것으로 이를 해결할 수 있다.
yaml형식으로 세부 환경을 지정해주어야 하기 때문에 Kubernetes를 잘 안다면 상대적으로 자유롭게 Pipeline을 구성할 수 있으나, 반대로 동작하고 있는 Kubernetes Cluster의 환경을 파악해야하기 때문에 상대적으로 다른 툴에 비해 배경 지식이 필요한 편이다.
Task: Integration 혹은 Delivery를 진행하는 단계 자체를 정의한다. 간단히 예제로 echo helloworld 같은 동작을 실제로 수행하는 부분이다. 기본적으로 스펙으로써 step을 요구하고 있고, 각 step은 동작을 나눌 수 있는 최소단위다. step은 container 하나로 동작하고, 따라서 step 단위로 image를 달리 해서 사용할 수 있다.
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: echo-hello-world
spec:
steps:
- name: echo
image: ubuntu
command:
- echo
args:
- "Hello World"
위의 내용이 tutorial에 있는 Task의 예시 항목이다. metadata에는 사용하고자 하는 Task의 이름을 명시한다.
spec아래에는 각 스텝에 대한 상세 동작을 명시한다. tutorial의 경우에는 command에 echo, args에 Hello World를 사용했기 때문에 ubuntu 이미지를 사용해서 파드를 생성한 후 echo "Hello World"를 동작시키는 Task가 생성된다고 볼 수 있다.
Piperun: 1개 이상의 Task로 이루어져 있는 Workflow 단위이다. TaskSpec, 혹은 TaskRef 로 여러 Task를 포함해서 구성할 수 있고 TaskRef로 구성하는 경우에는 Task를 위한 Parameter를 개별적으로 입력할 수 있다.
Pipeline에서 정의한 값들은 각 Task단계에서 참조해서 쓸 수 있다.
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: tutorial-pipeline
spec:
resources:
- name: source-repo
type: git
- name: web-image
type: image
tasks:
- name: build-skaffold-web
taskRef:
name: build-docker-image-from-git-source
params:
- name: pathToDockerFile
value: Dockerfile
- name: pathToContext
value: /workspace/docker-source/examples/microservices/leeroy-web #configure: may change according to your source
resources:
inputs:
- name: docker-source
resource: source-repo
outputs:
- name: builtImage
resource: web-image
- name: deploy-web
taskRef:
name: deploy-using-kubectl
resources:
inputs:
- name: source
resource: source-repo
- name: image
resource: web-image
from:
- build-skaffold-web
params:
- name: path
value: /workspace/source/examples/microservices/leeroy-web/kubernetes/deployment.yaml #configure: may change according to your source
- name: yamlPathToImage
value: "spec.template.spec.containers[0].image"
우수한 CICD툴들이 많지만 고유 문법으로 인해 러닝커브가 있거나 유료인 경우가 많다.
Tekton은 K8s를 경험했다는 가정하에 yaml만으로 Workflow를 정의할 수 있고 무료라는 장점이 있다. K8s 환경을 사용한다면 도입을 고려해볼만한 툴이다.