返回顶部
首页 > 资讯 > 精选 >kubernetes原生pipeline的示例分析
  • 765
分享到

kubernetes原生pipeline的示例分析

2023-06-05 22:06:55 765人浏览 八月长安
摘要

kubernetes原生pipeline的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Tekton Pipeline,是一个k8s native的pipeline,

kubernetes原生pipeline的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Tekton Pipeline,是一个k8s native的pipeline, 任务跑在pod中,通过自定义CRD去管理任务与工作流等等,我看完tekton之后感觉是功能很强大,但是有点过度设计了,没有drone的简约大方灵活之感。

Task

Tekton Pipelines的主要目标是单独运行您的任务或作为管道的一部分运行。每个任务都在Kubernetes集群上作为Pod运行,每个步骤都作为自己的容器。这点深得drone思想精髓,其实drone也有计划将kubernetes作为任务执行引擎,只是没有下文了。

A Task定义了需要执行的工作,例如以下是一个简单的任务:

apiVersion: tekton.dev/v1alpha1kind: Taskmetadata:  name: echo-hello-worldspec:  steps:    - name: echo      image: ubuntu      command:        - echo      args:        - "hello world"

这steps是一系列由任务顺序执行的命令。这个steps内的配置几乎与drone如出一辙,Task定义好并没有被执行,创建TaskRun时才会执行。这是合理的,相当于是一个触发

apiVersion: tekton.dev/v1alpha1kind: TaskRunmetadata:  name: echo-hello-world-task-runspec:  taskRef:    name: echo-hello-world  trigger:    type: manualkubectl apply -f < name-of-file.yaml >

查看TaskRun kubectl get taskruns / echo-hello-world-task-run -o yaml

apiVersion: tekton.dev/v1alpha1kind: TaskRunmetadata:  creationTimestamp: 2018-12-11T15:49:13Z  generation: 1  name: echo-hello-world-task-run  namespace: default  resourceVersion: "6706789"  selflink: /apis/tekton.dev/v1alpha1/namespaces/default/taskruns/echo-hello-world-task-run  uid: 4e96e9c6-fd5c-11e8-9129-42010a8a0fdcspec:  generation: 1  inputs: {}  outputs: {}  taskRef:    name: echo-hello-world  taskSpec: null  trigger:    type: manualstatus:  conditions:    - lastTransitionTime: 2018-12-11T15:50:09Z      status: "True"      type: Succeeded  podName: echo-hello-world-task-run-pod-85ca51  startTime: 2018-12-11T15:49:39Z  steps:    - terminated:        containerID: Docker://fcfe4a004...6729d6d2ad53faff41        exitCode: 0        finishedAt: 2018-12-11T15:50:01Z        reason: Completed        startedAt: 2018-12-11T15:50:01Z    - terminated:        containerID: docker://fe86fc5f7...eb429697b44ce4a5b        exitCode: 0        finishedAt: 2018-12-11T15:50:02Z        reason: Completed        startedAt: 2018-12-11T15:50:02Z

状态Succeeded = True显示任务已成功运行。

任务输入和输出

在更常见的场景中,任务需要多个步骤来处理输入和输出资源。例如,Task可以从GitHub存储库获取源代码并从中构建Docker镜像。

PipelinesResources用于定义任务的输入(如代码)与输出(如Docker镜像)。有一些系统定义的资源类型可供使用,以下是通常需要的两个资源示例。

git资源可以是你要编译的代码:

apiVersion: tekton.dev/v1alpha1kind: PipelineResourcemetadata:  name: skaffold-gitspec:  type: git  params:    - name: revision      value: master    - name: url      value: https://github.com/GoogleContainerTools/skaffold

该image资源代表要被任务编译成的镜像:

apiVersion: tekton.dev/v1alpha1kind: PipelineResourcemetadata:  name: skaffold-image-leeroy-WEBspec:  type: image  params:    - name: url      value: GCr.io//leeroy-web

以下是Task输入和输出。输入资源是GitHub存储库,输出是从该源生成的图像。任务命令的参数支持模板化,因此任务的定义是常量,参数的值可以在运行时更改。

