• 【云原生 | Kubernetes 系列】--Gitops持续交付 Tekton Pipeline使用进阶(pvc和Results)


    Tekton Pipeline使用进阶

    1. 基于Maven项目构建

    主要实现source to package的过程

    包含2个Task: fetch-from-source和build
    使用pvc实现2个Task中的数据共享
    git-url用来指定git仓库的地址

    # cat 05-pipeline-source-to-package.yaml 
    apiVersion: tekton.dev/v1beta1
    kind: Pipeline
    metadata:
      name: source-2-package
    spec:
      params:
        - name: git-url
          type: string
      workspaces:
        - name: codebase
      tasks:
        - name: fetch-from-source
          params:
            - name: url
              value: $(params.git-url)
          taskSpec:
            workspaces:
              - name: source
            params:
              - name: url
            steps:
              - name: git-clone
                image: alpine/git:v2.36.1
                script: git clone -v $(params.url) $(workspaces.source.path)/source
          workspaces:
            - name: source
              workspace: codebase
        - name: build-package
          runAfter:
            - fetch-from-source
          taskSpec:
            steps:
              - name: build
                image: maven:3.8-openjdk-11-slim
                workingDir: $(workspaces.source.path)/source
                script: |
                  mvn clean install
            workspaces:
              - name: source
          workspaces:
            - name: source
              workspace: codebase
    ---
    apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      name: source-2-package-run-001
    spec:
      pipelineRef:
        name: source-2-package
      params:
        - name: git-url
          value: http://192.168.31.199/tekton/app01.git
      workspaces:
        - name: codebase
          volumeClaimTemplate:
            spec:
              accessModes:
                - ReadWriteOnce
              resources:
                requests:
                  storage: 1Gi
              storageClassName: nfs-csi
    
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    构建pipelinerun

    # kubectl apply -f 05-pipeline-source-to-package.yaml
    pipeline.tekton.dev/source-2-package created
    pipelinerun.tekton.dev/source-2-package-run-001 created
    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn pipeline ls |grep source-2-package
    source-2-package         37 seconds ago   source-2-package-run-001           37 seconds ago   ---        Running
    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn pipelinerun ls |grep source-2-package-run-001
    source-2-package-run-001           53 seconds ago   ---        Running
    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn pipelinerun logs source-2-package-run-001
    Pipeline still running ...
    略...
    [build-package : build] [INFO] ------------------------------------------------------------------------
    [build-package : build] [INFO] BUILD SUCCESS
    [build-package : build] [INFO] ------------------------------------------------------------------------
    [build-package : build] [INFO] Total time:  07:11 min
    [build-package : build] [INFO] Finished at: 2022-10-27T05:59:55Z
    [build-package : build] [INFO] ------------------------------------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    基于workspace赋值,无法实现pipelinerun之间的共享

    2. 基于Pipeline的存储卷共享

    在Task和Step上使用volume

    在Task上定义volumes,volumes上有1到多个pvc存储卷
    先在Task定义volume,再到step中引用
    在Task中定义相当于在Pod定义,在Step引用相当于在容器中引用
    使用的volumes需要事先自定义创建.

    Workspace: 生命周期同PipelineRun
    在同一个PipelineRun内部各TaskRun之间提供的存储空间;
    不支持跨PipelineRun共享

    Volumes: (在Task上定义,在Step中引用)生命周期独立于Pipeline
    生命周期独立于PipelineRun,定义本身是静态的,属于TaskRun
    基于同一个Pipeline的多个PipelineRun和TaskRun将共享使用volume

    结合上面这个示例,显然在maven这一步给他定义一个volumes,这样在不同的PipelineRun之间就能实现数据共享

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: maven-cache
    spec:
      storageClassName: nfs-csi
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: tekton.dev/v1beta1
    kind: Pipeline
    metadata:
      name: source-2-package
    spec:
      params:
        - name: git-url
          type: string
      workspaces:
        - name: codebase
      tasks:
        - name: fetch-from-source
          params:
            - name: url
              value: $(params.git-url)
          taskSpec:
            workspaces:
              - name: source
            params:
              - name: url
            steps:
              - name: git-clone
                image: alpine/git:v2.36.1
                script: git clone -v $(params.url) $(workspaces.source.path)/source
          workspaces:
            - name: source
              workspace: codebase
        - name: build-package
          runAfter:
            - fetch-from-source
          taskSpec:
            steps:
              - name: build
                image: maven:3.8-openjdk-11-slim
                workingDir: $(workspaces.source.path)/source
                volumeMounts:
                  - name: m2
                    mountPath: /root/.m2
                script: mvn clean install
            workspaces:
              - name: source
            volumes:
              - name: m2
                persistentVolumeClaim:
                  claimName: maven-cache
          workspaces:
            - name: source
              workspace: codebase
    ---
    apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      name: source-2-package-run-002
    spec:
      pipelineRef:
        name: source-2-package
      params:
        - name: git-url
          #value: https://gitee.com/mageedu/spring-boot-helloWorld.git
          value: http://code.gitlab.svc.cluster.local/root/spring-boot-helloWorld.git
      workspaces:
        - name: codebase
          volumeClaimTemplate:
            spec:
              accessModes:
                - ReadWriteOnce
              resources:
                requests:
                  storage: 1Gi
              storageClassName: nfs-csi
    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# cat 06-pipeline-source-to-package.yaml 
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: maven-cache
    spec:
      storageClassName: nfs-csi
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: tekton.dev/v1beta1
    kind: Pipeline
    metadata:
      name: source-2-package
    spec:
      params:
        - name: git-url
          type: string
      workspaces:
        - name: codebase
      tasks:
        - name: fetch-from-source
          params:
            - name: url
              value: $(params.git-url)
          taskSpec:
            workspaces:
              - name: source
            params:
              - name: url
            steps:
              - name: git-clone
                image: alpine/git:v2.36.1
                script: git clone -v $(params.url) $(workspaces.source.path)/source
          workspaces:
            - name: source
              workspace: codebase
        - name: build-package
          runAfter:
            - fetch-from-source
          taskSpec:
            steps:
              - name: build
                image: maven:3.8-openjdk-11-slim
                workingDir: $(workspaces.source.path)/source
                volumeMounts:
                  - name: m2
                    mountPath: /root/.m2
                script: mvn clean install
            workspaces:
              - name: source
            volumes:
              - name: m2
                persistentVolumeClaim:
                  claimName: maven-cache
          workspaces:
            - name: source
              workspace: codebase
    ---
    apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      name: source-2-package-run-002
    spec:
      pipelineRef:
        name: source-2-package
      params:
        - name: git-url
          value: https://gitee.com/mageedu/spring-boot-helloWorld.git
          #value: http://code.gitlab.svc.cluster.local/root/spring-boot-helloWorld.git
      workspaces:
        - name: codebase
          volumeClaimTemplate:
            spec:
              accessModes:
                - ReadWriteOnce
              resources:
                requests:
                  storage: 1Gi
              storageClassName: nfs-csi
    
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165

    部署

    # kubectl apply -f 06-pipeline-source-to-package.yaml 
    persistentvolumeclaim/maven-cache created
    pipeline.tekton.dev/source-2-package configured
    pipelinerun.tekton.dev/source-2-package-run-002 created
    
    • 1
    • 2
    • 3
    • 4

    此时创建pvc maven-cache 用于TaskRun及PipelineRun之间实现贡献

    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# kubectl get pvc
    NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    maven-cache      Bound    pvc-fc28e317-4c36-485f-8db0-493521af5984   5Gi        RWX            nfs-csi        18s
    [build-package : build] [INFO] Installing /workspace/source/source/pom.xml to /root/.m2/repository/com/neo/spring-boot-helloworld/0.9.6-SNAPSHOT/spring-boot-helloworld-0.9.6-SNAPSHOT.pom
    [build-package : build] [INFO] ------------------------------------------------------------------------
    [build-package : build] [INFO] BUILD SUCCESS
    [build-package : build] [INFO] ------------------------------------------------------------------------
    [build-package : build] [INFO] Total time:  08:04 min
    [build-package : build] [INFO] Finished at: 2022-10-27T07:21:24Z
    [build-package : build] [INFO] ------------------------------------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    经过漫长的等待后,整个过程花费了8分钟.

    请添加图片描述

    再次跑一个pipelinerun

    请添加图片描述

    第二次执行时间明显少于第一次,可以看到第一次build过程中那些下载在第二次build过程中没有再次下载,说明2次build使用的是同一个存储卷.即实现了跨pipelinerun的文件共享

    请添加图片描述

    [INFO] 
    [INFO] Results:
    [INFO] 
    [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
    [INFO] 
    [INFO] 
    [INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ spring-boot-helloworld ---
    [INFO] Building jar: /workspace/source/source/target/spring-boot-helloworld-0.9.6-SNAPSHOT.jar
    [INFO] 
    [INFO] --- spring-boot-maven-plugin:2.1.3.RELEASE:repackage (repackage) @ spring-boot-helloworld ---
    [INFO] Replacing main artifact with repackaged archive
    [INFO] 
    [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ spring-boot-helloworld ---
    [INFO] Installing /workspace/source/source/target/spring-boot-helloworld-0.9.6-SNAPSHOT.jar to /root/.m2/repository/com/neo/spring-boot-helloworld/0.9.6-SNAPSHOT/spring-boot-helloworld-0.9.6-SNAPSHOT.jar
    [INFO] Installing /workspace/source/source/pom.xml to /root/.m2/repository/com/neo/spring-boot-helloworld/0.9.6-SNAPSHOT/spring-boot-helloworld-0.9.6-SNAPSHOT.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  11.269 s
    [INFO] Finished at: 2022-10-31T06:31:08Z
    [INFO] ------------------------------------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3. Results使用

    Results是用来在Pipeline的Task之间使用同一个Workspace完成数据共享.若需要对简单的字符串数据进行传递,可以使用Results API完成

    Results可以用于Task及其Step进行结果的保存,并可以在同一个Pipeline中后续Task中调用结果.

    在Task中使用Results
    以列表形式定义在spec.results字段中
    Task将会为每个results条目自动创建一个文件以进行保存,这些文件放置在/tekton/results目录中
    每个results条目的相关值(value)需要在step中进行生成并保存,切task不会对相关数据进行任何多余的操作
    在step代码中引用results条目的便捷格式为"$(results..path)",这样就可以避免硬编码

    ​ $(params.): 引用参数值

    ( r e s u l t s . < r e s u l t n a m e > . p a t h ) : 保存 r e s u l t 的文件路径 , 通常是指 / t e k t o n / r e s u l t / < r e s u l t n a m e > ​若想获得文件内容​ s c r i p t : ∣ ​ C O N T E N T = (results..path):保存result的文件路径,通常是指/tekton/result/ ​ 若想获得文件内容 ​ script: | ​ CONTENT= (results.<resultname>.path):保存result的文件路径,通常是指/tekton/result/<resultname>若想获得文件内容script:∣​CONTENT=(cat /tekton/result/)

    在Pipeline中引用Results
    tasks..results.
    tasks..results[‘’]或tasks..results[“”]

    4. 测试Results调用

    # cat 07-results-demo.yaml
    apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
      name: generate-buildid
    spec:
      params:
        - name: version
          description: The version of the application
          type: string
          default: "Ehelp"
      results:
        - name: datetime
          description: The current date and time
        - name: buildId
          description: The build ID
      steps:
        - name: generate-datetime
          image: ikubernetes/admin-box:v1.2
          script: |
            #!/usr/bin/env bash
            datetime=`date +%Y%m%d-%H%M%S`		# 将日期写入datetime变量
            echo -n ${datetime} | tee $(results.datetime.path)  # 打印datetime变量
    								# 并将datetime的值写入/tekton/results 即$(results.datetime.path)
        - name: generate-buildid
          image: ikubernetes/admin-box:v1.2
          script: |
            #!/usr/bin/env bash
            buildDatetime=`cat $(results.datetime.path)` # 将/tekton/results/datetime文件内容写入buildDatetime
            buildId=$(params.version)-${buildDatetime}
            echo -n ${buildId} | tee $(results.buildId.path)
    
    
    • 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
    • 32

    部署task

    # kubectl apply -f 07-results-demo.yaml 
    task.tekton.dev/generate-buildid created
    
    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn task ls
    NAME               DESCRIPTION   AGE
    generate-buildid                 50 seconds ago
    hello                            1 week ago
    hello-params                     6 days ago
    logger                           6 days ago
    multiple                         6 days ago
    script                           6 days ago
    source-lister                    5 days ago
    workspace-demo                   5 days ago
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行taskrun

    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn task start generate-buildid
    ? Value for param `version` of type `string`? (Default is `Ehelp`) Ehelp
    TaskRun started: generate-buildid-run-zm572
    
    In order to track the TaskRun progress run:
    tkn taskrun logs generate-buildid-run-zm572 -f -n default
    
    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# kubectl get pods
    NAME                                             READY   STATUS      RESTARTS   AGE
    generate-buildid-run-zm572-pod                   0/2     Completed   0          30s
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果

    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn taskrun describe generate-buildid-run-zm572
    Name:              generate-buildid-run-zm572
    Namespace:         default
    Task Ref:          generate-buildid
    Service Account:   default
    Timeout:           1h0m0s
    Labels:
     app.kubernetes.io/managed-by=tekton-pipelines
     tekton.dev/task=generate-buildid
    
    🌡️  Status
    
    STARTED        DURATION    STATUS
    1 minute ago   20s         Succeeded
    
    ⚓ Params
    
     NAME        VALUE
     ∙ version   Ehelp
    
    📝 Results
    
     NAME         VALUE
     ∙ datetime   20221031-054717
     ∙ buildId    Ehelp-20221031-054717
    
    🦶 Steps
    
     NAME                  STATUS
     ∙ generate-datetime   Completed
     ∙ generate-buildid    Completed
    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn taskrun logs generate-buildid-run-zm572
    [generate-datetime] 20221031-054717
    
    [generate-buildid] Ehelp-20221031-054717
    
    • 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
    • 32
    • 33
    • 34
    • 35

    $(results.datetime.path)即是/tekton/results/datetime

    root@k8s-master-01:/apps/tekton-and-argocd-in-practise/03-tekton-advanced# tkn taskrun logs generate-buildid-run-sgx8b
    [generate-datetime] 20221031-062401ls /tekton/
    [generate-datetime] total 24
    [generate-datetime] drwxrwxrwx    2 root     root          4096 Oct 31 06:23 bin
    [generate-datetime] drwxrwxrwt    2 root     root            40 Oct 31 06:23 creds
    [generate-datetime] drwxrwxrwt    3 root     root           100 Oct 31 06:24 downward
    [generate-datetime] drwxrwxrwx    2 root     root          4096 Oct 31 06:23 home
    [generate-datetime] drwxrwxrwx    2 root     root          4096 Oct 31 06:24 results
    [generate-datetime] drwxr-xr-x    4 root     root          4096 Oct 31 06:24 run
    [generate-datetime] drwxrwxrwx    2 root     root          4096 Oct 31 06:23 scripts
    [generate-datetime] drwxrwxrwx    2 root     root          4096 Oct 31 06:23 steps
    [generate-datetime] -rw-rw-rw-    1 root     root             0 Oct 31 06:23 termination
    [generate-datetime] ls /tekton/results
    [generate-datetime] total 4
    [generate-datetime] -rw-r--r--    1 root     root            15 Oct 31 06:24 datetime
    
    [generate-buildid] Ehelp-20221031-062401
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    方差和标准差哪些事儿
    为什么说区块链的性能难以衡量?
    CSDN博客去水印方法
    MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度
    Nginx安装与常见命令
    输入输出及中断技术——微机第六章学习笔记
    性能测试-CPU性能分析,IO密集导致系统负载高
    云原生周刊:KubeSphere 宣布开源 Thanos 的企业级发行版 Whizard
    LeetCode 第7题:整数反转(Python3解法)
    新华三学习记录
  • 原文地址:https://blog.csdn.net/qq_29974229/article/details/127615406