Tekton 사용법(2) — pipeline 실행

Jerry(이정훈)
16 min readFeb 5, 2021

--

전편에서 Tekton 설치 및 기본 환경 설정을 완료하였다. 이제 CI/CD Pipeline 예제를 실행해 보겠다.

테스트 시나리오는 개발자가 java source 파일 수정 후 war file을 Git에 올리고 관련 Dockerfile을 수정 후 Commit 한다. 그리고 아래 Tekton yaml 파일을 실행하면 Tekton이 해당 이미지 Tag 버전으로 도커 이미지 Build 하고 컨테이너 Repository로 Push 한다. (첫번째 Task) 이 후 변경된 해당 이미지 Tag 기준으로 Git source kube deployment yaml 파일을 kube 환경으로 자동 배포한다. (두번째 Task)

해당 첫번째 Task 파일이다.

  • docker build를 docker로 하지 않고 kaniko를 이용해서 수행한다. (자세한 kaniko 내용은 구글 검색 참조)
  • kaniko 명령어 옵션으로 변수를 지정하여 각각 dockerfile 위치, destination 컨테이너 repository 위치, context 작업 폴더 위치를 지정 하였다.
  • — skip-tls-verify
    : 이것 찾는다고 또 2~3일 소요하였다. 이 옵션을 추가해야 사설 컨테이너 repository로 이미지 Push 시 http 가 아닌 https로 접속한다.

가장 특이한 건, Tekton 에서는 Task 파일에서 변수는 선언만 하고 변수의 실제 Value는 해당 Task를 호출하는 Pipeline 혹은 Taskrun 에서 지정한다는 것이다. 마치 프로그램 언어에서 변수를 사용하는 것과 유사하다. (난 언어 1도 모르기도 하지만) 위 에서도 pathToDockerfile, image-repo, imageTag 등의 value는 아래에 나오는 pipeline에서 지정한다.

두번째 Task file 이다.

kube deployment yaml 파일 이미지 버전 내용을 수정하기 위하여 ‘yq’라는 tool을 사용 하였다. yq는 ‘sed’처럼 파일 내용을 수정하는데 YAML 형식의 파일을 변경하는 경우 사용한다. (3버전에서 4버전으로 변경되어 문법 찾는데 애를 먹었다.)

위 부문은 deployment yaml 파일의 image 내용을 신규 변경되는 버전으로 변경하라는 내용이다. (실제 git source의 내용을 변경하는 것은 아니고(git commit 하지 않으므로 당연하다) 작업 디렉토리로 git clone한 임시 파일만 변경한다) 변경된 이미지 Tag로 kubectl apply 명령어가 수행된다.

다음은 위 두 작업을 순서대로 실행하는 Pipeline 파일이다.

pipeline 파일에서 작업 간 순서를 정하고 (runAfter) 해당 작업에서 사용할 변수 Value를 지정한다. 이렇게 선언과 할당을 분리하여 재사용성을 높인 것 같다.

그리고 마지막으로 이 pipeline을 실제 구동으로 pipelinerun 파일이다.

내용은 간단하다. 실행해야 할 pipeline을 지정하고 (pipelineRef) git 및 이미지 레포, service account 를 지정한다. 한 줄 한 줄 처음에는 이해가 안되었는데 2~3일 구르니 이해가 된다. 이렇게 구분을 해야 재사용성이 높아 질 것 같다.

이제 실제 Apply 해 보겠다.