apiVersion: tekton.dev/v1alpha1kind: Taskmetadata:  name: build-docker-image-from-git-sourcespec:  inputs:    resources:      - name: docker-source        type: git    params:      - name: pathToDockerFile       # 这些参数都是可以自定义的        description: The path to the dockerfile to build        default: /workspace/docker-source/Dockerfile      - name: pathToContext        description:          The build context used by Kaniko          (Https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts)        default: /workspace/docker-source  outputs:    resources:      - name: builtImage        type: image  steps:    - name: build-and-push      image: gcr.io/kaniko-project/executor  # 特定功能的镜像,可以用来docker build      command:        - /kaniko/executor      args:        - --dockerfile=${inputs.params.pathToDockerFile}   # 这时原pathToDockerFile就是上面定义的参数        - --destination=${outputs.resources.builtImage.url}        - --context=${inputs.params.pathToContext}

TaskRun将输入和输出绑定到已定义的PipelineResources值,除了执行任务步骤外,还将值设置为用于模板化的参数。

apiVersion: tekton.dev/v1alpha1kind: TaskRunmetadata:  name: build-docker-image-from-git-source-task-runspec:  taskRef:    name: build-docker-image-from-git-source  trigger:    type: manual  inputs:    resources:      - name: docker-source        resourceRef:          name: skaffold-git    params:                       # 执行时把参数传给Task,这样就不需要重复定义task,只需要增加input output 和taskrun 就可以跑一个别的工程, 从解耦这个角度到说比drone更好,任务流程可以复用      - name: pathToDockerFile        value: Dockerfile      - name: pathToContext        value: /workspace/docker-source/examples/microservices/leeroy-web #configure: may change according to your source  outputs:    resources:      - name: builtImage        resourceRef:          name: skaffold-image-leeroy-web  # 这也是上面指定的资源

PS: inputs outputs应当不限制死必须叫这两个名字,只要是能支持参数就好。比如定义一个叫build的资源去指定docker build的镜像:

apiVersion: tekton.dev/v1alpha1kind: PipelineResourcemetadata:  name: skaffold-image-leeroy-webspec:  type: image  params:    - name: url      value: docker-in-docker:latest

Task 里:

apiVersion: tekton.dev/v1alpha1kind: Taskmetadata:  name: build-docker-image-from-git-sourcespec:  build:     resources:     - name: build       type: image  params:  - name: build-image    default: docker-in-docker:latest  steps:      - name: build-and-push      image: ${build.params.build-image}

我是觉得需要能进行这样的扩展了, 仅是inputs outputs就狭义了

获取pipeline全部信息 kubectl get build-pipeline

NAME                                                   AGEtaskruns/build-docker-image-from-git-source-task-run   30sNAME                                          AGEpipelineresources/skaffold-git                6mpipelineresources/skaffold-image-leeroy-web   7mNAME                                       AGEtasks/build-docker-image-from-git-source   7m

要查看TaskRun的输出,请使用以下命令:

kubectl get taskruns / build-docker-image-from-git-source-task-run -o yaml
apiVersion: tekton.dev/v1alpha1kind: TaskRunmetadata:  creationTimestamp: 2018-12-11T18:14:29Z  generation: 1  name: build-docker-image-from-git-source-task-run  namespace: default  resourceVersion: "6733537"  selfLink: /apis/tekton.dev/v1alpha1/namespaces/default/taskruns/build-docker-image-from-git-source-task-run  uid: 99d297fd-fd70-11e8-9129-42010a8a0fdcspec:  generation: 1  inputs:    params:      - name: pathToDockerFile        value: Dockerfile      - name: pathToContext        value: /workspace/git-source/examples/microservices/leeroy-web #configure: may change depending on your source    resources:      - name: git-source        paths: null        resourceRef:          name: skaffold-git  outputs:    resources:      - name: builtImage        paths: null        resourceRef:          name: skaffold-image-leeroy-web  taskRef:    name: build-docker-image-from-git-source  taskSpec: null  trigger:    type: manualstatus:  conditions:    - lastTransitionTime: 2018-12-11T18:15:09Z      status: "True"      type: Succeeded  podName: build-docker-image-from-git-source-task-run-pod-24d414  startTime: 2018-12-11T18:14:29Z  steps:    - terminated:        containerID: docker://138ce30c722eed....c830c9d9005a0542        exitCode: 0        finishedAt: 2018-12-11T18:14:47Z        reason: Completed        startedAt: 2018-12-11T18:14:47Z    - terminated:        containerID: docker://4a75136c029fb1....4c94b348d4f67744        exitCode: 0        finishedAt: 2018-12-11T18:14:48Z        reason: Completed        startedAt: 2018-12-11T18:14:48Z

类型的状态Succeeded = True显示Task已成功运行,您还可以验证Docker镜像是否生成。

Pipeline

