전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

Agile&DevOps/Tekton

5. Pipeline Resource

Happy@Cloud 2019. 12. 13. 21:13

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
댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]