[spkr@erdia22 48.tekton (ksp01:tekton)]$ k apply -f task-build-push.yml
task.tekton.dev/build-push created
[spkr@erdia22 48.tekton (ksp01:tekton)]$ k apply -f task-deploy-kubectl.yml
task.tekton.dev/deploy-using-kubectl created
[spkr@erdia22 48.tekton (ksp01:tekton)]$ k apply -f pipeline-build-push-deploy.yml
pipeline.tekton.dev/build-push-deploy created
[spkr@erdia22 48.tekton (ksp01:tekton)]$ k apply -f pipelinerun-build-push-deploy.yml
pipelinerun.tekton.dev/build-push-deploy created
[spkr@erdia22 48.tekton (ksp01:tekton)]$ k get pod
NAME READY STATUS RESTARTS AGE
build-push-deploy-build-push-svkkz-pod-59s6f 2/4 NotReady 0 55s
[spkr@erdia22 48.tekton (ksp01:tekton)]$ k get pod -w
NAME READY STATUS RESTARTS AGE
build-push-deploy-build-push-svkkz-pod-59s6f 0/4 Completed 0 60s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 0/3 Pending 0 0s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 0/3 Pending 0 0s
build-push-deploy-build-push-svkkz-pod-59s6f 0/4 Completed 0 60s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 0/3 Init:0/1 0 0s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 0/3 Init:0/1 0 1s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 0/3 PodInitializing 0 2s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 3/3 Running 0 9s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 3/3 Running 0 9s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 1/3 NotReady 0 27s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 0/3 Completed 0 28s
build-push-deploy-deploy-using-kubectl-x9wf8-pod-c9fmc 0/3 Completed 0 28s

task 해당하는 작업들이 pod 형태로 순차적으로 실행된다.

작업에 대한 자세한 로그는 tkn cli를 이용한다. 문법이 kubectl과 동일하여 비교적 사용하기 용이하다.

^C[spkr@erdia22 48.tekton (ksp01:tekton)]$ tkn pr logs build-push-deploy