Pipeline定义要按顺序执行的任务列表,同时还通过使用该from字段指示是否应将任何输出用作后续任务的输入,并指示执行的顺序(使用runAfter和from字段)。您在任务中使用的相同模板也可以在管道中使用。

apiVersion: tekton.dev/v1alpha1kind: Pipelinemetadata:  name: tutorial-pipelinespec:  resources:    - name: source-repo      type: git    - name: web-image      type: image  tasks:    - name: build-skaffold-web # 编译与打镜像任务,上面已经介绍过      taskRef:        name: build-docker-image-from-git-source      params:        - name: pathToDockerFile          value: Dockerfile        - name: pathToContext          value: /workspace/examples/microservices/leeroy-web #configure: may change according to your source      resources:        inputs:          - name: workspace            resource: source-repo        outputs:          - name: image            resource: web-image    - name: deploy-web          # 部署      taskRef:        name: deploy-using-kubectl # 这里引入了一个通过k8s部署的Task,我们在下文看它是什么      resources:        inputs:                    # 定义输入,这里的输入其实是上个任务的输出          - name: workspace            resource: source-repo          - name: image            # 比如这个镜像,就是上个任务产生的            resource: web-image            from:                  # from就如同管道一样,把上个任务的输出作为这个任务的输入              - build-skaffold-web      params:                      # 留意这些参数都是传给Task模板的,覆盖inputs里的参数        - name: path          value: /workspace/examples/microservices/leeroy-web/kubernetes/deployment.yaml #configure: may change according to your source        - name: yqArg          value: "-d1"        - name: yamlPathToImage          value: "spec.template.spec.containers[0].image"

以上Pipeline是引用一个Task被叫的deploy-using-kubectl:

apiVersion: tekton.dev/v1alpha1kind: Taskmetadata:  name: deploy-using-kubectlspec:  inputs:    resources:      - name: workspace        type: git      - name: image        type: image    params:      - name: path        description: Path to the manifest to apply      - name: yqArg        description:          Okay this is a hack, but I didn't feel right hard-coding `-d1` down          below      - name: yamlPathToImage        description:          The path to the image to replace in the yaml manifest (arg to yq)  steps:    - name: replace-image  # 第一步替换镜像      image: mikefarah/yq  # 特定功能的镜像,和drone同理,这里主要就是个模板渲染      command: ["yq"]      args:        - "w"        - "-i"        - "${inputs.params.yqArg}"        - "${inputs.params.path}"        - "${inputs.params.yamlPathToImage}"        - "${inputs.resources.image.url}"    - name: run-kubectl                 # 第二步执行kubectl      image: lachlanevenson/k8s-kubectl      command: ["kubectl"]      args:        - "apply"        - "-f"        - "${inputs.params.path}"   # 这就是yaml文件的位置

要运行Pipeline,请创建PipelineRun如下:

apiVersion: tekton.dev/v1alpha1kind: PipelineRunmetadata:  name: tutorial-pipeline-run-1spec:  pipelineRef:    name: tutorial-pipeline  trigger:    type: manual  resources:    - name: source-repo      resourceRef:        name: skaffold-git    - name: web-image      resourceRef:        name: skaffold-image-leeroy-web

执行与查看pipeline

kubectl apply -f < name-of-file.yaml > kubectl获取pipelineruns / tutorial-pipeline-run-1 -o yaml

总结

初学者会觉得有点绕,但是这种设计也是为了解耦合,我个人觉得优劣如下:

优势

可以把k8s集群作为任务执行引擎,这样可以更好的利用资源,比如把线上夜间闲置资源用来跑任务,构建镜像 离线分析 甚至机器学习。解耦做的比较好,任务模板可以拿来复用,而不需要大家都去重复定义,输入输出理念,一个任务的输入作为另个任务的输出不错。

劣势

有点过度设计,一些简单的场景可能觉得配置起来有点绕了,输入输出依赖分布式系统,对比drone一个pipeline中的容器是共享了一个数据卷的,这样上个任务产生的文件很方便的给下个任务用,而基于集群的任务就可能得依赖git docker镜像仓库等做输入输出,有点麻烦,好的解决办法是利用k8s分布试存储给pipeline设置一个共享卷,方便任务间传输数据;总体来说路子是对的而且还是有很多场景可以用的。

看完上述内容,你们掌握kubernetes原生pipeline的示例分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: kubernetes原生pipeline的示例分析

本文链接: https://lsjlt.com/news/244693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • kubernetes原生pipeline的示例分析
    kubernetes原生pipeline的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Tekton Pipeline,是一个k8s native的pipeline, ...
    99+
    2023-06-05
  • kubernetes中云原生的示例分析
    这篇文章主要为大家展示了“kubernetes中云原生的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes中云原生的示例分析”这篇文章吧。一: 云原生云原生包含了一组应用...
    99+
    2023-06-04
  • kubernetes中网络原理的示例分析
    小编给大家分享一下kubernetes中网络原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:体系结构图二:说明1.网络命名空间处于不同命名空间的网...
    99+
    2023-06-04
  • Kubernetes架构的示例分析
    这篇文章主要介绍Kubernetes架构的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先,为什么要用Kubernetes 使用一个工具先要梳理下使用这个工具的目标,我们不是为了工具而用工具。Kuberne...
    99+
    2023-06-19
  • kubernetes中Service的示例分析
    这篇文章主要介绍了kubernetes中Service的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:体系结构图二:yaml举例apiVersion: v1kin...
    99+
    2023-06-04
  • kubernetes概述的示例分析
    这篇文章主要为大家展示了“kubernetes概述的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes概述的示例分析”这篇文章吧。一:kubernetes集群的架构一个k...
    99+
    2023-06-04
  • kubernetes中Istio的示例分析
    这篇文章主要介绍kubernetes中Istio的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一:简介随着微服务架构的普及,越来越多的应用已经拆分成了微服务的架构。而微服务架构落地的一个难点,就是如何让服务...
    99+
    2023-06-04
  • 原生ajax瀑布流的示例分析
    这篇文章主要介绍了原生ajax瀑布流的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。其中img文件夹中放入图片 1.jpg;2.jp...
    99+
    2024-04-02
  • React原生APP更新的示例分析
    这篇文章主要介绍了React原生APP更新的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。App更新流程在 App 打开时请求接口或文件, 获取远程版本/版本更新说明...
    99+
    2023-06-15
  • Kubernetes资源类型的示例分析
    这篇文章给大家分享的是有关Kubernetes资源类型的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Kubernetes是一个开源的容器管理平台,用于部署和管理容器化的...
    99+
    2024-04-02
  • Kubernetes-dashboard+Heapster+InfluxDB+Grafana的示例分析
    这篇文章将为大家详细讲解有关Kubernetes-dashboard+Heapster+InfluxDB+Grafana的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:前言1.kubernet...
    99+
    2023-06-04
  • 原生js中ajax访问的示例分析
    这篇文章主要介绍原生js中ajax访问的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!原生js中ajax访问的实例详解form表单中 登录名: 失去光标即触发事件functi...
    99+
    2024-04-02
  • Kubernetes Informer的示例分析是怎样的
    Kubernetes Informer的示例分析是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。熟悉Kubernetes的小伙伴们想必会有一窥源码的动机,领略大师的设...
    99+
    2023-06-19
  • kubernetes中Service Account与Secret的示例分析
    这篇文章主要介绍kubernetes中Service Account与Secret的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一:Service Account与Secret数据结构二:Service A...
    99+
    2023-06-04
  • kubernetes中网络模型的示例分析
    这篇文章主要介绍kubernetes中网络模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Kubernetes从Docker默认的网络模型中独立出来形成一套自己的网络模型。模型的基础原则是:每个Pod都拥...
    99+
    2023-06-04
  • 原生js实现放大镜的示例分析
    这篇文章主要介绍原生js实现放大镜的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!原理:左边阴影在左边图片上从左到右移动的时候,右边大框也在右边大图片上从左到右移动(尽管在视...
    99+
    2024-04-02
  • react native原生模块桥接的示例分析
    这篇文章主要介绍react native原生模块桥接的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android创建原生模块包通过继承 ReactPackage 为你的原生...
    99+
    2024-04-02
  • spring-mybatis与原生mybatis使用的示例分析
    小编给大家分享一下spring-mybatis与原生mybatis使用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!原生mybatis使用方法:String resource = &...
    99+
    2023-05-30
    spring mybatis
  • Html5中原生拖拽操作的示例分析
    这篇文章给大家分享的是有关Html5中原生拖拽操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近的一次项目开发中用到了H5的拖拽功能,由于现有项目使用的是VUE全家桶,使用了vuedragable这...
    99+
    2023-06-09
  • JPA原生SQL分页查询逻辑的示例分析
    这篇文章将为大家详细讲解有关JPA原生SQL分页查询逻辑的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JPA原生SQL(自定义SQL)分页查询JPA自己写SQL查询的话,分页还稍微麻烦经过测试下...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作