Cloud/CI CD

tekton에 대해서 알아보자

Taemy 2021. 9. 5. 21:42

 

출처: https://tekton.dev/

 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 환경을 사용한다면 도입을 고려해볼만한 툴이다.