tekton - deptno/deptno.github.io GitHub Wiki

tekton

kubernetes 베이슀의 ci/cd

  • TODO: λͺ¨λ“ˆν™”κ°€ 잘 λ˜μ–΄ μžˆμ§€λ§Œ ν•΄λ‹Ή 파이브라인 관리 μ½”λ“œλ₯Ό ν”„λ‘œμ νŠΈμ— 놓아야할지 인프라μͺ½μ— 놓아야할지 κ³ λ―Ό ν•„μš”

ꡬ쑰

erDiagram
  EXTERNAL-EVENT ||--|| Service : receive-from-external-event
  Service ||--|| EventListener : ""
  EventListener ||--|{ TriggerGroups : ""
  TriggerGroups ||--|{ Trigger: "by selector"
  Trigger ||--|| TriggerTemplate : ref-or-embed
  Trigger ||--o{ TriggerBinding : ""
  Trigger ||--o{ Interceptor : ""
  Interceptor ||--o{ TriggerBinding : "modify, filter, validate"
  Trigger ||--o| ServiceAccount : ref
  EventListener ||--o{ TriggerBinding : "implicit ref event as body"
  EventListener ||--o{ Interceptor : "implicit ref event as body"
  TriggerTemplate ||--|{ PipelineRun : embed
  EventListener ||--|| ServiceAccount : ref
  PipelineRun ||--o| ServiceAccount : ref
  PipelineRun }|--|| Pipeline : pipelinerun-ref-or-embed-pipeline
  PipelineRun ||--|{ Resource : ref
  PipelineRun ||--|{ Workspace : ref
  Pipeline ||--|{ Task: ref
  ServiceAccount }|--|| RoleBinding : ref
  ServiceAccount }|--|| ClusterRoleBinding : ref
  RoleBinding ||--o| Role : ref
  RoleBinding ||--o| ClusterRole : ref
  ClusterRoleBinding ||--o| ClusterRole : ref
  ServiceAccount ||--|{ Secret : ref
  
  EventListener {
    TriggerList triggers
    Resource resources
  }
  Trigger {
    TriggerBindingList bindings
    TriggerTemplate template
    InterceptorList interceptors
    ServiceAccount serviceAccountName
  }
  Resource {
    kubernetesResource o
    customResource o
    kubernetesResource o
  }
Loading
  • λŒ€μ²΄κ°€λŠ₯
    • TriggerBinding <-> ClusterTriggerBinding
    • TriggerTemplate <-> ClusterTriggerTemplate
    • TriggerTemplate 은 PipelineRun 외에 λ‹€λ₯Έ 였브젝트 μ°Έμ‘°κ°€ κ°€λŠ₯
      • PipelineRun
      • Pipeline
      • TaskRun
      • Task
      • CustumTask
  • TriggerBinding <-> TriggerTemplate
    • n..1 κ΄€κ³„λ‘œ Trigger μ—μ„œ λ§Œλ‚˜λŠ”λ° TriggerBinding 수 λ§Žμ€ TriggerTemplate 을 ν˜ΈμΆœλ˜λŠ”μ§€ 확인이 ν•„μš”

CRD

EventListener > TriggerBinding > TriggerTemplate > PipelineRun > Pipeline > Task

  • EventListener
  • TriggerBinding
  • TriggerTemplate
  • PipelineRun
  • Pipeline
  • Task

Trigger

  • EventListener
    • PipelineBinding
    • PipelineTemplate
      • Pipeline
  • RoleBinding
    • ServiceAccount
    • ClusterRole
  • ClusterRoleBinding
    • ServiceAccount
    • ClusterRole
CRD μ„€λͺ…
Event 트리거
PipelineBinding νŒŒμ΄ν”„λΌμΈμ— λ³€μˆ˜ 바인딩
PipelineTemplate
PipelineRun νŒŒμ΄ν”„λΌμΈμ˜ μ‹€ν–‰
Pipeline Task μ½œλ ‰μ…˜
Task

install

  • pipelines
  • triggers
  • results μ‹€ν–‰ κ²°κ³Ό?

pipeline

kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

tecton-pipelines namepsace 둜 μ„€μΉ˜λ¨

  • pvc μ„€μ •
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/instance: default
    app.kubernetes.io/part-of: tekton-pipelines
  name: config-artifact-pvc
  namespace: tekton-pipelines
data:
  storageClassName: "openebs-hostpath"
  size: "10GiB"
  • private repo μ„€μ •
  • pipeline μ„€μ • cm/feature-flags 에 μžˆλ‹€
    • require-git-ssh-secret-known-hosts
    • disable-creds-init credential initialization 을 μŠ€ν‚΅ν•˜κ³  secret λ‘œλ“œλ‘œ λŒ€μ²΄

dashboard

kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml

cli

brew install tektoncd-cli

github

ssh-keygen ν›„ github 에 ssh 등둝

  1. Secret 생성
ssh-keygen -t ed25519 -C "[[email protected]]"
# save current directory
kubectl create secret generic [secret_name] --from-file=ssh-privatekey=./id_ed25519.tekton.dev --type=kubernetes.io/ssh-auth
kubectl annotate secret [secret_name] tekton.dev/git-0=github.com
  1. ServiceAccount 생성
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tekton-deptno
secrets:
  - name: [secret_name]
  1. PipelineRun 에 μ£Όμž…ν•˜μ—¬ μ‚¬μš©

tekton hub 에 μžˆλŠ” git-clone task 둜 확인 DONE: 2023-01-24

κ΅¬ν˜„

trigger λ₯Ό ν†΅ν•œ github private λ ˆν¬μ§€ν„°λ¦¬ 클둠 νŒŒμ΄ν”„λΌμΈ μ‹€ν–‰

ssh-github μ•„λž˜μ™€ 같은 ν˜•νƒœ

Name:         ssh-github-deptno
Namespace:    project-things
Labels:       <none>
Annotations:  tekton.dev/git-0: github.com

Type:  kubernetes.io/ssh-auth

Data
====
ssh-privatekey:  411 bytes

git-clone task λŠ” hubμ—μ„œ μ„€μΉ˜ν–ˆλ‹€

apiVersion: v1 
kind: ServiceAccount
metadata:
  name: tt-sa
secrets:
  - name: ssh-github # `sh-privatekey` λ₯Ό λ°μ΄ν„°λ‘œ κ°–λŠ”λ‹€
---
apiVersion: rbac.authorization.k8s.io/v1 
kind: RoleBinding
metadata:
  name: tt-rb
  namespace: project-things
subjects:
- kind: ServiceAccount
  name: tt-sa
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: tekton-triggers-eventlistener-roles
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tt-crb
subjects:
- kind: ServiceAccount
  name: tt-sa
  namespace: project-things
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: tekton-triggers-eventlistener-clusterroles
---
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: tt-ev
spec:
  serviceAccountName: tt-sa
  triggers:
  - triggerRef: tt-tr
  resources:
    kubernetesResource:
      serviceType: ClusterIP
      servicePort: 80
---
apiVersion: triggers.tekton.dev/v1beta1
kind: Trigger
metadata:
  name: tt-tr
spec:
  bindings:
  - ref: tt-tb
  template:
    ref: tt-tt
---
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
  name: tt-tb
spec:
  params:
  - name: url
    value: $(body.url)
---
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: tt-tt
spec:
  params:
  - name: url
  resourceTemplates:
  - apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      generateName: tt-tt-pr
    spec:
      serviceAccountName: tt-sa
      pipelineRef:
        name: tt-pl
      params:
      - name: repo-url
        value: $(tt.params.url)
      workspaces:
      - name: shared-data
        emptyDir: {}
---
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: tt-pl
  namespace: project-things
spec:
  description: clone git repository
  params:
  - name: repo-url
    type: string
    description: https://github.com/[username]/[reponame].git
  workspaces:
  - name: shared-data
    description: working directory
  tasks:
  - name: fetch-source
    taskRef:
      name: git-clone
    params:
    - name: url
      value: $(params.repo-url)
    workspaces:
    - name: output
      workspace: shared-data
  • μ‹€ν–‰
$ curl -X POST \                                                                                                                                               ok  4s  16.15.0 node  1.59.0 rust  01:12:56
  http://localhost:8080 \
  -H 'Content-Type: application/json' \
  -d '{ "url": "[email protected]:deptno/private-repo.git" }'
{"eventListener":"tt-ev","namespace":"project-things","eventListenerUID":"54001b1f-1859-48a3-802b-d220a954f23c","eventID":"19375452-32d1-4650-aa03-beb73f7f7538"}
$ tkn pr logs                                                                                                                                                      ok  16.15.0 node  1.59.0 rust  01:13:07
? Select pipelinerun: tt-tt-prkbpb2 started 1 second ago
Pipeline still running ...
task fetch-source has failed: "step-clone" exited with code 1 (image: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init@sha256:28ff94e63e4058afc3f15b4c11c08cf3b54fa91faa646a4bbac90380cd7158df"); for logs run: kubectl -n project-things logs tt-tt-prkbpb2-fetch-source-pod -c step-clone

[... logs]

error

pipelinerun 을 ν†΅ν•΄μ„œ pod 생성 ν›„ 계속 pending μƒνƒœλΌ λ³΄λ‹ˆ pvc κ°€ λ°”μš΄λ“œλ˜μ§€ μ•ŠλŠ” 문제

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  2m8s  default-scheduler  0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/1
 nodes are available: 1 No preemption victims found for incoming pod..

-> pvc λ₯Ό κ°€λ³΄λ‹ˆ storageClassName 이 λΉ„μ–΄μžˆλ‹€, ν˜„ μ„ΈνŒ…μ€ openebs-hostpath λ₯Ό μ§€μ •ν•΄μ•Ό μ‚¬μš©μ΄ κ°€λŠ₯ν•œ μƒνƒœ -> manifest μ—μ„œ pvc 섀정에 storageClassName 을 μ„€μ •ν–ˆμŒμ—λ„ λ™μž‘ν•˜μ§€ μ•Šμ•˜λ‹€. -> pvc μ—μ„œ spec.storageClassName: openebs-hostpath λ₯Ό μ£Όμž…ν•˜λ‹ˆ 정상 μ‹€ν–‰λœλ‹€. -> PipelineRun μ—μ„œ storageClassName 을 μ£Όμž…ν•˜λ©΄ λ™μž‘ν•œλ‹€

  workspaces:
  - name: shared-data
    volumeClaimTemplate:
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
        storageClassName: openebs-hostpath

{
    "severity": "fatal",
    "timestamp": "2023-01-28T08:55:54.927Z",
    "logger": "eventlistener",
    "caller": "v2/main.go:205",
    "message": "Start returned an error",
    "error": "Timed out waiting on CaBundle to available for clusterInterceptor: Timed out waiting on CaBundle to available for Interceptor: clusterinterceptors. triggers.tekton.dev is forbidden: User \"system:serviceaccount:project-things:default\" cannot list resource \"clusterinterceptors\" in API group \"triggers.tekton.dev\" at the cluster scope"
}

account 에 tektonμ—μ„œ μ œκ³΅ν•˜λŠ” ClusterRole, Role 이 μ œλŒ€λ‘œ λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€

releated

⚠️ **GitHub.com Fallback** ⚠️