Tektonを使用してCI/CD-2を構築

43427 ワード

Tektonを使用してCI/CDを構築

  • 羽のハブに特定のタグをプッシュする場合は、Tektonを使用して、イメージをjibに構築し、点のハブとローカルクラスタにプッシュするパイプラインを作成します.
  • Tektonを用いてCI/CD−1を構築した.
  • Taskの作成


  • Tekton Hubでは、作成したTaskを表示したり、独自のTaskを定義したりできます.羽毛集線器からソースコードをダウンロードしたTak、Image Build Task、Kubectl Deploy Taskに基づいてパイプラインを作成します.
  • Git-clone


    ダウンロード
  • 羽香草源Task
  • https://hub.tekton.dev/tekton/task/git-clone
  • Jib-Build


    Task
  • JibによるSpringプロジェクトの作成と推進
  • https://hub.tekton.dev/tekton/task/jib-gradle
  • プロジェクトで使用されているGradleバージョンは7.3.2ですが、Taskバージョンは5なので、引き続き使用することはできませんが、openjdk 11イメージでGradleを使用してGradle Jibコマンドを実行する新しいTaskが定義されています.
  • kind: Task
    metadata:
      name: jib-gradle
      labels:
        app.kubernetes.io/version: "0.3"
      annotations:
        tekton.dev/pipelines.minVersion: "0.12.1"
        tekton.dev/categories: Image Build
        tekton.dev/tags: image-build
        tekton.dev/displayName: "jib gradle"
        tekton.dev/platforms: "linux/amd64,linux/s390x,linux/ppc64le"
    spec:
      description: >-
        This Task builds Java/Kotlin/Groovy/Scala source into a container image using Google’s Jib tool.
    
        Jib works with Gradle and Maven projects, and this template is for Gradle projects.
    
      params:
      - name: BUILDER_IMAGE
        description: The location of the gradle builder image
        default: openjdk:11-jdk
      - name: IMAGE
        description: Reference of the image gradle will produce
      - name: DIRECTORY
        description: The directory containing the app, relative to the source repository root
        default: .
      - name: EXTRA_ARGS
        description: Extra arguments to add to the gradle jib build
        default: ""
    
      workspaces:
      - name: source
    
      results:
      - name: IMAGE_DIGEST
        description: Digest of the image just built.
    
      steps:
      - name: build-and-push
        image: $(params.BUILDER_IMAGE)
        workingDir: $(workspaces.source.path)/$(params.DIRECTORY)
        script: |
    			chmod +x gradlew
          ./gradlew jib \
              -Djib.to.image="$(params.IMAGE)" \
              $(params.EXTRA_ARGS)
    
        env:
        - name: HOME
          value: /workspace
        - name: "DOCKER_CONFIG"
          value: $(credentials.path)/.docker/
        volumeMounts:
        securityContext:
          runAsUser: 0
      - name: digest-to-results
        image: $(params.BUILDER_IMAGE)
        script: cat $(workspaces.source.path)/$(params.DIRECTORY)/image-digest | tee /tekton/results/IMAGE_DIGEST
      volumes:
      - name: empty-dir-volume
        emptyDir: {}

    Kubectl-Deploy

  • Tekton HubにあるKubectl Task
  • を使用してKubectl Applyコマンドを適用
  • https://hub.tekton.dev/tekton/task/kubernetes-actions
  • Kubectl Applyを適用する前に、sedコマンドでyamlファイルを変更する新しいTaskを定義しました.
  • apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
    
        tekton.dev/categories: Kubernetes
        tekton.dev/displayName: kubernetes actions
        tekton.dev/pipelines.minVersion: 0.17.0
        tekton.dev/platforms: linux/amd64
        tekton.dev/tags: 'CLI, kubectl'
      creationTimestamp: '2022-01-25T01:00:34Z'
      generation: 1
      labels:
        app.kubernetes.io/version: '0.2'
      managedFields:
        - apiVersion: tekton.dev/v1beta1
          fieldsType: FieldsV1
          fieldsV1:
            'f:metadata':
              'f:annotations':
                .: {}
                'f:kubectl.kubernetes.io/last-applied-configuration': {}
                'f:tekton.dev/categories': {}
                'f:tekton.dev/displayName': {}
                'f:tekton.dev/pipelines.minVersion': {}
                'f:tekton.dev/platforms': {}
                'f:tekton.dev/tags': {}
              'f:labels':
                .: {}
                'f:app.kubernetes.io/version': {}
            'f:spec':
              .: {}
              'f:description': {}
              'f:params': {}
              'f:results': {}
              'f:steps': {}
              'f:workspaces': {}
          manager: kubectl-client-side-apply
          operation: Update
          time: '2022-01-25T01:00:34Z'
      name: kubectl-deploy
      resourceVersion: '3052774'
      uid: 44000dca-ba62-4494-bb29-2dc4aa3af86b
    spec:
      description: This task is the generic kubectl CLI task which can be used to run all kinds of k8s commands
      params:
        - default: 'gcr.io/cloud-builders/kubectl@sha256:8ab94be8b2b4f3d117f02d868b39540fddd225447abf4014f7ba4765cb39f753'
          name: IMAGE
          type: string
        - name: TAG
          type: string
        - name: YAMLFILE
          type: string
        - name: NAMESPACE
          type: string
      results:
        - description: some result can be emitted if someone wants to.
          name: output-result
      steps:
        - args:
            - '-i'
            - s;latest;$(params.TAG);g
            - $(workspaces.manifest-dir.path)/$(params.YAMLFILE)
          command:
            - sed
          image: alpine
          name: update-yaml
          resources: {}
        - image: $(params.IMAGE)
          name: kubectl
          resources: {}
          script: |
            #!/usr/bin/env bash
            [ "$(workspaces.manifest-dir.bound)" == "true" ] && \
            cd $(workspaces.manifest-dir.path)
    
            [ "$(workspaces.kubeconfig-dir.bound)" == "true" ] && \
            [ -f $(workspaces.kubeconfig-dir.path)/kubeconfig ] && \
            export KUBECONFIG=$(workspaces.kubeconfig-dir.path)/kubeconfig
    
            kubectl apply -f $(workspaces.manifest-dir.path)/$(params.YAMLFILE) --namespace $(params.NAMESPACE)
    
      workspaces:
        - name: manifest-dir
          optional: true
        - name: kubeconfig-dir
          optional: true
  • Tekton DashBoardが作成したTask

    Pipeline,PipelineRunを作成する

  • Taskを組み合わせてパイプラインを作成できます.
  • Pipelineを作成すると、Taskで定義したパラメータ値を新しい値に入れることができます.
  • Pipeline

    apiVersion: tekton.dev/v1beta1
    kind: Pipeline
    metadata:
      name: tekton-pipeline
    spec:
      workspaces:
        - name: pipeline-shared-data
        - name: kubeconfig-dir
      tasks:
        - name: clone-repository
          taskRef:
              kind: Task
              name: git-clone
          params:
            - name: url
              value: "https://github.com/sgwon96/devopsTest"
            - name: revision
              value: "main"
            - name: deleteExisting
              value: "true"
          workspaces:
            - name: output
              workspace: pipeline-shared-data
    
        - name: build-image
          taskRef:
              kind: Task
              name: jib-gradle
          runAfter:
            - clone-repository
          params:
            - name: IMAGE
              value: "zxcvb5434/devopstest:$(tasks.clone-repository.results.commit)"
          workspaces:
            - name: source
              workspace: pipeline-shared-data
    
        - name: kubectl-deploy
          taskRef:
              kind: Task
              name: kubectl-deploy
          runAfter:
            - build-image
          params:
            - name: TAG
              value: "$(tasks.clone-repository.results.commit)"
            - name: YAMLFILE
              value: "./k8s/deployment.yaml"
            - name: NAMESPACE
              value: "default"
          workspaces:
            - name: kubeconfig-dir
              workspace: kubeconfig-dir
            - name: manifest-dir
              workspace: pipeline-shared-data
  • params:Taskで定義されたパラメータには、新しい値を含めることができます.Pipelineを作成するたびに、値を変更できます.
  • paramsが定義されていない場合は、タスク定義のdefaultvalue値が入力されます.
  • runAfters:Task間の順序.値のTaskが完了すると、次のTaskが実行されます.
  • PipelineRunから
  • Pipleineで定義されたWorkspaceを入力します.
  • ワークスペースでは、タスク共有の永続ボリュームターゲットまたはKubeconfig値を設定できます.
  • TaskはTaskの終了時にResultを作成し、他のTaskと共有することができ、Git-Clone Taskはコミットされたsha値をResultとして生成する.
  • コンテナイメージタグをcommitのsha値に設定しました.
  • PipelineRun

    apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      name: tekton-pipelinerun
    spec:
      pipelineRef:
          name: tekton-pipeline
      serviceAccountName: tekton-sa
      workspaces:
        - name: pipeline-shared-data
          persistentvolumeclaim:
            claimName: task-pv-claim
        - name: kubeconfig-dir
          configMap:
            name: kubeconfig

  • Dockerにアクセスするためのサーキット情報を含むサービスアカウントをPipelineRunに割り当てます.

  • pipelineで定義されたワークスペースに永続ボリューム宣言、configmapを割り当てる
  • 検査結果



  • Tekton DashBoardでパイプラインの実行結果を表示できます
  • TriggerによるPipelineRunの自動作成

  • の前にPipeline Runを手動で作成してPipelineを実行します.
  • Tektonは、TriggerによってHTTPリクエストが発生したときにPipelineRunを自動的に生成することができる.
  • コードが
  • GitHub WebhookとTektonを介してハブにプッシュされた場合、パイプラインを自動的に実行するシステムを作成します.
  • コンポーネント


  • Trigger:転送されたイベントを検証し、割り当てロジックを実行し、Trigger TemplateとTrigger Bindingを
  • に接続します.
  • EventListener:JSON負荷を使用してHTTPベースのイベントを処理するKubernetesカスタムResource
  • Trigger Bindings:EventとTriggerを接続します.EventListenerに入力された情報を解析し、TriggerTemplateに転送します.
  • Triggerテンプレート:Resourceをテンプレート化します.パラメータを使用すると、Pipelineで定義されている既存のパラメータに新しい値を入れることができます.
  • 設定

    kubectl apply -f https://storage.googleapis.com/tekton-releases/triggers/previous/v0.14.2/release.yaml
    kubectl get pods -n tekton-pipelines
    
    NAME                                           READY   STATUS    RESTARTS   AGE
    tekton-dashboard-68b95c8fd5-mdl7q              1/1     Running   0          7h2m
    tekton-pipelines-controller-8695d55cc6-mrg4f   1/1     Running   0          7h3m
    tekton-pipelines-webhook-77bd94976b-4ghqj      1/1     Running   0          7h3m
    tekton-triggers-controller-5878b4dcdb-q4xjv    1/1     Running   0          2m53s
    tekton-triggers-webhook-5d5c4d948d-w4dzv       1/1     Running   0          2m53s
  • tektonが提供するyamlファイルに基づいて、アプリケーションコマンドはtekton-trigger-controller、tekton-trigger-webhookを生成します.
  • Trigger Binding

    apiVersion: triggers.tekton.dev/v1alpha1
    kind: TriggerBinding
    metadata:
      name: triggerbinding
    spec:
      params:
        - name: tag
          value: $(body.ref)
  • https://docs.github.com/en/developers/webhooks-and-events/webhooks/about-webhooks
  • 傘下のネットワークフックを使用すると、傘下のネットワークで特定のイベントが発生したときにPOSTリクエストを送信できます.
  • POST要求の本体にはgithubイベントに関する情報が含まれ、refにはタグ情報が含まれている.
  • Trigger Bindingを使用して、情報をparams値としてパイプラインに入れます.
  • Trigger Template

    apiVersion: triggers.tekton.dev/v1alpha1
    kind: TriggerTemplate
    metadata:
      name: triggertemplate
    spec:
      params:
        - name: tag
          description: git tag
          default: latest
      resourcetemplates:
        - apiVersion: tekton.dev/v1beta1
          kind: PipelineRun
          metadata:
            generateName: tekton-pipeline-run-
          spec:
            serviceAccountName: tekton-sa
            pipelineRef:
              name: tekton-pipeline
            params:
              - name: tag
                value: $(tt.params.tag)
            workspaces:
              - name: pipeline-shared-data
                persistentvolumeclaim:
                  claimName: task-pv-claim
    					- name: kubeconfig-dir
    						configMap:
    							name: k8s-kubeconfig
  • TriggerBindingパラメータを受信し、PipelineRunを実行します.
  • Pipelineの変更

    apiVersion: tekton.dev/v1beta1
    kind: Pipeline
    metadata:
      name: tekton-pipeline
    spec:
      workspaces:
        - name: pipeline-shared-data
        - name: kubeconfig-dir
      params:
        - name: tag
          type: string
          description: Docker image tag
      tasks:
        - name: clone-repository
          taskRef:
              kind: Task
              name: git-clone
          params:
            - name: url
              value: "https://github.com/sgwon96/devopsTest"
            - name: revision
              value: "main"
            - name: deleteExisting
              value: "true"
          workspaces:
            - name: output
              workspace: pipeline-shared-data
    
        - name: build-image
          taskRef:
              kind: Task
              name: jib-gradle
          runAfter:
            - clone-repository
          params:
            - name: IMAGE
              value: "zxcvb5434/devopstest:$(params.tag)"
          workspaces:
            - name: source
              workspace: pipeline-shared-data
    
        - name: kubectl-deploy
          taskRef:
              kind: Task
              name: kubectl-deploy
          runAfter:
            - build-image
          params:
            - name: TAG
              value: "$(params.tag)"
            - name: YAMLFILE
              value: "./k8s/deployment.yaml"
            - name: NAMESPACE
              value: "default"
          workspaces:
            - name: kubeconfig-dir
              workspace: kubeconfig-dir
            - name: manifest-dir
              workspace: pipeline-shared-data
  • 以前はPipelineでgithub commit sha値を画像タグ値に設定していたが、Trigger Templateがハブにネストされたタグ値を受信するようにParameterが定義されている.
  • Event Listener

    apiVersion: triggers.tekton.dev/v1alpha1
    kind: EventListener
    metadata:
      name: trigger-eventlistner
    spec:
      serviceAccountName: tekton-triggers-sa
      triggers:
        - bindings:
            - ref: triggerbinding
          template:
            ref: triggertemplate
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: tekton-triggers-sa
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: tekton-triggers-role
    rules:
    # EventListeners need to be able to fetch all namespaced resources
    - apiGroups: ["triggers.tekton.dev"]
      resources: ["eventlisteners", "triggerbindings", "triggertemplates", "triggers"]
      verbs: ["get", "list", "watch"]
    - apiGroups: [""]
     # secrets are only needed for GitHub/GitLab interceptors
     # configmaps is needed for updating logging config
      resources: ["configmaps", "secrets"]
      verbs: ["get", "list", "watch"]
     # Permissions to create resources in associated TriggerTemplates
    - apiGroups: ["tekton.dev"]
      resources: ["pipelineruns", "pipelineresources", "taskruns"]
      verbs: ["create"]
    - apiGroups: [""]
      resources: ["serviceaccounts"]
      verbs: ["impersonate"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: tekton-triggers-rolebinding
    subjects:
    - kind: ServiceAccount
      name: tekton-triggers-sa
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: tekton-triggers-role
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: tekton-triggers-clusterrole
    rules:
      # EventListeners need to be able to fetch any clustertriggerbindings
    - apiGroups: ["triggers.tekton.dev"]
      resources: ["clustertriggerbindings","clusterinterceptors"]
      verbs: ["get", "list", "watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: tekton-triggers-clusterbinding
    subjects:
    - kind: ServiceAccount
      name: tekton-triggers-sa
      namespace: default
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: tekton-triggers-clusterrole
  • Github Webhokイベントを受信するイベントリスナーとそのイベントリスナーがPipelineRunを作成できるようにサービスアカウントと権限を設定します.
  • k get pods
    NAME                                                  READY   STATUS      RESTARTS   AGE
    devops-spring-deployment-7b4c96f45c-fhzzt             1/1     Running     0          20m
    el-trigger-eventlistner-7fdcbfcb9-l9mqc               1/1     Running     0          52s
  • のクレーンはもともと導入によって露出するはずだったが、パイプラインの運行を示すためにport-forwardを用いて露出する.
  • kubectl port-forward pod/el-trigger-eventlistner-7fdcbfcb9-l9mqc 9098
  • ルータでポート転送設定を行う場合は、SpringアプリケーションをKubernetesに配備する記事を参照してください.
  • GitHub Webhookの登録


  • リポジトリの設定→Webhooks登録
  • から
  • ポート転送が有効な公認IPアドレスを使用してWeb Hook
  • を設定する.
  • ブランチの作成またはタグ付け時にWebフック
  • を実行する.
  • final 3 Tagをハブにプッシュすると、Webフック
  • が実行する.
  • イベントリスナーにPOST要求
  • を送信する.
  • イベントリスナーはGitHub WebhookのPOST要求を受け取りPipelineRun
  • を作成する

    イメージ交換成功
  • 最終バージョン
  • 整理する



    Tektonを使用して、
  • Kubernetsの内部にCI/CDを構築できます.
  • Git-clone、jib-build、kubectl-deployの3種類のTaskを実行するパイプラインが作成されました.
  • GitHub WebhookおよびEvent Listener Podを介してハブイベントを受信し、パイプラインを実行します.
  • GitHubでタグまたはブランチを作成すると、Githubはソースコードをダウンロードし、Jib、Docker Hubにイメージをアップロードし、Kubectlを使用してイメージを置き換えます.
  • Reference

  • https://gruuuuu.github.io/cloud/tekton-trigger/
  • https://tekton.dev/docs/triggers/eventlisteners/
  • https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads