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에서 값들을 입력 받을 수 있습니다.
Secret : GitHub, DockerHub 등 외부 서비스에 접속할 때 필요한 Credential을 정의합니다.
ConfigMap : 로컬 Kubernetes Cluster에 접속할 때 필요한 kubeconfig 값을 정의합니다.
ServiceAccount - Secret를 연결시켜 사용할 수 있습니다.
Persistent Volume Claim - Task를 실행시킬 때 필요한 Volume를 정의합니다.
Tekton Catalog - Task, Pipeline을 공유할 수 있는 저장소
Tekton Hub - Tekton Catalog에 접근할 수 있는 Web 기반 도구
Kubernetes 내부에 Tekton을 활용한 CI/CD 파이프라인을 구축하기 위해 환경 구성하는 방법을 알아보겠습니다.
# 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-pipelines
namespace에 tekton-pipelines-controller
, tekton-pipelines-webhook
이 설치 됩니다.# 실행 결과 확인
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!"
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
generateName: hello-run-
spec:
taskRef:
name: hello
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
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
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