티스토리 뷰
Pipeline Resource의 유형은 아래와 같습니다.
- Git: Git repository
- PullRequest:
- Image
- Cluster
- Storage
- CloudEvent
유형별로 이해해 보도록 합시다.
1. Git
gitlab, github와 같은 형상관리 저장소 리소스입니다.
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: git-hello1
namespace: tekton
spec:
type: git
params:
- name: revision
value: master
- name: url
value: https://gitlab.com/happycloudpak/hello1
위 예는 gitlab의 happyclouydpak/hello1프로젝트의 master branch를 기술한 PipelineResource입니다.
git 주소를 기술할 때는 확장자 '.git'은 생략하셔야 합니다.
2. Pull Request
Git으로 부터 Pulling을 요청하는 리소스입니다.
자세한 건 아무리 도움말을 읽어 봐도 이해가 안돼 일단, skip합니다.
3. Image
container registry의 Image를 정의하는 리소스입니다.
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: image-hello1
namespace: tekton
spec:
type: image
params:
- name: url
value: happycloudpak/hello1:0.0.3
docker.io의 happycloudpak/hello1:0.0.3 이미지를 정의한 리소스입니다.
Image 리소스는 보통 Task의 Output에서 Image를 build할 때 사용됩니다.
builtImage가 실제 어떤 pipeline resource를 참조하는지는 Taskrun 또는 Pipeline에 정의됩니다.
4. Cluster
Cluster 리소스는 현재 클러스터가 아닌 다른 클러스터에 대한 정의를 담고 있는 리소스입니다. 제일 많이 사용되는 경우는 다른 클러스터에 어플리케이션을 배포할때입니다.
cluster를 하나 더 만들고, 그 클러스터에 배포시켜 보도록 하겠습니다.
1) cluster 'mycluster' 만들기
원래는 cluster를 하나 더 만들어야 하지만, 여기서는 동일한 master node에 대해 이름만 다른 cluster를 만들도록 하겠습니다.
- Service Account 'kube-admin' 만들기
$ kubectl create sa kube-admin -n kube-system
$ kubectl create clusterrolebinding crb-kube-admin --clusterrole cluster-admin --serviceaccount kube-system:kube-admin
- namespace 생성: myns는 Task를 실행할 namespace이고, tekton은 배포될 대상 namespace입니다.
$ kubectl create namespace myns
$ kubectl create namespace tekton
- cluster명령문 작성
export cluster=mycluster
export server=https://10.178.133.200:6443
export context=mycontext
export save_context=kubernetes-admin@kubernetes
export user=kube-admin
export token=$(kubectl -n kube-system get secret $(kubectl get secret -n kube-system | grep $user | awk '{print $1}') -o jsonpath='{.data.token}' | base64 --decode;echo)
export namespace=tekton
kubectl config set-cluster $cluster --server=$server --insecure-skip-tls-verify=true
kubectl config set-context $context --cluster=$cluster
kubectl config set-credentials $user --token=$token
kubectl config set-context $context --user=$user --namespace=$namespace
kubectl config use-context $context
. server: master node의 API server 주소. kubectl config view로 확인.
. save_context: kubectl config current-context 로 확인
- 명령문 실행: 완성된 명령문을 실행합니다.
$ kubectl config view를 하면 mycluster와 mycontext가 추가된 것을 확인할 수 있습니다.
현재 context도 mycontext로 변경이 되었습니다. 이제 현재 클러스터와 namespace는 각각 mycluster와 tekton으로 변경된 것입니다. kubectl get pod를 해보면 그 결과가 달라진걸 알 수 있습니다.
- 이전 cluster로 돌아가기: cluser명과 context명은 위 결과에서 확인하십시오.
$ kubectl config set-cluster kubernetes && kubectl config use-context kubernetes-admin@kubernetes
$ kubectl set-context kubectl config set-context $(kubectl config current-context) --namespace myns
현재 namespace를 myns로 바꿉니다.
$ kubectl get pod
2) myns에 필요한 리소스를 작성합니다.
gitlab의 hello1 프로젝트를 clone -> image build & docker.io에 push -> cluster 'mycluster'의 namespace 'tekton'에 배포하는것을 해 보겠습니다.
필요한 리소스는 아래와 같습니다.
Kind | name | 설명 |
PipelineResource | git-hello1 | gitlab의 hello1 프로젝트 |
image-hello1 | docker.io의 container image | |
test-cluster | cluster 'mycluster' 리소스 | |
Service Account | tutorial-service | Taskrun을 수행할 Service Account |
Secret | regcred | docker.io의 접근 인증 정보. 위 SA 'tutorial-service'생성 시 이 Secret을 사용하도록 해야 함 |
Task | deploy-image-cluster | 수행할 Task 정의 |
TaskRun | deploy-image-cluster-taskrun | Task 수행 |
작업할 디렉토리를 먼저 만듭니다.
$ mkdir -p ~/tekton/cluster
그럼 각 리소스를 작성하겠습니다.
- PipelineResource: git-hello1
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: git-hello1
spec:
type: git
params:
- name: revision
value: master
- name: url
value: https://gitlab.com/happycloudpak/hello1
git의 주소는 본인 git에 맞게 수정하십시오. public project이므로 그대로 사용하셔도 상관은 없습니다.
git-hello1-rs.yaml파일로 생성 후 kubectl apply -f git-hello1-rs.yaml 실행합니다.
- PipelineResource: image-hello1
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: image-hello1
spec:
type: image
params:
- name: url
value: happycloudpak/hello1:0.0.3
image url은 반드시 본인 docker.io계정으로 변경하셔야 합니다.
image-hello1-rs.yaml로 저장하신 후 , kubectl apply -f image-hello1-rs.yaml을 실행합니다.
- PipelineResource: mycluster
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: mycluster
spec:
type: cluster
params:
- name: url
value: https://10.178.133.200:6443
- name: namespace
value: tekton
- name: insecure
value: "true"
- name: username
value: default
- name: token
value: eyJhbGciOiJSUzI1NiIsImtpZCI6IjFFLUk0MU9pR1YwaEJLMzY0T25vdlMyTDVBLWNfQVJBLXQxanphZXpaZHcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJ0ZWt0b24iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi1uNzZsayIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYWVmNmUyMzgtNDdlNS00ZDY0LWFjNDAtZmYyOTJmOGMyMDUyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OnRla3RvbjpkZWZhdWx0In0.YFY6n-OBPi75yD_zHoq0VE0D36Duc1Nu3sUQjI3htWMb_6c7jeV__8LcqpPOgInUCAfE5_ytkAxLt9T0c7ztWDnUXHVdW5iFdmC2Hw4McZNG4eQfI2gFUY6c-LV1kvYMLv488J7wiJf_SCtExbq1-Aj_GLo7QP3wWGaTouxa5_8qiLEFZKjMfy8GmxP8_OZ7nAOgzNNDQTdW4ZBptiEVXccv4tU1EfqmdRjNHCDSOEDl9L0EkbVA-R3BXBSzsLVycXmD0l-fTvARaxYe-VtRhEiapAOjsRzIHo4Fl5tCDBo6aWZcRRvqLz8WxTNyiB1l-mcxYAHdWCN80D6zUBdGow
- name: cadata
value: ""
# secrets:
# - fieldName: token
# secretKey: token
# secretName: tutorial-service-token-qxmtm
대상 cluster정보와 인증 정보입니다.
'url' 값과 'token'값을 변경하십시오. token값은 SA 'default'의 인증토큰이며 아래 명령으로 구할 수 있습니다.
$ kubectl get secret -n tekton | grep default
$ kubectl describe secret <위에서 구한 secret명> -n tekton
cluster-rs.yaml로 저장하고 kubectl apply -f cluster-rs.yaml로 생성하십시오.
* insecure의 값은 반드시 큰 따옴표로 감쏴줘야 합니다.
* 보안 강화를 위해 token, cadata는 secret 리소스에서 읽어 오도록 할 수도 있습니다. 위 주석 부분 참조하세요.
이때 만드는 secret리소스는 type을 Opaque가 아닌 'kubernetes.io/service-account-token'으로 만드십시오.
annotaions에 반드시 kubernetes.io/service-accont.name이 정의되어 있어야 합니다.
아래는 예제입니다.
apiVersion: v1
data:
ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNU1USXhNVEEyTWprME5Wb1hEVEk1TVRJd09EQTJNamswTlZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTjNRClhjcTJRV3J6bzU2QmlwRHBEcmtmUjVHMUFjelh2K3pXbGJsdDJpUDIxbitubjNqVE5RNm8xdnVBaWxwZGNHOWgKUDlORUFTNnhwWjdZUG5ldVZZLzVMZE1WSDdUazRWY1lSWXZLVnlpY3ovSmE2emVraTZHbHg5Ly9Vc21CQnVKdApBRm5ySGtpOFBEUFhSeGZvYVRlZ3c2emw1TGZIMHRrZjM2RC81ZktrK1U5cmVrZE1SNDJHSUdGQjlPTkhjTC8yCktxWWcyVUtvL3lxWFhEL0JDeTdVeURHbndTRUViU2gzbHA1akYvazlnVDYycHFNK0RLTUZ2UlJqRHY2K3VOVVoKbG1aQTlKcTNhdjVKOGxFOUc3T05TMnMzTDJHc0ZJZU1JUFl4L1VrMG1ndEcxSFNwV01LQ3FMTXkwSTlKejBXMgoyWHYwTGVnbkpYMlpnalpVVWNrQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNL0FUNXZicHgzYkxFR3JKN2RRTFpBYW96NSsKS0l6b1poRVUzR3VVNkNmbldYMWVmYU1aM0lGd011VXhnNU5VTU1FRkJxcjZQQzVUQVJTbWZoelFGbU5kUk9DUQp6cFNoMVpvYm5wcTNja1lpU0hLV1pKVkQ4NkM1anNZN0RkRzBFNkMyMUE3aTBNMXBNODRwTEc0SzA4RlUrY2VHClp2ZXMwTklMU2djN2NSMDF1UHlkTkFVRnVjS29vdVVaaG1QK0x5QVFyN05FUy8zbHc3anlMMDNKdlBRZEwrSzcKdzBQWktzalQ5U0h3aGtld2JTYnJwc0NEdVd2Q2xraXAxUzFYTGpUQTNKSUs4VFBWNEhldE1ZSWhKYVlKVlp1OAo1b2Q1N05pem9wN200QWdLb3RkcW5IRFl1RXZTMjJsVkw3RThyWlZXQ0ZWa0hXTjRjd0lRcHBzRzY2dz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
namespace: bXlucw==
token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklqRkZMVWswTVU5cFIxWXdhRUpMTXpZMFQyNXZkbE15VERWQkxXTmZRVkpCTFhReGFucGhaWHBhWkhjaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUp0ZVc1eklpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WldOeVpYUXVibUZ0WlNJNkluUjFkRzl5YVdGc0xYTmxjblpwWTJVdGRHOXJaVzR0Tm5NNWJYSWlMQ0pyZFdKbGNtNWxkR1Z6TG1sdkwzTmxjblpwWTJWaFkyTnZkVzUwTDNObGNuWnBZMlV0WVdOamIzVnVkQzV1WVcxbElqb2lkSFYwYjNKcFlXd3RjMlZ5ZG1salpTSXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNklqUXlZekprTkRVekxUZ3pZV1V0TkdGbFpTMDRPRE5pTFRjNU16VXlPVEZpT1RFNE5TSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHB0ZVc1ek9uUjFkRzl5YVdGc0xYTmxjblpwWTJVaWZRLlZ4bmZBSFRZRXp2bWU0WWdndktNMVNmWksyTDhlZlZ3eS1DMUxpWnl6THdqQzJ4ZWx5dnJhcjlhRGdfMUJXOVRqMm5Ta21IMlE5aWIyeUdwSjY2TkZWTzlMVG5DVWxEQXgyWTRGZkhFM19uTzNtbDJldl9HQUM3ajZfVUs1ZGtVYUtOcjViNmZaU2Z1VllrYjdhNzFjZ2xVbk02RXJNcTZtc1ZxVzRBdWtyd1kySzExMWl3NVZMbjI2OUVZM2N1MzBWNVFyZXZ2bGVSdlNYOUwyNkJib0JjV3lxS0VtODYwNkk2UUs1OHdqeVN6Z2RmYk5wZVk0OGpxS0FxR1pkTzlVQ3dQem5ReGJLb0FvclhURW1VRzBsR2NrUVRhUkV5cU9GOGk0LVJRNGMtZ1NQQUUtbUgxT3ZOdEEyT2czOVVNbHNkWDl6S1ZVUGVsRjdQWDFpektjUQ==
kind: Secret
metadata:
annotations:
kubernetes.io/service-account.name: tutorial-service
kubernetes.io/service-account.uid: 42c2d453-83ae-4aee-883b-7935291b9185
creationTimestamp: "2019-12-16T10:26:39Z"
name: tutorial-service-token-6s9mr
namespace: myns
resourceVersion: "1328793"
selfLink: /api/v1/namespaces/myns/secrets/tutorial-service-token-6s9mr
uid: 52290b82-2c58-4d61-b3c0-78fafce8d9ba
type: kubernetes.io/service-account-token
- Service Accout: tutorial-service
Taskrun을 실행할 SA를 만듭니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: tutorial-service
secrets:
- name: regcred
sa.yaml로 저장하고, kubectl apply -f sa.yaml로 생성하십시오.
- Secret: regcred
위 SA 'tutorial-service'가 사용할 secret이며, docker.io의 인증정보입니다. 본인의 docker.io 계정과 암호에 맞게 변경하여 생성하십시오.
$ kubectl create secret docker-registry regcred \
--docker-server=https://index.docker.io/v1 \
--docker-username=happycloudpak \
--docker-password=happy@cloud \
--docker-email=happycloudpak@gmail.com
- Task: deploy-image-cluster
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: deploy-image-cluster
spec:
inputs:
resources:
- name: hello1
type: git
- name: image
type: image
- name: mycluster
type: cluster
params:
- name: path
type: string
description: Path to the manifest to apply
- name: yamlPathToImage
type: string
description:
The path to the image to replace in the yaml manifest (arg to yq)
- name: targetContext
type: string
description: target context name on target cluster
steps:
- name: replace-image
image: mikefarah/yq
command: ["yq"]
args:
- "w"
- "-i"
- "$(inputs.params.path)"
- "$(inputs.params.yamlPathToImage)"
- "$(inputs.resources.image.url)"
- name: deploy-image
image: lachlanevenson/k8s-kubectl
command: ["kubectl"]
args: [ "--kubeconfig", "/workspace/$(inputs.resources.mycluster.name)/kubeconfig", "--context", "$(inputs.resources.mycluster.name)", "apply", "-f", "$(inputs.params.path)" ]
deploy-cluster-task.yaml로 저장하고, kubectl apply -f deploy-cluster-task.yaml로 생성하십시오.
- TaskRun: deploy-image-cluster-taskrun
apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
name: deploy-image-cluster-taskrun
spec:
serviceAccountName: tutorial-service
taskRef:
name: deploy-image-cluster
inputs:
resources:
- name: hello1
resourceRef:
name: git-hello1
- name: image
resourceRef:
name: image-hello1
- name: mycluster
resourceRef:
name: mycluster
params:
- name: path
value: /workspace/hello1/deployment/deploy.yaml
- name: yamlPathToImage
value: "spec.template.spec.containers[0].image"
- name: targetContext
value: mycontext
deploy-cluster-taskrun.yaml로 저장까지만 하십시오.
3) Taskrun 실행 및 결과 확인
- kubectl apply -f deploy-cluster-taskrun.yaml
- watch tkn tr list로 실행확인
Success 되면 $ kubectl get pod -n tekton으로 POD가 제대로 생성되었는지 확인함
웹브라우저로 접근하여 제대로 실행되는지 확인.
kubectl get ing -n tekton해서 ingress를 보면 알겠지만, 아무 node의 ip로도 접근할 수 있습니다.
5. Storage
객체(object)나 디렉토리를 담고 있는 blob저장소를 정의한 리소스입니다.
2019-12-16일 현재 GCS(Google Cloud Storage)만 지원하므로, 자세한 설명은 생략합니다.
6. Cloud Event
TaskRun완료 시 발생한 데이터를 보낼 URI를 정의하는 리소스임
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: event-to-sink
spec:
type: cloudEvent
params:
- name: targetURI
value: http://sink:8080
정확히 어떻게 사용되는지는 잘 모르겠습니다.
'Agile&DevOps > Tekton' 카테고리의 다른 글
7. Tekton trigger (0) | 2019.12.16 |
---|---|
6. Conditions (0) | 2019.12.13 |
4. Pipeline & PipelineRun (0) | 2019.12.13 |
3. Task & TaskRun (0) | 2019.12.13 |
2. Tekton 설치하기 (0) | 2019.12.13 |
- Total
- Today
- Yesterday
- AXON
- 디토소비
- 육각형인간
- 리퀴드폴리탄
- 요즘남편 없던아빠
- 분초사회
- spotify
- CQRS
- 마이크로서비스 패턴
- 마이크로서비스
- agile
- Event Sourcing
- 호모프롬프트
- micro service
- 돌봄경제
- API Composition
- 스포티파이
- SAGA
- 애자일
- 버라이어티가격
- 도파밍
- 스핀프로젝트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |