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
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
Author And Source
이 문제에 관하여(Tekton으로 CI/CD 구축하기 - 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@sgwon1996/Tekton으로-CICD-구축하기-1
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
Author And Source
이 문제에 관하여(Tekton으로 CI/CD 구축하기 - 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sgwon1996/Tekton으로-CICD-구축하기-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)