Tekton으로 CI/CD 구축하기 - 1

개요

  • Tekton : CI/CD 파이프라인을 구축할 수 있는 Cloud Native 오픈 소스
  • Tekton은 Step, Task, TaskRun, Pipeline, Pipeline 등을 Kubernetes Custom resources(CRD)로 정의해 Kubernetes 내부에서 동작합니다.
  • CRD : Custom Resource Definition로 Kubernetes Resource를 직접 정의해 사용할 수 있습니다.

Tekton 구조

Tekton Pipeline Entities

  • Step : Tekton의 기본 작업 단위로 Git clone, Image Build, Deploy 등 다양한 작업을 실행 시킬 수 있습니다.

  • Task : 순서를 지닌 Step들의 모음으로 Tekton은 Task를 Kuberntes Pod으로 동작시키며 내부에 존재하는 Step들에게 동일한 환경을 보장, Kubernetes Volume을 Workspace로 mount 가능합니다.

  • TaskRun : 단일 Task를 실행시키는 역할로 TaskRun을 생성하면 Pod이 생성되어 로그를 통해 실행 결과를 조회합니다.

  • Pipeline : 순서를 지닌 Task의 모음으로 task들의 실행 조건들을 설정할 수 있습니다.

  • PipelineRun : 단일 Pipeline을 실행시키는 역할로 PipelineRun이 생성되면 해당 Pipeline 내부에 있는 Task들을 참조해 TaskRun을 만듭니다.

  • Workspace : Task가 TaskRun에 의해 실행될 때 필요한 Volume을 정의할 수 있습니다. Persistent Volume Claim을 통해 다른 Task들과 Volume을 공유하거나 Secret, ConfigMap, Service Account를 통해 설정 정보를 입력 받을 수 있습니다.

  • Parameter : Task에서 필요한 값들을 미리 Parameter로 정의한 후 Pipeline, TaskRun, PipelineRun에서 값들을 입력 받을 수 있습니다.

Tekton이 사용하는 Kubernetes Resource

  • Secret : GitHub, DockerHub 등 외부 서비스에 접속할 때 필요한 Credential을 정의합니다.

  • ConfigMap : 로컬 Kubernetes Cluster에 접속할 때 필요한 kubeconfig 값을 정의합니다.

  • ServiceAccount - Secret를 연결시켜 사용할 수 있습니다.

  • Persistent Volume Claim - Task를 실행시킬 때 필요한 Volume를 정의합니다.

Tekton이 제공하는 편리한 도구

  • Tekton Dashboard - Tekton Pipeline에 대한 정보, 실행 결과등을 볼 수 있는 Web 기반 도구

  • Tekton Catalog - Task, Pipeline을 공유할 수 있는 저장소

  • Tekton Hub - Tekton Catalog에 접근할 수 있는 Web 기반 도구

Tekton 환경 구성하기

Kubernetes 내부에 Tekton을 활용한 CI/CD 파이프라인을 구축하기 위해 환경 구성하는 방법을 알아보겠습니다.

Tekton Resource 및 Dashboard 설치

# Tekton Resource 설치
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
# Tekton Dashboard 설치
kubectl apply --filename https://github.com/tektoncd/dashboard/releases/latest/download/tekton-dashboard-release.yaml
  • Tekton Pipeline, Component of Tekton 설치
  • tekton-pipelines namespace에 tekton-pipelines-controller, tekton-pipelines-webhook 이 설치 됩니다.
  • Tekton의 Custom Resource - Task, Pipeline, TaskRun, PipelineRun 등을 사용할 수 있게 됩니다.
  • Tekton Pipeline의 실행 결과를 시각화 해주는 Tekton DashBoard 설치
# 실행 결과 확인
vagrant@node-1:~$ k get all -n tekton-pipelines

NAME                                              READY   STATUS    RESTARTS   AGE
pod/tekton-dashboard-7487777d44-dl2mf             1/1     Running   2          54d
pod/tekton-pipelines-controller-99b764966-tnwxj   1/1     Running   2          54d
pod/tekton-pipelines-webhook-55c9dd7446-qnjjh     1/1     Running   2          54d

NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                              AGE
service/tekton-dashboard              ClusterIP   10.105.118.80    <none>        9097/TCP                             54d
service/tekton-pipelines-controller   ClusterIP   10.103.122.232   <none>        9090/TCP,8008/TCP,8080/TCP           54d
service/tekton-pipelines-webhook      ClusterIP   10.111.117.100   <none>        9090/TCP,8008/TCP,443/TCP,8080/TCP   54d

NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/tekton-dashboard              1/1     1            1           54d
deployment.apps/tekton-pipelines-controller   1/1     1            1           54d
deployment.apps/tekton-pipelines-webhook      1/1     1            1           54d
  • port-forward 또는 ingress를 통해 Tekton Dashboard의 서비스를 외부에 노출시키면 다음과 같은 화면이 나옵니다.

  • kubectl port-forward service/tekton-dashboard 9097 --namespace=tekton-pipelines

  • 파이프라인의 실행 결과 조회

  • 파이프라인 실행 로그 조회

예시

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello
spec:
  steps:
    - name: hello
      image: ubuntu
      command:
        - echo
      args:
        - "Hello World!"
  • ubuntu image 위에서 Hello World를 출력하는 hello Task
  • kubectl apply -f task-hello.yaml를 통해 Task를 생성
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  generateName: hello-run-
spec:
  taskRef:
    name: hello
  • hello Task를 실행하기 위한 TaskRun
  • kubectl create -f taskRun-hello.yaml를 통해 TaskRun 생성

  • port-forward를 통해 띄운 tekton dashboard를 통해 결과 확인

Tekton으로 CI/CD 구축하기

  • 깃허브에 특정 태그를 푸시하면 jib로 이미지를 빌드. 도커 허브로 푸시, 로컬 클러스터로 배포를 진행하는 파이프라인을 Tekton을 통해 만들어 보겠습니다.
  • 이전 글에서 만들었던 로컬 클러스터에 배포되어 있는 Deployment의 이미지를 교체하는 것을 최종 목표로 합니다.

Tekton 실행을 위해 필요한 K8S Resource 생성

Persistent Volume & Claim

  • Tekton을 실행시키기 위해서는 각 Task들이 사용하는 Volume이 필요합니다.

  • Persistent Volume, Persistent Volume Claim을 정의 해보겠습니다.

  • 실제로 사용하기 위해서는 elb 등 동적으로 Persistent Volume Claim을 구성하거나 로컬 클러스터에서는 nfs를 구성해서 Persistent Volume Claim을 동적으로 할당하는 것이 맞지만 이번 글에서는 간단히 파이프라인 시연을 위해 hostPath를 사용해 Persistent Volume 할당하겠습니다.

  • hostPath : 파드가 동작하는 쿠버네티스 클러스터의 노드(host)의 로컬 파일시스템의 파일 및 디렉토리를 파드가 사용할 수 있는 볼륨으로 제공합니다.

  • Persistent Volume Claim은 storageClassName을 통해 Persistent Volume을 찾으며 성공적으로 연결될 경우 bound 됩니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

~/Desktop/lion/last/devopsTest/k8s/tekton kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
task-pv-volume   5Gi        RWO            Retain           Bound    default/task-pv-claim   manual                  3m14s

~/Desktop/lion/last/devopsTest/k8s/tekton kubectl get pvc
NAME            STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
task-pv-claim   Bound    task-pv-volume   5Gi        RWO            manual         3m13s

ConfigMap, Secret 생성

  • Git, Docker Hub에 접속할 때 필요한 Secret 정보, 클러스터에 접속할 때 필요한 kubeconfig 정보 생성
apiVersion: v1
kind: Secret
metadata:
	name: git-credential
  annotations:
    tekton.dev/git-0: https://github.com
type: kubernetes.io/basic-auth
stringData:
  username: <cleartext username>
  password: <cleartext password>
---
apiVersion: v1
kind: Secret
metadata:
 name: docker-credential
 annotations:
   tekton.dev/docker-0: https://index.docker.io
type: kubernetes.io/basic-auth
stringData:
 username: <cleartext username>
 password: <cleartext password>
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tekton-sa
secrets:
  - name: git-credential
  - name: docker-credential
  • git, docker의 인증은 둘 다 basic-auth 방식을 사용
  • GitHub는 password에 personal Token을 발급 받아 입력
  • GitHub Enterprise, Private Docker Registry를 사용하려면 annotation의 주소를 수정
  • kubectl create configmap kubeconfig --from-file="/path/to/kubeconfig" 명령을 통해 kubeconfig를 configmap으로 만듭니다.
Desktop/lion/last/devopsTest/k8s/tekton kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-d8csp   kubernetes.io/service-account-token   3      27h
docker-credential     kubernetes.io/basic-auth              2      2m30s
git-credential        kubernetes.io/basic-auth              2      2m30s

Desktop/lion/last/devopsTest/k8s/tekton kubectl get configmap
NAME         DATA   AGE
kubeconfig   1      66s

Reference

좋은 웹페이지 즐겨찾기