[build-push : git-source-git-source-pg269] {"level":"info","ts":1612545932.8856053,"caller":"git/git.go:165","msg":"Successfully cloned https://172.17.16.18
2/jerry/admin @ eaadd79f7a56862fe69f25a5995255b560501e10 (grafted, HEAD, origin/master) in path /workspace/git-source"}
[build-push : git-source-git-source-pg269] {"level":"info","ts":1612545932.9087057,"caller":"git/git.go:203","msg":"Successfully initialized and updated sub
modules in path /workspace/git-source"}

[build-push : build-and-push] INFO[0000] Resolved base name tomcat:8.5 to tomcat:8.5
[build-push : build-and-push] INFO[0000] Resolved base name tomcat:8.5 to tomcat:8.5
[build-push : build-and-push] INFO[0000] Retrieving image manifest tomcat:8.5
[build-push : build-and-push] INFO[0003] Retrieving image manifest tomcat:8.5
[build-push : build-and-push] INFO[0005] Built cross stage deps: map[]
[build-push : build-and-push] INFO[0005] Retrieving image manifest tomcat:8.5
[build-push : build-and-push] INFO[0006] Retrieving image manifest tomcat:8.5
[build-push : build-and-push] INFO[0008] Unpacking rootfs as cmd COPY board.war /usr/local/tomcat/webapps/board.war requires it.
[build-push : build-and-push] INFO[0026] Taking snapshot of full filesystem...
[build-push : build-and-push] INFO[0030] COPY board.war /usr/local/tomcat/webapps/board.war
[build-push : build-and-push] INFO[0030] Taking snapshot of files...
[build-push : build-and-push] INFO[0034] COPY catalina.sh /usr/local/tomcat/bin
[build-push : build-and-push] INFO[0034] Taking snapshot of files...
[build-push : build-and-push] INFO[0034] RUN chmod 755 /usr/local/tomcat/bin/catalina.sh && mkdir -p /usr/local/tomcat/klagoconf
[build-push : build-and-push] INFO[0034] cmd: /bin/sh
[build-push : build-and-push] INFO[0034] args: [-c chmod 755 /usr/local/tomcat/bin/catalina.sh && mkdir -p /usr/local/tomcat/klagoconf]
[build-push : build-and-push] INFO[0034] Taking snapshot of full filesystem...
[build-push : build-and-push] INFO[0037] WORKDIR /usr/local/tomcat/bin
[build-push : build-and-push] INFO[0037] cmd: workdir
[build-push : build-and-push] INFO[0037] Changed working directory to /usr/local/tomcat/bin
[build-push : build-and-push] INFO[0037] EXPOSE 8080
[build-push : build-and-push] INFO[0037] cmd: EXPOSE
[build-push : build-and-push] INFO[0037] Adding exposed port: 8080/tcp
[build-push : build-and-push] INFO[0037] CMD ["./catalina.sh", "run"]

[build-push : image-digest-exporter-pt5xd] 2021/02/05 17:25:17 warning: unsuccessful cred copy: ".docker" from "/tekton/creds" to "/tekton/home": unable to
open destination: open /tekton/home/.docker/config.json: permission denied
[build-push : image-digest-exporter-pt5xd] {"severity":"INFO","timestamp":"2021-02-05T17:26:14.36140213Z","caller":"logging/config.go:115","message":"Succes
sfully created the logger.","logging.googleapis.com/labels":{},"logging.googleapis.com/sourceLocation":{"file":"github.com/tektoncd/pipeline/vendor/knative.
dev/pkg/logging/config.go","line":"115","function":"github.com/tektoncd/pipeline/vendor/knative.dev/pkg/logging.newLoggerFromConfig"}}
[build-push : image-digest-exporter-pt5xd] {"severity":"INFO","timestamp":"2021-02-05T17:26:14.361533175Z","caller":"logging/config.go:116","message":"Loggi
ng level set to: info","logging.googleapis.com/labels":{},"logging.googleapis.com/sourceLocation":{"file":"github.com/tektoncd/pipeline/vendor/knative.dev/p
kg/logging/config.go","line":"116","function":"github.com/tektoncd/pipeline/vendor/knative.dev/pkg/logging.newLoggerFromConfig"}}
[build-push : image-digest-exporter-pt5xd] {"severity":"INFO","timestamp":"2021-02-05T17:26:14.361720521Z","caller":"imagedigestexporter/main.go:59","messag
e":"No index.json found for: image-repo","commit":"95144d9","logging.googleapis.com/labels":{},"logging.googleapis.com/sourceLocation":{"file":"github.com/t
ektoncd/pipeline/cmd/imagedigestexporter/main.go","line":"59","function":"main.main"}}

[deploy-using-kubectl : git-source-git-source-c4smq] {"level":"info","ts":1612545999.3049014,"caller":"git/git.go:165","msg":"Successfully cloned https://17
2.17.16.182/jerry/admin @ eaadd79f7a56862fe69f25a5995255b560501e10 (grafted, HEAD, origin/master) in path /workspace/git-source"}
[deploy-using-kubectl : git-source-git-source-c4smq] {"level":"info","ts":1612545999.3408127,"caller":"git/git.go:203","msg":"Successfully initialized and u
pdated submodules in path /workspace/git-source"}


[deploy-using-kubectl : run-kubectl] deployment.apps/tomcat-board configured

에러가 발생하면 이 로그로 하나하나 디버깅 가능하다. kube 가장 좋은 점 하나가 바로 이 에러 로그가 잘되어 있다는 것이다. tekton 실행하면 2~3일 동한 숱하게 에러가 발생하였는데 에러 로그가 잘되어 있어 에러 로그 따라 디버깅하면서 문제 해결이 가능하였다.

Deploy가 정상적으로 되었다.

[spkr@erdia22 48.tekton (ksp01:tekton)]$ kns tomcat
Context "ksp01" modified.
Active namespace is "tomcat".
[spkr@erdia22 48.tekton (ksp01:tomcat)]$ k get pod
NAME READY STATUS RESTARTS AGE
tomcat-board-55766dcf5c-752gr 1/1 Running 0 2m5s
tomcat-board-55766dcf5c-qnzqh 1/1 Running 0 2m32s

이미지 버전도 원하는 버전으로 변경되었다.

[spkr@erdia22 48.tekton (ksp01:tomcat)]$ k describe pod tomcat-board-55766dcf5c-752gr
Name: tomcat-board-55766dcf5c-752gr
Namespace: tomcat
(생략)
Image: 172.17.16.182:5050/jerry/admin/tomcat-board:1.0.5
Image ID: docker-pullable://172.17.16.182:5050/jerry/admin/tomcat-board@sha256:aa43da2011c44cca32aa2b780a1ec29b1db41dced2e12c9afd78cd536faa2b0a
Port: 8080/TCP
Host Port: 0/TCP

이제 Jenkins 대신 Tekton을 사용하면 좀 더 빨리 퇴근 할 수 있을 것 같다.

--

--

Jerry(이정훈)
Jerry(이정훈)

Written by Jerry(이정훈)

DevOps/Automation Engineer 60살까지 콘솔 잡는 엔지니어를 목표로 느리게 생각하고 있습니다.

No responses yet